MySQLのレプリケーション方式である非同期型レプリケーションについて勉強したので自分なりにまとめてみたぞ。
① クラアイント(アプリケーション)からMasterノードにコミット実行
② コネクションスレッドが、データへの書き込み&バイナリログへの書き込みを実行(どちらか片方のみ実行されるということはない(原始性保証))
③ ②が正常終了したことをクライアントへ応答する
※①-③はMasterノードで一貫されて行われる動作
④ SlaveのI/Oスレッドがバイナリログの更新情報を受け取る
⑤ I/Oスレッドがリレーログに書き込む
⑥ SQLスレッドがリレーログを読み込む
⑦ SQLスレッドがリレーログを読み取った順にデータへ書き込んでいく
なので、非同期型レプリケーションはMySQLのデフォルトであるものの、Masterノードがクラッシュした場合、それがコミットしたトランザクションがスレーブに転送しきれずにいる場合もあり得る。
Pacemaker/Corosyncなどでのクラスタリング環境にて、Masterノードへのコミットが常時行われている状態でのフェイルオーバーはデータロストの危険性がある。
このデータロストを担保するためには、準同期レプリケーションを採用するという手がある。
準同期レプリケーションでは、クライアントからのコミットをMasterノードで一旦完結させずに、Slaveのリレーログへの書き込みが完了した時点で、応答を返す。
データの一貫性は非同期型よりも勝っているが、毎回Slaveからの応答を待つため、その分がオーバーヘッドになり単純な反応速度は非同期型に劣る。