td-agent に fluent-plugin-mysql を yum でインストールできるように、gem から rpm を作って yum リポジトリにしてみました。
- for CentOS 7.2.1511
手順
必要そうなパッケージをインストールします。
sudo yum -y install yum-utils createrepo rpm-build gcc make mysql-devel ruby rubygems ruby-devel
sudo gem install fpm
td-agent をインストールします。
curl -fsSL https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
td-agent の rpm をダウンロードします。
yumdownloader --enablerepo=treasuredata --destdir=td-agent/rpm td-agent
fpm コマンドを使って td-agent の rpm と同じディレクトリに gem から rpm を作ります。
cd td-agent/rpm
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent mysql2
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent mysql2-cs-bind
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent --gem-disable-dependency=multi_json jsonpath
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent --gem-disable-dependency=fluentd fluent-plugin-mysql
もとのディレクトリに戻って createrepo で yum リポジトリを作成します。
cd -
createrepo td-agent/
インストールしてみる
↑で作成した yum リポジトリには td-agent も含んでいるので、既にインストールしているなら一旦削除します。
sudo yum erase td-agent
treasuredata のリポジトリも無効にしておきます。
sudo mv /etc/yum.repos.d/td.repo{,.bak}
ローカルのディレクトリを参照する yum リポジトリの設定ファイルを作ります。
sudo tee /etc/yum.repos.d/td-agent-local.repo <<EOS
[td-agent-local]
name = td-agent-local
baseurl = file://$PWD/td-agent
gpgcheck = 0
EOS
repolist でリポジトリが有効になっていることを確認します。
sudo yum repolist
yum で td-agent と fluent-plugin-mysql をインストールします。
sudo yum install td-agent td-agent-fluent-plugin-mysql
使ってみる
うまいことインストールされていることを確かめるために、試しに使ってみます。
MariaDB をインストールして適当なテーブルを作ります。
sudo yum install mariadb-server
sudo systemctl start mariadb.service
mysql test <<'EOS'
create table logs (
id int not null primary key auto_increment,
log_date datetime not null,
message text not null
);
EOS
td-agent の設定ファイルを作って td-agent を開始します。
sudo tee /etc/td-agent/td-agent.conf <<'EOS'
<source>
@type tail
path /var/log/oreore.log
pos_file /var/log/td-agent/oreore.log.pos
format ltsv
tag oreore.log
</source>
<match oreore.log>
@type mysql_bulk
host localhost
database test
username test
column_names log_date,message
key_names ${time},message
table logs
flush_interval 10s
</match>
EOS
sudo systemctl start td-agent.service
ログを書きます。
echo "message:ore" | sudo tee -a /var/log/oreore.log
echo "message:are" | sudo tee -a /var/log/oreore.log
echo "message:sore" | sudo tee -a /var/log/oreore.log
echo "message:dore" | sudo tee -a /var/log/oreore.log
echo "message:hore" | sudo tee -a /var/log/oreore.log
DB に書き込まれているか見てみます。
mysql test -e 'select * from logs'
次のように書き込まれていました。
+----+---------------------+---------+
| id | log_date | message |
+----+---------------------+---------+
| 1 | 2016-10-04 13:33:32 | ore |
| 2 | 2016-10-04 13:33:32 | are |
| 3 | 2016-10-04 13:33:32 | sore |
| 4 | 2016-10-04 13:33:32 | dore |
| 5 | 2016-10-04 13:33:32 | hore |
+----+---------------------+---------+
fpm について
手順の途中で fpm で下記のように gem から rpm を作成していますが・・・
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent mysql2
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent mysql2-cs-bind
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent --gem-disable-dependency=multi_json jsonpath
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
--depends=td-agent --gem-disable-dependency=fluentd fluent-plugin-mysql
-s gem -t rpm
は gem から rpm を作るという意味です。
--gem-package-name-prefix=td-agent
は rpm の名前のプレフィックスを td-agent にするという意味です。例えば fluent-plugin-mysql という gem であれば td-agent-fluent-plugin-mysql という rpm になります。デフォルトは rubygems かなにかだったと思うんですけど、td-agent の embedd ではないシステムデフォルトの ruby と紛らわしそうなのでプレフィックを td-agent に変更しています。
--gem-gem=td-agent-gem
は gem コマンドに td-agent-gem を使うという意味です。デフォルトだと gem なのででシステムにインストールされている gem が使われます。td-agent-gem が使われるように指定しています。
--depends=td-agent
は rpm の依存関係に td-agent を追加します。
--gem-disable-dependency=multi_json
と --gem-disable-dependency=fluentd
は、gem の依存からこれらを省きます。gem の依存を元に rpm の依存が自動で追加されるため、これを指定しておかないと td-agent-multi_json
とか td-agent-fluentd
とかに依存するようになります。これらの gem は td-agent にバンドルされているので、td-agent を依存に追加しているならこれらの依存は不要です。
さいごに
オフラインで fluent-plugin-mysql をインストールできるように rpm にしてみましたが、よく考えれば下記のように gem をダウンロードしておくだけでも良かったでした。
td-agent-gem fetch mysql2
td-agent-gem fetch mysql2-cs-bind
td-agent-gem fetch jsonpath
td-agent-gem fetch fluent-plugin-mysql
mysql2 が native extension なのでインストール時に gcc とかのビルド環境は必要ですが。