Glide Note

glidenote's blog

logmonとMaatkitでMySQLレプリケーションエラーから自動復旧

昨日から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が壊れるんでご注意を。

Comments