• 検索結果がありません。

BEFORE_AND_AFTER

ドキュメント内 oct2019_b-2-1 (ページ 50-67)

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)

関連したドキュメント