5.7からのデフォルトはAFTER_SYNC、それまでの設定はAFTER_COMMITに該当する
1 2 3 4 5 6 |
mysql> show variables like "rpl_semi_sync_master_wait_point"; +---------------------------------+------------+ | Variable_name | Value | +---------------------------------+------------+ | rpl_semi_sync_master_wait_point | AFTER_SYNC | +---------------------------------+------------+ |
準同期レプリケーション動作時のレプリケーション方式で、AFTER_SYNCはLossless型と言われている。
5.6までは、rpl_semi_sync_master_wait_pointというパラメータ自体なかった。
AFTER_COMMITでは、Slave側のストレージエンジンへのCOMMITが完了する前にクライアントへOKを返す。
あくまで、Slave側へのリレーログへの書き込みが完了したらクライアントへOKを返すので、データベースの状態は、常に一致しているとは言い切れない。
なので、Slaveが追従しているタイミングで、Masterが切り替わった場合、それまでに発行されてたクエリがないことになってしまう。
一方、AFTER_SYNCでは、COMMITする前にACK(受信確認)を待つようになっている。
ということは、Master上でCOMMITしたトランザクションは、SlaveでもCOMMITしたといえる。
なので、原則的にデータベースの内容は完全一致するはず。というすごくイケてるパラメータ。
(のはず。であっているよね( ^ω^)・・・)