この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Vagrant を使って、fluentd のクラスタリング(負荷分散と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 ならサクッと立てて、ローカル環境を汚さずに簡単に検証ができますね〜。