[MySQL]レプリケーションできていない場合にメール通知する方法

MySQLにおいて、マスターが問題なく動作するのと同じくらい、レプリケーションがちゃんと動作していることが重要です。

先日、レプリケーションの同期確認をしないまま決済データを処理してしまい、数万円の被害を出してしまいました。 レプリケーションがうまくいかなくなる原因は以下のように様々です。

  • マスターログの内部処理に失敗してレプリケーションが停止する
  • ネットワークが一時的に切断し、レプリケーションに失敗する
  • ドライブの容量が限界にきてレプリケーションができなくなる

それぞれにおいて、異なる対応が必要になりますが、重要なのはそれにいち早く気づくことです。

今回はシェルスクリプトをcronに登録して一定間隔でチェックできるスクリプトを書いてみたいと思います。 Windowsのcygwinで動作するように書いてますが、Linuxでも応用はできると思います、というかLinuxで動作するように書けという話ですよね(^-^;)。

具体的には次のようなアクティビティでスクリプトを走らせます。
最初に登場しているLog_Posファイルというのは、ログの位置を突き合わせるための独自のテキストファイルです。

replication_trouble_check_activity.jpg

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