MySQL のレプリケーションを Nagios で監視する
みなさんこんにちは、nakamura です。2011 年も後 1 ヶ月!悔いのないように過ごしましょうね!
MySQL のレプリケーションってけっこう繊細なやつで、割りとちょっとした事ですぐに止まっちゃうんですよね~。しかもレプリケーションが止まった所でサイトが停止するわけではないので、とっても気付きづらい・・・。というわけでレプリケーションする際には監視は欠かせない!と思っているわたくしが、今回は SNMP + Nagios で監視する方法をご紹介しようと思います。
コマンドの実行結果を MIB ツリーに追加
まずは監視対象となるレプリケーションのスレーブサーバに以下のようなスクリプトを用意します。パスやファイル名はお好みで変えてください。MySQL の root パスワードが書かれているのでパーミッションは 700 がいいかもですね。
/var/admin/scripts/snmp/replication_slave_sql.sh
#!/bin/bash
# Watch Slave_SQL_Running parameter for SNMP.
mysql -uroot -ppassword -e "SHOW SLAVE STATUS\G" | grep "Slave_SQL_Running"
/var/admin/scripts/snmp/replication_slave_io.sh
#!/bin/bash
# Watch Slave_IO_Running parameter for SNMP.
mysql -uroot -ppassword -e "SHOW SLAVE STATUS\G" | grep "Slave_IO_Running"
それぞれ試しに実行してみて問題ないようであれば SNMP の設定ファイルに以下を追記します。設定ファイルのパスはディストリビューションで違うかもしれないので、なければ色々探してみてください。
/etc/snmp/snmpd.conf
exec slave_io /var/admin/scripts/snmp/replication_slave_io.sh
exec slave_sql /var/admin/scripts/snmp/replication_slave_sql.sh
記述を追加したら SNMP を再起動します。
/etc/init.d/snmpd restart
MIB ツリーに追加されているか確認します。
snmpwalk -v 2c localhost -c community_name 1.3.6.1.4.1.2021.8
こんなのが出てれば正解!
UCD-SNMP-MIB::extOutput.3 = STRING: Slave_IO_Running: Yes
UCD-SNMP-MIB::extOutput.4 = STRING: Slave_SQL_Running: Yes
Nagios に監視設定を追加
まずはコマンドを定義します。こんな感じで。設定ファイルのパスは CentOS のものです。
/etc/nagios/objects/commands.cfg
# 'check_slave_io' command definition
define command {
command_name check_slave_io
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o .1.3.6.1.4.1.2021.8.1.101.3 -r Yes -P 2c -C community_name
}
# 'check_slave_sql' command definition
define command {
command_name check_slave_sql
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o .1.3.6.1.4.1.2021.8.1.101.4 -r Yes -P 2c -C community_name
-r で期待される文字列を指定します。.1.3.6. ・・・という OID の部分は snmpwalk コマンドに -O n というオプションをつける事で取得可能です。こんな感じ。
snmpwalk -v 2c localhost -c community_name 1.3.6.1.4.1.2021.8 -O n
コマンドを定義したらサービスに追加してみましょう。
/etc/nagios/objects/services.cfg
# MySQL Replication Slave IO
define service {
use generic-service
host_name slave_db
service_description Slave IO Running
check_command check_slave_io
}
# MySQL Replication Slave SQL
define service {
use generic-service
host_name slave_db
service_description Slave SQL Running
check_command check_slave_sql
}
シンタックスチェックして Nagios 再読み込み。
nagios -v /etc/nagios/nagios.cfg
/etc/init.d/nagios reload
こんな感じでサービスが追加されていれば OK!
レプリケーションは止まってから気付くまでが早ければ早いほど復旧も楽なので、ぜひ監視は自動化しておきたいところですね。
終わりに
SNMP の exec を使って任意のコマンドの実行結果を監視するやり方はレプリケーションに限らず、何にでも応用可能な方法なので、大概のものは監視できちゃいますよ。一度お試しあれ。