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

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

Avatar for yoku0825 yoku0825
July 10, 2025
880

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

Avatar for yoku0825

yoku0825

July 10, 2025
Tweet

More Decks by yoku0825

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