はじめに
zabbixさんがザビ家で、ザビ家といったらギレンとドズル。。。という意味不明な話は置いときまして本題に入ります。Zabbixのログ監視が原因で以下のようなトラブルになることがあります。
- ログの送信遅延(Agent→ZabbixServer)
- ログ読み取り遅延
これらは結果的にエラーの発見が遅れることとなり、監視遅延の問題になるので対策を講じる必要があります。なお、この対策はZabbix4.0を元にした内容です。
ログ送信遅延対策
何故送信遅延が発生するかというと、ZabbixAgentから1秒間にログを送信できる行数というのが決められているからです。デフォルト値はzabbix_agent.confのパラメータ「MaxLinesPerSecond=20」で、1秒当たり20行です。単純計算すると1日で約170万行ちょい送信できます。170万行もログなんて出ないと思われるかもですが、しかし、リリース直後のjavaアプリとかOutofMemory起こしたjavaアプリとかデバッグモードのjavaアプリとか普通に動いてるだけなのにたくさんログ吐くjavaアプリとか(笑)、NW機器が出したtrapやsyslogを溜めてるサーバとかが大量のログ吐いて結果、170万行/day以上のログをAgentからServerに送信することがあります。そんなこんなで対策としては以下があります。
MaxLinesPerSecondの設定値変更
1秒あたりの送信行数(zabbix_agent.confのMaxLinesPerSecond=20 ←の箇所)を増やします。ただ上限があってMAX200(行)までです。変更後はエージェントの再起動が必要になります。
アイテムキーのパラメータでコントロール
アイテムキーの<maxlines>で送信行数を増やすことができます。(この設定はzabbix_agent.confのMaxLinesPerSecondより優先され、再起動の必要もありません)
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>] 例) log[/var/log/messages,,,200]
ログフィルター
ログの内容をすべてZabbixServerに送信せずに、文字列が一致する行のみをフィルターして送信することで行数を減らして遅延防止につなげることが出来ます。フィルターはアイテムキーの<regexp>を使います。
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>] 例) log[/var/log/messages,ERROR|FATAL] (ERRORまたはFATALのある行で絞り込む)
ログ読み取り遅延対策
ZabbixAgentがログファイルから1秒間に読み込める最大行数はパラメータ「MaxLinesPerSecond(デフォルト値:20)」の4倍*1です。なので1秒で80行です。何故送信が20行で読み取りが80行なのかというと、ログフィルターを使うからです。読み取り遅延対策としては送信遅延の対策と同じ「MaxLinesPerSecondの設定値変更」や「アイテムキーのパラメータでコントロール」が有効です。
送信/読み取り遅延していることを気づくには
そもそも遅延しているかどうかがわからないと対策も打てないので以下の方法で遅延を検知します。
maxdelayの活用
アイテムキーのmaxdelayパラメーターを使用します。maxdelayについてはここを参照
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>] 例) log[/var/log/messages,,,,,,10s]
これを使用すると、ログ送信/読み取りが遅延したときにログ読み飛ばすのですが、それをZabbixAgentのログ/var/log/zabbix
に残してくれます。
ログ出力例 ~logfile:"/var/log/messages" skipping 973520 bytes (from byte 859 to byte 974379) to meet maxdelay~
このログの文字列「to meet maxdelay」を監視しておけばどのログで遅延が発生したかを気づくことが出来るようになります。
以上
*1:参考:https://www.zabbix.com/documentation/4.0/en/manual/config/items/itemtypes/log_items x倍という仕様はZabbixのバージョンによって異なる