昨日からMySQLのレプリケーションで特定のエラーが発生して止まってしまう現象が多発したので、logmonとMaatkitのmk-slave-restartで自動復旧するようにして対応。
エラー原因の根本解決じゃないですが、エラー検知して対応するまでレプリケーションが止まったままとか、
深夜にレプリケーションが止まって叩き起こされるよりかは遙かにマシ。
logmonの導入
logmonについては以前ブログに書いたので、そちらを参照してください。
とりあえず下記のような感じで導入可能です。
mkdir ~/tmp
cd ~/tmp
wget 'http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/ec7481a5abd4ed3149256f9400478d7d/4925722f004efe92492575e200057580/$FILE/logmon_20100411.tgz'
tar zxvf logmon_20100411.tgz
cd logmon_20100411
./setup.sh
Maatkitの導入
Maatkitの導入は適当にググってください。私はRPM作成して導入してますが、ソースから入れる場合は下記のような感じです
mkdir ~/tmp
cd ~/tmp
wget http://maatkit.googlecode.com/files/maatkit-7284.tar.gz
tar zxvf maatkit-7284.tar.gz
cd maatkit-7284
perl Makefile.PL
make
make install clean
/etc/logmon/logmon.conf の設定
監視用の設定を用意
:/var/lib/mysql/err.log
(Error_code: 1100)
mk-slave-restart -uroot --error-numbers 1100 --verbose -pxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >> /var/lib/mysql/skip_query.log
echo "<%%%%>" | mail -s "[db001.hogehoge.com] mk-slave-restart report" "[email protected]" -- -f [email protected]
パスワードは/root/.my.cnfか/root/.maatkit.confに書いておけばいいようですが、念のため設定。 mk-slave-restartが発動した際にはメールも発砲しておきます。
やっていることは
- mysqlのエラーログ /var/lib/mysql/err.log を監視
- [Error_code: 1100]という文字列を条件に指定
- 条件にマッチした場合は1100のエラーだけmk-slave-restartでskipして[email protected]宛てにメール発砲
- skipしたクエリは/var/lib/mysql/skip_query.logに記録
という感じです。実運用ではメールだけでなく社内IRCにも通知するようにもして、リアルタイムで検知出来るようにしてます。
構文のチェック
/etc/rc.d/init.d/logmon check
logmonの起動
/etc/rc.d/init.d/logmon start
これでレプリケーションが止まっても自動復旧するようになりました。実際はlogmonをSupervisordで管理してるんですが、長くなるんで別の機会にまとめます。
エラー番号ごとで実行する処理をかえておけば、他のエラーでも自動復旧可能ですが、あんまりskipしてるとDBが壊れるんでご注意を。