Fluentd (td-agent) のバージョンアップ [td-agent2 から td-agent3 へバージョンアップ]
この記事では実運用環境で使用している td-agent2 を td-agent3 にバージョンアップする手順を解説します。実際にかなり多くの変更が行われているシステム(秒間数百件程度の変更が行われている)において、td-agent2 より td-agent3 の方が格段に動作が早いです。td-agent2 でのパフォーマンス問題
td-agent2 を使って本番システムでのログファイルをデータベースに転送するシステムを構築しましたが、何故かデータの反映がとてつもなく遅いことが分かり、Fluentd 公式サイトで設定を1つ1つ見ながら原因を探ってきました。またシステムの負荷状態やメモリー使用量にも問題なく、では設定に問題があるのでは?ということで td-agent.conf の設定をとことん確認しました。td-agent3 へのバージョンアップ決断
しかし設定には全く問題ないことが分かり、ではどうするか思案した結果 Fluentd 最新版である td-agent3 にバージョンアップすることにしました。最新版だけに様々な点で改良が実装されているということで、以下の記事を読んだ上でバージョンアップすることにしました。td-agent v2 vs. td-agent v3
大きな変更点は次の通りです。
- Ruby 2.4 で動作する
- Fluentd v0.14/v1.0 にバージョンアップされた
- コア・ライブラリの更新や msgpack, Cool.io, 等など
- Windows がサポートされた
- 古いパッケージやあまり使われないプラグインの削除
td-agent2 から td-agent3 へのバージョンアップ
ここでは CentOS にて td-agent2 から td-agent3 にバージョンアップした際の記録を記載します。td-agent2 を停止する
まず作業前に td-agent2 で使用している td-agent.conf ファイルを念のために別の場所にコピーしておきましょう。また td-agent2 を停止させる前に、td-agent2 の設定に以下の flush_at_shutdown 設定が入っていることを確認します。もし入っていなければ追加しましょう。
td-agent2 と td-agent3 の間では、file バッファの処理の仕方が異なる可能性があり、互換性がないかもしれない(公式にはそのような記載は見当たらなかった)ので、td-agent2 終了前にバッファを全て吐き出しておく必要があるでしょう。
flush_at_shutdown trueflush_at_shutdown 設定を true にしておくことにより、td-agent2 を停止する時にバッファに溜まった情報を全て吐き出してくれます。設定を入れたら reload します。
# /etc/init.d/td-agent reload次に以下のようにして tdagent2 のプロセスを終了させます。
# /etc/init.d/td-agent stop
td-agent3 のインストール・スクリプトをインストール
公式サイトに書いてある通り、以下のようにして td-agent3 をインストールします。$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
起動スクリプトの変更 (必要に応じて)
td-agent3 をインストールすると、td-agent2 でインストールされた起動スクリプトが上書きされてしまいます。もし td-agent で root ユーザーしかアクセスできないファイルなどを監視したい場合には、/etc/init.d/td-agent という起動スクリプトの以下の部分を書き換えます。
(変更前) TD_AGENT_USER=td-agent TD_AGENT_GROUP=td-agent (変更後) TD_AGENT_USER=root TD_AGENT_GROUP=root
td-agent2 でインストールしていたプラグインをインストール
td-agent2 でインストールしたプラグインは、td-agent3 で再度インストールする必要があります。私は PostgreSQL データベースに接続するためのプラグインをインストールしていたので、次のようにしてインストールします。# td-agent-gem install fluent-plugin-postgres
td-agent3 で変更されたパラメータの調整
td-agent3 ではバッファ関連のパラメータが大幅に変更されています。その為 td-agent2 で使っていたバッファ設定を変更しなければなりません。そのまま実行しようとするとエラーになります。以下は td-agent3 の設定例です。私のシステムではデータ消失が絶対に許されないので、バッファは可能な限り大きくしています。
<match foo.bar>
@type stdout
<buffer>
@type file
path /var/log/td-agent/foo.*.buffer
# Buffering parameters
chunk_limit_size 256MB
total_limit_size 64GB
# Flushing parameters
flush_at_shutdown true
flush_mode immediate
#flush_interval 1s
flush_thread_count 50
flush_thread_interval 1.0
flush_thread_burst_interval 1.0
delayed_commit_timeout 5
overflow_action block
# Retries parameters
#retry_timeout 240h
retry_forever true
retry_max_times none
retry_secondary_threshold 0.5
</buffer>
num_threads 100
</match>
td-agent.conf 設定の確認
設定ファイルを td-agent3 用に書き換えたら以下のコマンドを実行して設定ファイルの確認を実施しておきましょう。# /etc/init.d/td-agent configtest
# td-agent --dry-run -c /etc/td-agent/td-agent.conf
td-agent3 を実行
ここまでで td-agent3 へのバージョンアップ作業は完了しました。あとは以下のコマンドを実行して td-agent3 を実行するだけです。# /etc/init.d/td-agent start