2009/03/22

MySQLのレプリケーションねた2つ

MySQLのレプリケーション関連で、最近起きたトラブルねたを2つ

  • レプリケーションの遅延時間が時々異常に大きな値を示す場合がある。
  • MySQLのバージョンアップしたらレプリケーションが動かなくなった。
一つ目のレプリケーションの遅延時間は、Nagiosの監視(5分おき)から単発で大きすぎる遅延(5分以上)を検出していた。検出されてからコンソールで状態を確認(SHOW SLAVE STATUS\G)しても"Seconds_Behind_Master"は0としか表示されないことが続いていた。

原因は、マスタとスレーブがNTPの時刻合わせで正しい時間に設定される前にレプリケーションを初めてしまったため。レプリケーションの開始時にスレーブは、マスタとスレーブの時刻のズレを記憶して遅延時間を算出している。NTPの設定で、マスタとスレーブの時刻のズレが有る状態から無い状態へ変化していても遅延時間の算出する時には、時刻のズレを考慮しているので、異常に大きな遅延時間が出ていた。ちなみに、まったく遅延をしていない(=最新のバイナリログが実行済み)の場合は、"Seconds_Behind_Master"は必ず0と表示されるので、遅延が発生しない限り異常な値を示さない。

解決方法は、簡単でレプリケーションを止めてからまた始めるだけ。そうすることで、もう一度マスタとスレーブの時刻のズレが正しい値になるので、異常な遅延時間が出なくなる。


2つ目の"MySQLのバージョンアップしたらレプリケーションが動かなくなった"のは、マスタ側のMySQLを5.0.51aから5.0.77へバージョンアップしたらレプリケーションが止まった。(スレーブ側は5.0.51a)

原因は"my.cnf"に記述するバイナリログファイル名の仕様変更(?)だった。バイナリログを出力するためにmy.cnfに"bin-log="とだけ記述して、ファイル名を指定していないと引っかかる。

ファイル名を指定しないとバイナリログインデックスファイル([バイナリログファイル名].index)に記述されるバイナリログのファイルのパスが、バージョンアップをしたら相対パスから絶対パスに変わった。バイナリログファイル名を記述してある場合は、どちらの場合も相対パスのままだった。

対策としては、必ずバイナリログファイル名を記述するとバージョンアップをしても問題無く使える。(指定していなければ、今のバイナリログファイル名と同じファイル名をmy.cnfに記述しておく)