読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

fluentd(td-agent)使ってサーバ間でjsonログを転送してみる&詳細ログも出してみるテスト

はじめに

前回、fluentd(td-agent)を使って同一サーバ内でテストしてみたので今回はサーバ間で転送してみるテストです
また、起動スクリプトを編集して詳細なログも出して確認してみます

補足

そんなにテクニカルでも有用でもないカモですがこちらにメモまとめをメモっておきました
td-agent(fluentd)を本番サ―ビスで小さく使ってみたメモ-まとめ

やりたいことはこんな感じ

概要

1.webサーバではアプリケーションのログをjson形式でファイルに書き出している(log4phpとかで)。
2.それをfluentd(td-agent)でtailして、ログサーバに転送する。
3.ログサーバでは受け取ったjson形式のログを所定の場所にファイルとして書き出す。
4.それらを詳細なログを出してみてみる
※3.の部分をのちのちmongodbに入れるように変える予定

イメージ


以降の説明では
webサーバをsv1、webサーバをsv2と呼ぶことにします
また、今回はgemから入れるfluentdではなく、td-agentでやることにします

td-agentについて
http://docs.fluentd.org/ja/articles/install-by-rpm

やってみる

主な手順はこちら

-- sv1、sv2共通 --
1.td-agentダウンロード&インストール
2.td-agent起動&停止の確認

-- sv1(送信側) --
3.td-agentの設定&forward準備
4.td-agentの詳細なログを出す設定をしてみる
5.起動&動作確認

-- sv2(受信側) --
6.td-agentの設定&forward準備
7.td-agentの詳細なログを出す設定をしてみる
8.起動&動作確認

-- sv1、sv2合わせて --
9.iptablesを設定して疎通確認
10.やってみるテスト

ではさっそく。。

sv1、sv2共通

1.td-agentダウンロード&インストール
※ダウンロード
# cd /usr/local/src
# sudo wget http://packages.treasure-data.com/redhat/x86_64/td-agent-1.1.17-0.x86_64.rpm
# sudo wget http://packages.treasure-data.com/redhat/x86_64/td-libyaml-0.1.4-1.x86_64.rpm

※インストール
# sudo yum localinstall td-agent-1.1.17-0.x86_64.rpm td-libyaml-0.1.4-1.x86_64.rpm
2.td-agent起動&停止の確認
※起動
# sudo /etc/init.d/td-agent start
Starting td-agent:                                         [  OK  ]

※ステータスを確認
# sudo /etc/init.d/td-agent status
td-agent (pid  7711) を実行中...

※プロセスを確認
# ps aux | grep td
td-agent  7711  0.0  0.1 212984 15700 ?        Sl   16:35   0:00 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
td-agent  7714  1.0  0.2 258240 26516 ?        Sl   16:35   0:00 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
hoge    7805  0.0  0.0 107456   916 pts/91   S+   16:35   0:00 grep td-

※ログも確認
# less /var/log/td-agent/td-agent.log
2013-12-03 16:35:07 +0900 [info]: starting fluentd-0.10.39
2013-12-03 16:35:07 +0900 [info]: reading config file path="/etc/td-agent/td-agent.conf"
2013-12-03 16:35:07 +0900 [info]: using configuration file: <ROOT>
  <match td.*.*>
    type tdlog
    apikey YOUR_API_KEY
    auto_create_table
    buffer_type file
    buffer_path /var/log/td-agent/buffer/td
  </match>
  <match debug.**>
    type stdout
  </match>
  <source>
    type forward
  </source>
  <source>
    type http
    port 8888
  </source>
  <source>
    type debug_agent
    bind 127.0.0.1
    port 24230
  </source>
</ROOT>
2013-12-03 16:35:07 +0900 [info]: adding source type="forward"
2013-12-03 16:35:07 +0900 [info]: adding source type="http"
2013-12-03 16:35:07 +0900 [info]: adding source type="debug_agent"
2013-12-03 16:35:07 +0900 [info]: adding match pattern="td.*.*" type="tdlog"
2013-12-03 16:35:07 +0900 [info]: adding match pattern="debug.**" type="stdout"
2013-12-03 16:35:07 +0900 [info]: listening fluent socket on 0.0.0.0:24224
2013-12-03 16:35:07 +0900 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

※止めてみる
# sudo /etc/init.d/td-agent stop
Shutting down td-agent:                                    [  OK  ]

※確認
# ps aux | grep td-
hoge   19649  0.0  0.0 107452   932 pts/91   S+   17:11   0:00 grep td-

sv1(送信側)

3.td-agentの設定&forward準備
※一応バックアップを保存(tmplateもあるけど。。)
# sudo cp -ap /etc/td-agent/td-agent.conf /etc/td-agent-forwardtest.conf

※設定ファイル編集
# sudo vi /etc/td-agent/td-agent-forwardtest.conf
 -- vi --
<source>
  type tail
  format json
  path /var/log/td-agent/forward_test_input.log
  pos_file /var/log/td-agent/forward_test_log.pos
  tag json.forward.test
</source>

<match json.forward.test>
  type forward
  <server>
    host 192.168.72.2
    port 24224
  </server>
</match>
 --------

※読み込みファイルの変更方法がわからなかったのでtd-agent.confにinclude
# sudo vi /etc/td-agent/td-agent.conf
 --viで追記--
include td-agent-forwardtest.conf
 --------
4.td-agentの詳細なログを出す設定をしてみる

公式サイトにもありますが、/etc/init.d/td-agent(起動スクリプト)を直接編集します
今現在は、viで直接開いて34行目でした。--log /var/log/td-agent/td-agent.logの後ろに-vvを追記します

# sudo vi /etc/init.d/td-agent
 -- vi --
TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log}"
↓
#TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log}"
TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log -vv}"
 --------
5.起動&動作確認

↑のほうで詳細じゃないほうのログも乗せてます。
traceレベルのログが出たり、fluent/supervisor.rb:169:supervise:みたいにバックトレース的なのがでました

また、tail -fしてちょっとたつと最後にdetachedと出ます。
これはsv2(受信側)の設定をしてないためなので気にせずそのまま次へ。。

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

# tail -f /var/log/td-agent/td-agent.log
2013-12-06 12:02:41 +0900 [info]: fluent/supervisor.rb:169:supervise: starting fluentd-0.10.39
2013-12-06 12:02:41 +0900 [info]: fluent/supervisor.rb:271:read_config: reading config file path="/etc/td-agent/td-agent.conf"
2013-12-06 12:02:41 +0900 [trace]: fluent/plugin.rb:87:register_impl: registered buffer plugin 'file'
2013-12-06 12:02:41 +0900 [trace]: fluent/plugin.rb:87:register_impl: registered buffer plugin 'memory'

・・・省略・・・


2013-12-06 12:02:41 +0900 [trace]: fluent/plugin.rb:87:register_impl: registered input plugin 'tail'

・・・省略・・・

    <secondary>
      type file
      path /var/log/td-agent/forward-failed
    </secondary>
  </match>
</ROOT>
2013-12-06 12:02:41 +0900 [info]: fluent/engine.rb:94:block in configure: adding source type="tail"
2013-12-06 12:02:41 +0900 [info]: fluent/engine.rb:110:block in configure: adding match pattern="json.forward.test" type="forward"
2013-12-06 12:02:41 +0900 [info]: plugin/out_forward.rb:87:block in configure: adding forwarding server '192.168.72.2:24224' host="192.168.72.2" port=24224 weight=60
2013-12-06 12:02:41 +0900 [debug]: plugin/out_forward.rb:170:rebuild_weight_array: rebuilding weight array lost_weight=0
2013-12-06 12:02:41 +0900 [info]: plugin/in_tail.rb:289:initialize: following tail of /var/log/td-agent/forward_test_input.log


2013-12-06 12:06:54 +0900 [warn]: plugin/out_forward.rb:406:tick: detached forwarding server '192.168.72.2:24224' host="192.168.72.2" port=24224 phi=8.41515295486209
2013-12-06 12:06:54 +0900 [debug]: plugin/out_forward.rb:170:rebuild_weight_array: rebuilding weight array lost_weight=60
<span style="color:#ff4500">※↑sv2設定してないのでdetachedされる</span>

sv2(受信側)

6.td-agentの設定&forward準備
※一応バックアップを保存(tmplateもあるけど。。)
# sudo cp -ap /etc/td-agent/td-agent.conf /etc/td-agent-receivetest.conf

※設定ファイル編集
# sudo vi /etc/td-agent/td-agent-receivetest.conf
 -- vi --
<source>
  type forward
  port 24224
</source>

<match json.forward.test>
  type file
  path /var/log/td-agent/forward_test_output.log
</match>
 --------

※td-agent.confにinclude
# sudo vi /etc/td-agent/td-agent.conf
 --viで追記--
include td-agent-receivetest.conf
 --------
|||<

***7.td-agentの詳細なログを出す設定をしてみる
sv1と同じです
>||
# sudo vi /etc/init.d/td-agent
 -- vi --
TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log}"
↓
#TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log}"
TD_AGENT_ARGS="${TD_AGENT_ARGS-/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log -vv}"
 --------
8.起動&動作確認
# sudo /etc/init.d/td-agent start

# tail -f /var/log/td-agent/td-agent.log
2013-12-06 12:21:05 +0900 [info]: fluent/supervisor.rb:169:supervise: starting fluentd-0.10.39
2013-12-06 12:21:05 +0900 [info]: fluent/supervisor.rb:271:read_config: reading config file path="/etc/td-agent/td-agent.conf"
2013-12-06 12:21:05 +0900 [trace]: fluent/plugin.rb:87:register_impl: registered buffer plugin 'file'

・・・省略・・・

  <source>
    type forward
    port 24224
  </source>
  <match json.forward.test>
    type file
    path /var/log/td-agent/forward_test_output.log
    flush_interval 1s
  </match>
</ROOT>
2013-12-06 12:21:05 +0900 [info]: fluent/engine.rb:94:block in configure: adding source type="forward"
2013-12-06 12:21:05 +0900 [info]: fluent/engine.rb:110:block in configure: adding match pattern="json.forward.test" type="file"
2013-12-06 12:21:05 +0900 [info]: plugin/in_forward.rb:64:listen: listening fluent socket on 0.0.0.0:24224

sv1、sv2合わせて

9.iptablesを設定して疎通確認

5.起動&動作確認でsv1のログでdetachedされてるのを確認しましたが、
port24224でやりとりするためにiptablesを編集します。
TCPUDP両方やる必要があるみたいです

下記の行を追加して再起動しました

# sudo vi /etc/sysconfig/iptables
 -- vi --
 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 24224 -j ACCEPT
 -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 24224 -j ACCEPT
 --------

# sudo /etc/init.d/iptables restart
iptables: チェインをポリシー ACCEPT へ設定中filter nat     [  OK  ]
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
iptables: ファイアウォールルールを適用中:                  [  OK  ]

iptablesも設定したので、再度sv1の/var/log/td-agent/td-agent.logを再度見てみます
tail -f /var/log/td-agent/td-agent.logの内容↓

2013-12-06 12:06:54 +0900 [warn]: plugin/out_forward.rb:406:tick: detached forwarding server '192.168.72.2:24224' host="192.168.72.2" port=24224 phi=8.41515295486209
2013-12-06 12:06:54 +0900 [debug]: plugin/out_forward.rb:170:rebuild_weight_array: rebuilding weight array lost_weight=60

2013-12-06 12:58:27 +0900 [warn]: plugin/out_forward.rb:422:heartbeat: recovered forwarding server '192.168.72.2:24224' host="192.168.72.2" port=24224
2013-12-06 12:58:27 +0900 [debug]: plugin/out_forward.rb:170:rebuild_weight_array: rebuilding weight array lost_weight=0

detachedのログの後に、recoveredと出たのでちゃんと疎通できました

10.やってみるテスト

それでは
sv1で指定したinputファイルに直接json文字列を書き込むと、
(fluentdがtailで読んでsv2に転送して)
sv2で指定したoutputファイルにそれが書き込まれるかのテストしてみます

sv1で下記実行

# echo '{"json":"td-agent_no_message_from_sv1", "date":"'`date "+%Y-%m-%dT%T"`'"}' | sudo tee -a /var/log/td-agent/forward_test_input.log
# echo '{"json":"td-agent_no_message_from_sv1", "date":"'`date "+%Y-%m-%dT%T"`'"}' | sudo tee -a /var/log/td-agent/forward_test_input.log
# echo '{"json":"td-agent_no_message_from_sv1", "date":"'`date "+%Y-%m-%dT%T"`'"}' | sudo tee -a /var/log/td-agent/forward_test_input.log

sv2で/var/log/td-agent/forward_test_output.logに書かれるか確認

# less forward_test_output.log.20131206_0.log
2013-12-06T13:05:05+09:00       json.forward.test       {"json":"td-agent_no_message_from_sv1","date":"2013-12-06T13:05:05"}
2013-12-06T13:05:06+09:00       json.forward.test       {"json":"td-agent_no_message_from_sv1","date":"2013-12-06T13:05:06"}
2013-12-06T13:05:06+09:00       json.forward.test       {"json":"td-agent_no_message_from_sv1","date":"2013-12-06T13:05:06"}

無事転送されてログが書き出されました!

おわりに

結構長い記事になっちゃいましたがやってみると楽しいですね!enjoy!