Oracleのアラートログ類を1箇所に集めたかったお話
開発系なんかもあわせると10台以上のOracle動かしているサーバの面倒見ているわけで、アラートログ監視が面倒なわけです。
EnterpriseManager買えばいいじゃんとか、世の中ログ監視ツールは幾らでもあるのでそれを使うという手もあるんですがfluentを使ってみたかったのでやってみたというメモ。
「ログ監視を1箇所でやることで、アラート出すなりIRC出すとかアラート対象の選別や送信先メールなどのメンテを(個人的に)やりやすく」というのが目標。実はログ出力場所を全部NFSにすれば良いというお話があったりするけど、そこは目をつぶる。
fluentを使うのをベースとして、一番単純に構成するとこうなるかと思う。
ログファイル ↑ fluentd(ここでログげっつ) ↓ fluentd(こっちで受け取る) ↓ fluent-plugin-notifier や irc や ikachan で好きにやる
ただ、今回は↓のようなことを考えていました。fluentはログ収集に注力してもらって、残りは昔のツールを流用。
- 以前作った snmptrap を irc に出すツールがあったのでそこはそのまま使いたかった。
- ログファイルを監視するfluentについては、DBサーバで動かすことになるのでなるべく軽量でシンプルなものにしたかった。
- DBサーバにはSolarisもあるのでそちらでも動かしやすそう…というのもちょっとだけ考慮
ということで大雑把にツール構成を書くとこうなる。
ログファイル ↑ fluent-agent-lite(ここでログげっつ) ↓ fluentd(こっちで受け取る) ↓ Kyoto Tycoon(memcahcedプラガブルサーバ キューモード) ← snmptrapd ← サーバとか ↓ IRC や メールに通知
で、fluentd から kyototycoon に memcachedプロトコルで書き出すプラグインが…プラグインがパッと見る限り見つかりません。
ということで、尊敬する@tamtam180さんのarangoプラグインとredisプラグインを元に、その部分は自作。まだテスト書いてないので正式プラグインとしては出せないんですが、とりあえず動きます。これ。
使ってる設定はこんな感じ。syslogもついでに引っ張ってきてます。
## fluent-agent-lite 側 LOGS=$(cat <<"EOF" oracle.dbaleert.hostname /u01/app/oracle/diag/rdbms/sid/sid/trace/alert_sid.log oracle.asmaleert.hostname /u01/app/grid/diag/rdbms/+asm/+ASM/trace/alert_+ASM.log system.hostname /var/log/messages EOF ) ## fluentd 側 <source> type forward </source> <match oracle.**> type copy <store> type file_alternative path /log/oracle/alert.%Y%m%d.log output_include_time false buffer_type file buffer_path /log/oracle/oracle_alert.*.buffer flush_interval 5s </store> <store> type ktmemqueue host localhost port 11211 inputkey fluent </store> </match> <match system.**> type copy <store> type file_alternative path /log/system/system.%Y%m%d.log output_include_time false buffer_type file buffer_path /log/system/system.*.buffer flush_interval 5s </store> <store> type ktmemqueue host localhost port 11211 inputkey fluent </store> </match> <match ping.**> type copy <store> type ping_message_checker tag error.ping notifications yes check_interval 60 notification_times 2 </store> <store> type file_alternative path /log/ping/agent_ping.%Y%m%d.log buffer_type file buffer_path /log/ping/agent_ping.*.buffer flush_interval 5s localtime output_include_time true output_include_tag false output_data_type attr:data </store> </match> <match error.ping> type ktmemqueue host localhost port 11211 inputkey fluent </match>
あと割り切っている点があります。
- fluentdで受けるところでメッセージ到達性で全く問題ないか?という点
- fluent-agent-liteにすることで、position覚えができないため fluent-agent-lite が長時間ダウンすると転送できないログが発生する点
メッセージ到達性が確実なら嬉しいですがログ監視なので、まあ本気で何か起きたらメッセージは沢山出るでしょうということで1メッセージもロスして欲しくない…みたいな完全性は求めていません。fluent-agent-liteがtail -Fベースで動いているので位置覚えないため、fluent-agent-liteが落ちると、ログ転送に抜けが起きやすい。ただ、そこはping-messageで監視することでなるべく早く気づこうねという方針です。そんな事態になったら、どうせサーバに入って確認することになると思うので。
まあこんな構成誰が使うんだ?という気がしますが、こんな構成を作れたのも fluentd や kyoto tycoon や tagomorisさんが作った膨大なプラグインのおかげで、感謝感謝!です。
※参考
Kyoto Tycoon(memcahcedプラガブルサーバ キューモード) は こちら http://fallabs.com/blog-ja/promenade.cgi?id=133