Upgrade to Pro — share decks privately, control downloads, hide ads and more …

いまさらMySQLの非同期レプリケーションでのHAの難しさについて考える

Avatar for yoku0825 yoku0825
July 10, 2025
250

 いまさらMySQLの非同期レプリケーションでのHAの難しさについて考える

Avatar for yoku0825

yoku0825

July 10, 2025
Tweet

Transcript

  1. HAを考えるときの悩みポイント MySQLのレプリケーションは 非同期 (準同期レプリケーションを含む, グループレ プリケーションは除外する) ソースサーバのストレージエンジンに書く(= InnoDBログにwrite/fsyncする)のと ほぼ同時に バイナリログに書く(=

    write/fsyncする) 書き出されたバイナリログをレプリカサーバに 転送 レプリカサーバは転送されたバイナリログイベントを リプレイ することでスト レージエンジンを同期させる 6/19
  2. ストレージエンジンとバイナリログ ソースサーバーの一貫性はどうやら保てるらしい InnoDBログにfsyncしてからバイナリログにfsync(MySQL 8.0からInnoDBログライタース レッドが爆誕したのでwriteの順番は保証されない)してコミットが完了する 2PC between Binlog and InnoDB

    ‐ 分散でない(= 1プロセスの中の)2 Phase Commitだからクラッシュリカバリで辻褄を合わせら れるらしい ‐ バイナリログのfsync以降にCOMMIT OKを返す前にクラッシュしたら「書けてな いように見えるものが残る」のはそうなんだけれど それを言ったらクラッシュしてなくてもCOMMIT OKを返す前にTCP RSTとか走ったらそれは コミットできたと言えるのかどうかとか難しい話になりそう ‐ 7/19
  3. 強気な準同期レプリケーションでのフェンシング ソースが健全であれば切り替えの時に使う SET GLOBAL read_only = ON はフェイル オーバー中にはフェンシングできないことがある ソースが「刺さった」状態ならこのSQLはだいたい噛まれる

    ‐ 他のクエリも全部噛んでOKパケットを投げないことなんて保証できない 「噛んだ後にしばらくして復帰してくる」悲劇 ‐ ソースが一切のSQLを受け付けなくてもソースの更新を妨げる方法が必要 → 強気な準同期レプリケーション ‐ 12/19
  4. 強気な準同期レプリケーションでのフェンシング ソースが刺さったように見えたら? 全ての準同期レプリカで iptables でソースのIPアドレスをブロックする ソースにログインできなくてもソースでトランザクションがコミットされるのを防げる ‐ ソースの電源を落とす。落としきるまでは絶対に書き込ませ(= COMMIT OKを返させ)ない。

    電源が落ちるまでに復活したとして、 iptables がかかりきる前にSemisyncで渡った(=COMMIT OKを返した)部 分は必ず誰かが持っている iptables がかかりきった後のCOMMITは絶対成功しない(= COMMIT OKが返らない) COMMIT OKが返らなくてもバイナリログに書いている以上、 iptables をかけない(つもりでいる)非同期レプリカ は吸い上げてしまう可能性があるので作らせない ‐ 電源が確実に落ちたら iptables の解除&レプリカの昇格処理 ‐ 14/19
  5. バイナリログイベントのコンバージェンス ソースを確実に落としきれればあとは「一番バイナリログイベントを持っているレ プリカ」を次のソースに昇格させればいい GTIDだろうと何だろうと、もとのソースではバイナリログ上に直線的に記録されているので、 SHOW REPLICA STATUS の Source_Log_File と

    Read_Source_Log_Pos が最大になっているレプリカ が一番バイナリログを持っているレプリカ レプリカ同士で比較する時は Relay_Source_Log_File と Exec_Source_Log_Pos ではない。リレーログに入っている なら待てば Source_Log_File = Relay_Source_Log_File && Source_Log_File = Exec_Source_Log_Pos になる 変にSQLスレッド基準で比較すると、「せっかくリレーログまで吸い込んでるのにむざむざそれを捨てる」ことに なる ‐ 15/19