group_replication_consistency=EVENTUAL
•
デフォルトの設定•
(書いたメンバーと違うメンバーから)古いデータを読み取ってしまう可能性がある
group_replication_consistency パラメータ
1. EVENTUAL (default) 2. BEFORE
3. BEFORE_ON_PRIMARY_FAILOVER 4. AFTER
5. BEFORE_AND_AFTER
group_replication_consistency=BEFORE
•
トランザクション開始時点のコミット済みの内容が 適⽤されるのを待つ•
最新のデータを読み取ることを保証•
例)以下のSELECT結果は最新のデータとなるmysql> SET group_replication_consistency=BEFORE;
mysql> SELECT c1 FROM tbl
group_replication_consistency=BEFORE
1 2
UPDATE c1=new
Apply
OK
ACK
Finilazied Finalized
mysql> SET group_replication_consistency=BEFORE mysql> SELECT c1 FROM tbl
適⽤待ち
…
SELECT
RETURN
•
⾚字の間が待ち時間となる•
wait_timeout を超えるとエラーgroup_replication_consistency=BEFORE
1 2
UPDATE c1=new
Apply
OK
ACK
Finilazied Finalized
mysql> SET group_replication_consistency=BEFORE mysql> SELECT c1 FROM tbl;
ERROR 3797 (HY000): Error while waiting for group transactions commit on
SELECT
動作の様⼦ (demo)
group_replication_consistency パラメータ
1. EVENTUAL (default) 2. BEFORE
3. BEFORE_ON_PRIMARY_FAILOVER 4. AFTER
5. BEFORE_AND_AFTER
シンプルな回避⽅法
•
古いデータの読み取りを回避する⼀番シンプルな⽅法•
1つのメンバーでRWすること•
ただし、切り替わり時に古いデータを読取るリスクはある
Master Read only
Master Read only Master
App
group_replication_consistency= BEFORE_ON_PRIMARY_FAILOVER
• 障害発⽣時の挙動を制御
• Single Primary 運⽤時にのみ有効
• 新プライマリがキャッチアップするまで結果を返さ
ない(クエリを待機させる)
group_replication_consistency パラメータ
1. EVENTUAL (default) 2. BEFORE
3. BEFORE_ON_PRIMARY_FAILOVER 4. AFTER
5. BEFORE_AND_AFTER
group_replication_consistency=AFTER
•
そのトランザクションで更新した内容が、以降のトランザ クションで、どのメンバーであっても読み取られることを 保証する。•
全てのノードで適⽤が完了するとクライアントにOKが返る動作の様⼦ (demo)
•
そのトランザクションで更新した内容が、以降のトランザ クションで、どのメンバーであっても読み取られることを 保証する。•
全てのノードで適⽤が完了するとクライアントにOKが返るAFTERの難しいところ・・・
1. (更新は順番に適⽤されていくため)AFTERで実⾏したト ランザクション以前の更新の適⽤も結果的に待つ
2. AFTERのトランザクションはタイムアウトしない
–
wait_timeout の値は適⽤されない3. AFTERのトランザクションをCOMMITした以降に開始され た他のトランザクションはすべてのノードでAFTER指定の 更新の適⽤が完了するまで、待たされる
動作の様⼦ (demo)
1. (更新は順番に適⽤されていくため)AFTERで実⾏したト ランザクション以前の更新の適⽤も結果的に待つ
2. AFTERのトランザクションはタイムアウトしない
–
wait_timeout の値は適⽤されない3. AFTERのトランザクションをCOMMITした以降に開始され た他のトランザクションはすべてのノードでAFTERの更新 の適⽤が完了するまで、待たされる
–
BEFORE 同様 wait_timeout を超えたらエラーgroup_replication_consistency パラメータ
1. EVENTUAL (default) 2. BEFORE
3. BEFORE_ON_PRIMARY_FAILOVER 4. AFTER
5. BEFORE_AND_AFTER
group_replication_consistency=BEFORE_AND_AFTER
•
BEFOREとAFTERを合わせた挙動•
最新のデータの適⽤を待ち、かつ、書いたデータが全てのメンバーに適⽤されたらクライアントにACKが返る
Consistency Level まとめ
設定値 利⽤ケース
EVENTUAL(デフォ) ある程度、古いデータを読み取っても問題ない⽤途
BEFORE ⼤半のトランザクションは古いデータを読み取っても構わ ないが、最新のデータを読み取ることを保証したい少数の トランザクションがある場合にその指定する。バッチ実⾏
時に最新のデータで処理したいなど。
ドキュメント内
oct2019_b-2-1
(ページ 50-67)