とある Pacemaker で HA クラスタにしてるシステムで Pacemaker のクラスタの状態を監視したときのメモ。
Pacemaker から次のような方法でパッシブに Nagios に通知すれば良さそうですけど・・・
- pacemaker-pygui
- CentOS 7 の Pacemaker/Corosync で snmptrap やメールで通知 - Qiita
- SNMPトラップの確認-Pacemaker1.1.15 - Qiita
パッシブチェックのための処理を監視対象のサーバに仕込むのはけっこう面倒なので Nagios からのアクティブチェックで監視できるようにします。
次のようなものを監視したいです。
- ノードが online 以外になっている(offline とか standby)
- リソースがコケてフェイルカウントがあがってる
- リソースを移動させたときのロケーション制約が残ったまま
これらの情報は crm_mon
コマンドで取得できるので、Nagios から nrpe
経由で crm_mon
コマンドを実行してその内容を元に結果を出力する Nagios プラグインを作ります。
check_pacemaker.sh
#!/bin/bash tmp=$(mktemp /tmp/check_pacemaker.XXXXXX) trap 'rm -f $tmp' EXIT sudo crm_mon -1NDfn -L > "$tmp" output=$( cat "$tmp" | grep '^Node' | grep -v 'online$' cat "$tmp" | sed -n -e '/^Failed Actions:/,/^$/p' cat "$tmp" | sed -n -e '/^Migration Summary:/,/^$/p' | grep 'fail-count' >/dev/null &&\ cat "$tmp" | sed -n -e '/^Migration Summary:/,/^$/p' cat "$tmp" | sed -n -e '/^Negative Location Constraints:/,/^$/p' | tail -n +2 | grep . >/dev/null &&\ cat "$tmp" | sed -n -e '/^Negative Location Constraints:/,/^$/p' ) if [ -n "$output" ]; then echo "$output" | tr '|' ' ' exit 1 fi sudo crm_mon -s
crm_mon
の出力を一時ファイルに書いていますがよく考えたら変数に入れるだけで十分でした。
sudo するために以下のような sudoers
も必要です。secure ログへの出力がうざかったので nrpe では syslog も無効にしています。
Defaults:nrpe !syslog nrpe ALL=(root) NOPASSWD: /usr/sbin/crm_mon -1NDfn -L, /usr/sbin/crm_mon -s
次のような通知が発生します。
正常なとき
[OK] CLUSTER OK: 2 nodes online, 3 resources configured
ノードが standby のとき
[WARNING] Node db02: standby
ノードが offline のとき
[WARNING] Node db02: OFFLINE
リソースにロケーション制約がついているとき
[WARNING] Negative Location Constraints: cli-ban-mysql-on-db01 prevents mysql from running on db01
リソースがコケたとき
[WARNING] Failed Actions: * mysql_monitor_20000 on db01 'not running' (7): call=77, status=complete, exitreason='', last-rc-change='Thu Oct 24 09:55:25 2019', queued=0ms, exec=0ms Migration Summary: * Node db01: mysql: migration-threshold=1000000 fail-count=1 last-failure='Thu Oct 24 09:55:25 2019' * Node db02:
リソースがコケたときの通知がめちゃくちゃ冗長な気がするのと、Nagios のプラグインの出力は1行目と2行目以降で意味に違いがあったりパフォーマンスデータがパイプで区切られる仕様だったりするはずなのだけど・・・
とりあえず動いているので良しとします。
これを次のように nrpe の設定ファイルに仕込んで、
command[check_pacemaker]=/usr/lib64/nagios/plugins/check_pacemaker.sh $ARG1$
Nagios から次のように監視します。
define command{ command_name check_nrpe command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a "$ARG2$" } define service{ use generic-service host_name db-active service_description Pacemaker check_command check_nrpe!check_pacemaker }
さいごに
ぐぐると次のようなものも見つかりました。
- https://exchange.nagios.org/directory/Plugins/Clustering-and-High-2DAvailability/Check-CRM/details
- 似たようなことをしている Nagios プラグイン
- これで良かったかもしれない
- https://offandthenonagain.wordpress.com/2010/08/17/monitoring-pacemaker-with-nagios-and%C2%A0nrpe/
crm_mon -s
だけ使うアイデア- Pacemaker が死ぬとかしてない限りアラートにならない
- https://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/1.1/html/Pacemaker_Explained/_nagios_plugins.html
- Nagios プラグインを Pacemaker のリソースにするやつ
- 今回の話とは全然関係ない
あと pcs-snmp
というものもあって SNMP で crm_mon
と同じような情報が得られるようです。