レプリケーション
MySQL のレプリケーションについて書く
とは?
動作原理
Master, Slave を用意する
Master を更新する
更新内容を同じ順番で Slave にも順次適用する
Master に対する変更を Slave にも適用し続けることで、同一性を担保する
結果整合性モデル
Slave のセットアップ時には、データを全て dump & restore しておく必要がある
同じ更新を適用していく のが基本なので、スタート時点では同じデータを持っている必要がある
注意
SBR での注意点
SQL の実行結果が常に同じにならないようなステートメント はレプリケーションできない
例)
ユーザ定義関数
非決定的な関数 (UUID(), USER(), LOAD_FILE())
ORDER BY 句なしの LIMIT
...
全体的な注意点
Slave に更新をかけてはいけない
トランザクション分離レベル が READ-COMMITTED の時は、RBR しか利用できない
アーキテクチャ
MySQL のレプリケーション機能は 3つのスレッド で実装される。Master 側は 1 つ、Slave 側は 2 つ。
Binlog Dump Thread (Master Thread)
Master 側の Thread
COM_BINLOG_DUMP コマンドを Slave から受け取る
REPLICATION SLAVE 権限が必要
I/O (Receiver) Thread
Slave 側の Thread
目的 Master から受け取った更新を リレーログに記録する
手順
Master へ接続する
COM_BINLOG_DUMP コマンドを発行して Master から継続的に更新を受け取る
受け取った更新を リレーログ に記録する
SQL (Applier) Thread
Slave 側の Thread
目的 リレーログ の内容を Slave の Storage に適用する
特徴
I/O (Receiver) Thread とは非同期で動作する
実行に時間がかかるような SQL が存在しても、継続的にバイナリログを Master から受け取り続けることができる
Slave への反映の遅延は、この SQL の実行時間 によるもの
Slave での更新は、常に 1 つの SQL (Applier) Thread でのみ行われる
データの同一性を保証するために必要
Master にあまりにも追いつかない場合は、Sharding を検討する
手順
1. Executor が Storage, binlog に書き込む
2. Binlog Dump Thread が binlog を読む
3. I/O (Receiver) ThreadがBinlog Dump Threadからイベントを受け取りリレーログに書く
4. SQL (Applier) Threadがリレーログからイベントを読み取ってExecutorを叩く
https://gyazo.com/1607402d5ce77f319ad3dc97d9eaaee9
https://dev.mysql.com/doc/refman/5.6/ja/replication-implementation-details.html
https://www.slideshare.net/yoku0825/mysql-58490400/36
https://www.slideshare.net/yoku0825/mysql-58490400