3
4

More than 5 years have passed since last update.

MySQL5.6系のレプリケーションで、スレーブをクラッシュセーフに設定する

Posted at

設定経緯

ある日いつも通り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系では、レプリケーションの情報を、ファイルではなくテーブルに書き込む事を可能にした。
ファイルの時はトランザクションのコミット後にレプリケーション情報を更新していたが、トランザクションの中でレプリケーション情報を更新することが可能になった。

力尽きた・・
力が湧いたらコピペっぽい記載じゃなくて色々な情報を纏めて書こうと思います。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4