設定経緯
ある日いつも通り2台構成のMySQLサーバでマスタースレーブレプリケーションを組んだ後にログを眺めていたら、以下の様なログがスレーブ側で発生していた。
[Warning] Slave SQL: If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
英文を読んでみると、
この構成の場合、もしクラッシュした場合にはリレーログの情報の一貫性は保証されません
的なログ。
このサーバのMySQLはMySQL5.6だったので、どうやら5.6の新機能のクラッシュセーフ関連の機能を有効にしていないために発生しているみたい。
既にサービスインしているサーバで、停止には許可がいるサーバだったんだけど、スレーブで有効にすれば良さそうだったので有効にしてみた。
設定
設定はこれだけ。
vim /etc/my.cnf
----------
[mysqld]
relay_log_info_repository = TABLE
relay_log_recovery = ON
----------
service mysqld restart
これでエラーは出なくなった。
設定理解
※以下のサイトを大変参考にしています
https://yakst.com/ja/posts/57
上記サイトを見ればだいたいわかっちゃいますが自分の理解のために記載。
スレーブのレプリケーションのスレッド
スレーブのレプリケーションのスレッドは以下の2つから成る。
- IOスレッド
- SQLスレッド
IOスレッド:
バイナリログをマスターからスレーブのローカルのリレーログにコピーする役割を担う。
SQLスレッド:
リレーログ内のクエリを実行する役割を担う。
スレッドのポジション
それぞれのスレッドは、ローカルにファイルとしてポジションを記録している。
IOスレッドのポジションは master.info
に。
SQLスレッドのポジションは relay-log.info
に記録される。
ポジションをファイルに書き込む事の問題点
ファイルに書き込みが行われたタイミングと、ディスクへのファイルの書き込みが同期していないこと。
ファイルへの書き込みが行われた後、ディスクへファイルが書き込まれる前にサーバがクラッシュしてしまうと、ファイルに記録されているポジションが正しくない場合が発生する。
※ここでのファイルの書き込みというのは、まだディスクに書き込まれていない状態の、メモリ上などに存在するデータの事を指しているのだろうか?上手く理解できていない。
MySQL5.5系の場合、sync_master_info = 1
sync_relay_log_info = 1
と設定することによって、トランザクション毎にファイルをディスクに同期させる処理が可能だった。
しかし、この設定を行っても、レプリケーションの情報はトランザクションのコミットの後に書き込まれるため、トランザクションがコミットされてかつ、レプリケーションの情報が更新される前にサーバがクラッシュしてしまうと、不整合が発生する可能性が高くなる。
MySQL5.6系での上記問題の改善
MySQL5.6系では、レプリケーションの情報を、ファイルではなくテーブルに書き込む事を可能にした。
ファイルの時はトランザクションのコミット後にレプリケーション情報を更新していたが、トランザクションの中でレプリケーション情報を更新することが可能になった。
力尽きた・・
力が湧いたらコピペっぽい記載じゃなくて色々な情報を纏めて書こうと思います。