[MySQL]レプリケーションできていない場合にメール通知する方法
MySQLにおいて、マスターが問題なく動作するのと同じくらい、レプリケーションがちゃんと動作していることが重要です。
先日、レプリケーションの同期確認をしないまま決済データを処理してしまい、数万円の被害を出してしまいました。 レプリケーションがうまくいかなくなる原因は以下のように様々です。
- マスターログの内部処理に失敗してレプリケーションが停止する
- ネットワークが一時的に切断し、レプリケーションに失敗する
- ドライブの容量が限界にきてレプリケーションができなくなる
それぞれにおいて、異なる対応が必要になりますが、重要なのはそれにいち早く気づくことです。
今回はシェルスクリプトをcronに登録して一定間隔でチェックできるスクリプトを書いてみたいと思います。 Windowsのcygwinで動作するように書いてますが、Linuxでも応用はできると思います、というかLinuxで動作するように書けという話ですよね(^-^;)。
具体的には次のようなアクティビティでスクリプトを走らせます。
最初に登場しているLog_Posファイルというのは、ログの位置を突き合わせるための独自のテキストファイルです。
Log_Posファイルでログ位置を比較する部分は、運用しているDBのデータがcronでチェックする頻度では変更が発生しないような場合は除いておいたほうが良いでしょう。
このアクティビティを具体的に書いたシェルスクリプトがこちら。 再利用しやすいように冗長的に書いてますが、状況に応じて編集してください。
Windowsにメールサーバを入れたくなかったのでemailパッケージをインストールしてsmtp指定しておいてメール送信するようにしてます。
#!/bin/sh fpath="replication_mlogpos.txt" if [ ! -e $fpath ]; then echo "0" >$fpath fi slave_io_running=`mysql -u<user> -p<password> -e "SHOW SLAVE STATUSG" | grep "Slave_IO_Running" | sed -e "s/.*: //"` if [ $slave_io_running != "Yes" ]; then subject='レプリケーションが停止しています' to='alert@example.com' echo -e "Slave_IO_Runningが「Yes」ではありません。" | email $to -s $subject exit fi slave_sql_running=`mysql -u<user> -p<password> -e "SHOW SLAVE STATUSG" | grep "Slave_SQL_Running" | sed -e "s/.*: //"` if [ $slave_sql_running != "Yes" ]; then subject='レプリケーションが停止しています' to='alert@example.com' echo -e "Slave_SQL_Runningが「Yes」ではありません。" | email $to -s $subject exit fi old_mlogpos=`cat $fpath | awk 'NR==1'` latest_mlogpos=`mysql -u<user> -p<password> -e "SHOW SLAVE STATUSG" | grep "Read_Master_Log_Pos" | sed -e "s/.*: //"` if [ $old_mlogpos = $latest_mlogpos ]; then subject='レプリケーションに遅延が発生しています' to='alert@example.com' echo -e "前回のログ位置:$old_mlogposn今回のログ位置:$latest_mlogpos" | email $to -s $subject else echo "$latest_mlogpos" >$fpath fi
参考URL: 5.4.5. レプリケーションのトラブルシューティング
できたスクリプトファイルをcrontabで1時間おきに動作するように登録して完了です。
# crontab -e -------------------------- 0 * * * * /usr/local/bin/replication_check.sh --------------------------
2014-02-04