$30 off During Our Annual Pro Sale. View Details »

MySQL Community EditionとMySQL Enterprise Editio...

Avatar for yoku0825 yoku0825
December 13, 2025

MySQL Community EditionとMySQL Enterprise Editionから見たMySQLのHA方式の変遷

2025/12/13 Open Source Conference 2025 Hiroshima
https://event.ospn.jp/osc2025-hiroshima/

Avatar for yoku0825

yoku0825

December 13, 2025
Tweet

More Decks by yoku0825

Other Decks in Technology

Transcript

  1. MySQLのHAの歴史 Shared Nothing, Active/Standby, ストレージデバイス同期型 というくくりにしてはみたけれど、オーバービューで見ると共有ストレージ型もやってることはほぼ一緒 ‐ オープンソースだけで組むならPacemaker + DRBD

    + heartbeatとかcolosyncとか バリエーションとしてCLUSTERPROとかLifeKeeper + DetaKeeperとか ‐ 2015年の公式のホワイトペーパーにもその存在が MySQLの高可用性ソリューション ‐ 5/44
  2. Pacemaker + DRBD + heartbeat これで組んでいたパターンはたまにあった MySQL 5.0からMySQL 5.5くらいまでの時代 ‐

    当時「インフラエンジニア」と呼ばれていた職種がDRBD周りのデバイスファイルもMySQLも見てい たことが多い気がする とかく「切り替わりに失敗する」「切り替わるとDRBDの再同期が大変」なイメージがある 7/44
  3. フェンシング サーバーは綺麗に電源停止するとは限らない SET GLOBAL read_only = ON が成功するとも、 mysqladmin shutdown

    が成功 するとも限らない メモリ不足によるスラッシング、ストレージレイヤの一時的な沈黙 切り替え中にプロセスが「復活」してきてしまうことがHAの一番の敵 12/44
  4. MySQLのHAの歴史 Shared Nothing, Active/StandbyまたはRead Replica, ネイティブレプリケーション型 MySQLのレプリケーション機能をHA用途に使うタイプ ‐ MySQLのレプリケーションは 単方向

    で 非対称 なため、「ソース, レプリカの切り替え(failover)処理」と、 それとは別に 「アプリケーションからの接続先の切り替え処理」が必要 ‐ モニター型としてMHA for MySQL, MySQL Multi Master, mysqlfailover, mysqlfabric, (GitHub) orchestrator プロキシ型として MySQL Proxy, ProxySQL, MariaDB MaxScale, MySQL Router 13/44
  5. MHA for MySQL これもMySQL 5.5から5.6、たまに5.7で動かしてるって話も聞いたような気がする 後年MySQL 5.6のGTIDにも対応した ‐ MySQLのレプリケーションは「レプリケーションソース」 vs

    「レプリカ」の非対称構成 当時はGTIDもなく、ログファイル名やポジション番号を間違えるだけでレプリケーション全体が崩れる世の中 ‐ 専門知識なしでもsystem perlとepelでssh越しにVIPフェイルオーバーができるとあって大いに 流行った ssh越しにifconfigコマンドを呼ぶVIPがよく使われていたと思う ‐ 15/44
  6. その頃の商用MySQL Oracle Linux + Oracle VM Manager DB技術者必見! 圧倒的な進化を続けるMySQLの最新機能 ‐

    レプリケーションによる高可用性構成 だけ3ページにわたってメリットデメリットを説明してい る(それだけニーズも実績も多かったのであろう…) MySQLの高可用性ソリューション ‐ つまりがレプリケーションベースのHAは公式にはなかった 18/44
  7. MySQLのHAの歴史 Shared Nothing, Active/Active, レプリケーション魔改造型 MySQLのレプリケーション機能をソースコードレベルで改造して使うタイプ ‐ Galera Cluster for

    {MySQL,MariaDB}, MariaDB Galera Cluster, Percona XtraDB Cluster 魔改造レプリケーションの層で多数決を取ってトランザクションを成功/失敗させるので奇数台構 成が基本 自分たちだけで複製を調停するので独立したマネージャーが不要で、非対称性のないフラット構成なため単純 なロードバランサーだけで冗長化ができる ‐ ProxySQLやMariaDB MaxScaleはL7プロキシなのでL4LBを使わずにL7LBとして使うこともできる ‐ 19/44
  8. Galera Cluster Codership Oy. (後にMariaDB Corpが買収) が開発した コンポーネントの名前が wsrep (Write

    Set REPlication) ‐ MySQLにwsrepを搭載したGalera Cluster for MySQL, MariaDBにwsrepを搭載した Galera Cluster for MariaDB(後にMariaDB Galera Cluster), Percona Server for MySQLにwsrepを搭載したPercona XtraDB Cluster 日本でも当時の Yahoo! JAPAN がPercona XtraDB Clusterを使っていたがそれ以外はそんなには聞か ない ‐ 本質的にMySQLのレプリケーションの延長線上にある(全ての書き込みを全てのノードに伝搬 する)ので書き込みはスケールしない 後にGroup Replicationとして似たようなコンセプトが本家にも実装された ‐ 21/44
  9. MySQLのHAの歴史 そもそもAmazon RDS for MySQLの台頭によりMySQLを手組みするニーズは減り始めた MySQL 5.6と同時期にMySQL公式からGTIDを前提とした mysqlfailover (MySQL Utilitiesの一部,

    更に言うならMySQL UtilitiesはMySQL Workbenchに同梱されたスクリプ ト群だった) が公開 自力でdaemonizeできることやSQL(3306番ポート)だけでレプリケーションの組み換えを行うあたりが新しかっ たが、VIPの付け替えやエンドポイントDNSの取り換えは --after-exec で自作するしかなかった ‐ MySQL 5.6の時点ではGTIDに対応する際の制約が大きく、そもそもGTID自体がまだ下火 ‐ MHA for MySQLは(おそらく、作者が思っていたよりもずっと)長生きした 25/44
  10. ポストMHA for MySQL Amazon AuroraのMySQL版さえ出た頃で、手組み人口は更に激減したころ MySQL 5.7(2015年)はAmazon Aurora(2014年)より後らしい ‐ 2014年にひっそりとorchestratorが作成され、2016年にGitHubのブログで紹介されている

    (この頃は github/orchestrator だった) オンラインALTER TABLEの gh-ost (2016年)より少し後に有名になった印象 ‐ あのGitHubが使っているということ、CLIとGUIがオールインワンだったところ、MHA for MySQLが終焉を迎えて いたこと ‐ 手組み組にはスクラッチ以外にはこの選択肢しか残っていない気がする 本家はアーカイブされてPerconaがフォークしたようだが… ‐ 26/44
  11. ポストMHA for MySQLになれなかった何か mysqlfailover は発展解消的に mysqlfabric にその座を明け渡した mysqlfabric も単体でMySQL Fabricと喧伝されたが、プロダクト的にはMySQL

    Utilitiesの枠を出られ なかった ‐ MySQL Fabricは「コネクタライブラリ自身がレプリケーションソースとレプリカのIPアドレスを認識し てルーティングするためVIPやDNSエンドポイントは不要」という触れ込みだった これが更に発展して、「MySQL RouterがMySQL Fabricと通信することで自動でルーティングが切り替わる」 方式が発表された ‐ こうなるともう完全に「 mysqlrouter をN+1で構成してLBにぶら下げる」「 mysqlrouter をアプリケー ションサーバに相乗りさせるサイドカー形式」でipvsadmフリーな環境が実現した これが今日のInnoDB Clusterにつながっている ‐ 個人的にMySQL Fabric + MySQL Routerに全ベットして盛大な負債を作った 27/44
  12. MySQLのHAの歴史 Shared Nothing, Active/Active, レプリケーション魔(?) 改造型 MySQLのレプリケーション機能をソースコードレベルで改造して使うタイプ ‐ あれ? どこかで聞いたような

    ‐ Group Replication, InnoDB Cluster (= Group Replication + MySQL Router + MySQL Shell), InnoDB ClusterSet (= InnoDB Cluster + 非同期レプリカ) 魔(?) 改造レプリケーションの層で多数決を取ってトランザクションを成功/失敗させるので奇数台 構成が基本 自分たちだけで複製を調停するので独立したマネージャーが不要で、非対称性のないフラット構成なため単純 なロードバランサーだけで冗長化ができる ‐ あれ? どこかで略 ‐ MySQL RouterはL7プロキシなのでL4LBを使わずにL7LBとして使うこともできる ‐ 29/44
  13. サンプル ### All 3 servers $ sudo firewall-cmd --change-interface=eth0 --zone=trusted

    ### ホスト名を使ってGroupReplicationを組むので名前解決できないといけない $ sudo cat << EOF >> /etc/hosts 192.168.0.200 vm-1 192.168.0.201 vm-2 192.168.0.202 vm-3 EOF $ sudo dnf install -y https://dev.mysql.com/get/mysql84-community-release- el9-2.noarch.rpm $ sudo dnf install -y mysql-community-server mysql-shell $ sudo mysqld --user=mysql --initialize-insecure 33/44
  14. サンプル ### Only vm-1 mysqlsh --js [email protected] c = dba.createCluster('galera_backend')

    c.addInstance("192.168.0.201") c.addInstance("192.168.0.202") 34/44
  15. サンプル ### App nodes $ sudo dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-2.noarch

    .rpm $ sudo dnf install -y mysql-router-community ### GroupReplication側でホスト名で管理しているので、Appからの問い合わせに対してもホスト名が返ってく るので解決できる必要がある $ sudo cat << EOF >> /etc/hosts 192.168.0.200 vm-1 192.168.0.201 vm-2 192.168.0.202 vm-3 EOF $ sudo mysqlrouter --user=mysqlrouter --bootstrap [email protected] -- conf-use-sockets $ sudo sed -i -b 's/^socket=\/tmp/socket=\/var\/lib\/mysqlrouter/' /etc/mysqlrouter/my sqlrouter.conf $ sudo sed -i -b 's/bind_address=0.0.0.0/bind_address=127.0.0.1/' /etc/mysqlrouter/mys 35/44
  16. その後の商用版MySQL MySQL 8.3 Enterprise Edition & Open Telemetry MySQL Replication

    Monitoring : Enhanced Features for the Enterprise Edition 37/44