Fluentd (td-agent) のバージョンアップ [td-agent2 から td-agent3 へバージョンアップ]

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 true
flush_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
念には念を入れて、以下のように --dry-run モード(実際に処理は実行されないモード)で設定を確認しておきます。

# td-agent --dry-run -c /etc/td-agent/td-agent.conf

td-agent3 を実行

ここまでで td-agent3 へのバージョンアップ作業は完了しました。あとは以下のコマンドを実行して td-agent3 を実行するだけです。


# /etc/init.d/td-agent start

td-agent3 へバージョンアップ後のパフォーマンス

ということで td-agent3 を稼働させ始めました。その後の経過を見ていると CPU 使用率がかなり上昇しました。td-agent2 では平均 CPU 使用率が 10% 未満でしたが、td-agent3 にしてからは平均 CPU 使用率が 20% 程度になっています。

しかし td-agent3 のパフォーマンスは格段に良いです!td-agent2 では処理がもたついていてリアルタイムにデータを反映できなかったのですが、td-agent3 では常にリアルタイムにデータを同期できるようになりました。

結果論ですが、td-agent3 にバージョンアップする価値は大いにあります。