ちょっと話題の記事

Vagrant を使って fluentd のクラスタリングを試す

2013.06.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Vagrant を使って、fluentd のクラスタリング(負荷分散とHA構成)を試してみました。
イメージはこんな感じ。

fluentd-cluster-ha

ログ受信側(log aggregators)のセットアップ

※Vagrant をインストールしてない場合は、別途インストールしてください。
2台のサーバを順番にセットアップします。
先ずは、1台目。

$ mkdir -p vagrant/server1 && cd vagrant/server1
$ vagrant box add server1 https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
$ vagrant init server1

Vagrantfile を以下のように編集します。

$ vim Vagrantfile
config.vm.box = "server1"
config.vm.network :hostonly, "192.168.33.10"

Vagrant を起動して ssh 。

$ vagrant up
$ vagrant ssh

検証用なので iptablesを無効にしておきます。

$ sudo /etc/init.d/iptables stop

タイムゾーンを JST に設定。

$ cp -p /usr/share/zoneinfo/Japan /etc/localtime

td-agent のインストール

$ sudo vi /etc/yum.repos.d/td.repo
[tresuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
$ sudo yum install -y td-agent

続いて、server2 の設定です。
1台目と同じように起動して、Vagrantfile を以下にします。

$ vim vagrant/server2/Vagrantfile
config.vm.box = "server2"
config.vm.network :hostonly, "192.168.33.11"

両方とも設定が終わったら、ともに td-agent の ログを tail しておきます。

$ tail -f /var/log/td-agent/td-agent.log

ログ送信側(log forwarders)のセットアップ

localhost に fluentd をインストールします。

$ gem install fluentd --no-ri --no-rdoc
$ fluentd --setup ./fluent
Installed ./fluent/fluent.conf.

負荷分散を試す

fluent.conf の <match debug.**> 〜 </match> の部分を以下のように指定します。

$ vim fluent/fluent.conf
<match debug.**>
  type forward
  retry_limit 9
  <server>
    name server1
    host 192.168.33.10
    port 24224
    weight 60      
  </server>
  <server>
    name server2
    host 192.168.33.11
    port 24224
    weight 60  
  </server>
  <secondary>
    type file
    path /path/to/forward-failed
  </secondary>
  flush_interval 60s
</match>

weight は重み付けで、retry_limit はログの受信側に転送するリトライ回数です。
この回数を超えた場合、secondary ディレクティブのファイルに書き込まれ、あとで復元用として使うことができます。

flutend を起動して、以下の2行が出力されていれば、OKです。

$ fluentd -c ./fluent/fluent.conf -vv 
2013-06-13 16:55:24 +0900 [info]: plugin/out_forward.rb:89:block in configure: adding forwarding server '192.168.33.10:24224' host="192.168.33.10" port=24224 weight=60
2013-06-13 16:55:24 +0900 [info]: plugin/out_forward.rb:89:block in configure: adding forwarding server '192.168.33.11:24224' host="192.168.33.11" port=24224 weight=60

負荷分散の稼働確認

fluent-cat でログを何度か送ってみます。

$ echo '{"hoge":"fuga"}' | fluent-cat debug.test

server1 と server2 にそれぞれログが出力されますね!

2013-06-13 16:55:52 +0900 debug.test: {"hoge":"fuga"}

HA構成を試す

HA構成(active、standby)を試すために、fluentd.conf を以下のように書き換えます。

$ vim fluent/fluent.conf
<match debug.**>
  type forward
  retry_limit 9
  <server>
    name server1
    host 192.168.33.10
    port 24224
  </server>
  <server>
    name server2
    host 192.168.33.11
    port 24224
    standby 
  </server>
  <secondary>
    type file
    path /path/to/forward-failed
  </secondary>
  flush_interval 60s
</match>

HA構成での稼働確認

fluent-cat でログを送ってみます。

$ echo '{"hoge":"fuga"}' | fluent-cat debug.test

active サーバのみにログが出力されますね。

2013-06-13 17:00:39 +0900 debug.test: {"hoge":"fuga"}

次に active サーバを停止してみます。

$ sudo /etc/init.d/td-agent stop
2013-06-13 17:01:58 +0900 [info]: shutting down fluentd
2013-06-13 17:01:59 +0900 [info]: process finished code=0

送信側のログを確認すると、server1 が detach されて、スタンバイしている server2 に切り替わったことが分かりますね!

2013-06-13 17:02:34 +0900 [info]: plugin/out_forward.rb:408:tick: detached forwarding server '192.168.33.10:24224' host="192.168.33.10" port=24224 phi=16.304823551028555
2013-06-13 17:02:34 +0900 [debug]: plugin/out_forward.rb:172:rebuild_weight_array: rebuilding weight array lost_weight=60
2013-06-13 17:02:34 +0900 [info]: plugin/out_forward.rb:178:block in rebuild_weight_array: using standby node 192.168.33.11:24224 weight=60

この状況でログを投げてみます。

$ echo '{"hoge":"fuga"}' | fluent-cat debug.test

backup サーバにログが出力されました!

2013-06-13 17:03:05 +0900 debug.test: {"hoge":"fuga"}

active サーバを再び起動します。

$ sudo /etc/init.d/td-agent start

送信側のログに server1 がリカバリされたと出力されましたね!

2013-06-13 17:03:39 +0900 [info]: plugin/out_forward.rb:424:heartbeat: recovered forwarding server '192.168.33.10:24224' host="192.168.33.10" port=24224
2013-06-13 17:03:39 +0900 [debug]: plugin/out_forward.rb:172:rebuild_weight_array: rebuilding weight array lost_weight=0

まとめ

パラメータの設定など細かいチューニング周りまでは確認していませんが、fluentd のざっくりしたクラスタリングの挙動を確認することができました。
あと今回は、forward Output Plugin を使って試しましたが、他にも Roundrobin Plugin などがあるようです。
Vagrant ならサクッと立てて、ローカル環境を汚さずに簡単に検証ができますね〜。