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