Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MySQL Community EditionとMySQL Enterprise Editio...
Search
yoku0825
December 13, 2025
Technology
1
20
MySQL Community EditionとMySQL Enterprise Editionから見たMySQLのHA方式の変遷
2025/12/13 Open Source Conference 2025 Hiroshima
https://event.ospn.jp/osc2025-hiroshima/
yoku0825
December 13, 2025
Tweet
Share
More Decks by yoku0825
See All by yoku0825
今、MySQLのバックアップを作り直すとしたら何がどう良いのかを考える旅
yoku0825
2
2.6k
2025年になってもまだMySQLが好き
yoku0825
8
6.2k
いまさらMySQLの非同期レプリケーションでのHAの難しさについて考える
yoku0825
3
1.2k
HeatWave をオンプレの MySQL と同じように使おうとしてみた!
yoku0825
0
280
MySQLのロックの種類とその競合
yoku0825
12
5k
MySQL 8.4 LTS が あらわれた
yoku0825
2
2.7k
ぼくたちはMySQL 8.1とどう生きるか
yoku0825
6
2.7k
2022年のMySQLerが20年前のMySQL 4.0に触ると何が起きるか
yoku0825
0
830
テストデータが偏るということについて
yoku0825
3
9k
Other Decks in Technology
See All in Technology
ソフトウェアエンジニアとAIエンジニアの役割分担についてのある事例
kworkdev
PRO
1
350
Knowledge Work の AI Backend
kworkdev
PRO
0
340
Claude Codeを使った情報整理術
knishioka
15
11k
SES向け、生成AI時代におけるエンジニアリングとセキュリティ
longbowxxx
0
270
MySQLのSpatial(GIS)機能をもっと充実させたい ~ MyNA望年会2025LT
sakaik
0
190
Introduce marp-ai-slide-generator
itarutomy
0
170
[2025-12-12]あの日僕が見た胡蝶の夢 〜人の夢は終わらねェ AIによるパフォーマンスチューニングのすゝめ〜
tosite
0
230
AI駆動開発ライフサイクル(AI-DLC)の始め方
ryansbcho79
0
280
Agentic AIが変革するAWSの開発・運用・セキュリティ ~Frontier Agentsを試してみた~ / Agentic AI transforms AWS development, operations, and security I tried Frontier Agents
yuj1osm
0
170
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
0
560
TED_modeki_共創ラボ_20251203.pdf
iotcomjpadmin
0
190
Oracle Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
2
590
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
527
40k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
76
Balancing Empowerment & Direction
lara
5
830
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
1
330
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
400
Automating Front-end Workflow
addyosmani
1371
200k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Un-Boring Meetings
codingconduct
0
170
How GitHub (no longer) Works
holman
316
140k
Transcript
MySQL Community EditionとMySQL Enterprise Editionから見たMySQLのHA方式の 変遷 2025/12/13 Oracle ACE Pro(MySQL)
yoku0825
\おはようございます/ yoku0825@とある企業のDBAだったもの オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitterだったもの:
@yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会副代表 ‐ MySQL Casual ‐ 1/44
おことわり 個人の観測内容であり、所属する組織、所属しない組織の意見を一切代表するものではありま せん 2/44
まとめ 公式, コミュニティ製入り乱れたけど今ならMySQL InnoDB Clusterが一番手軽で一番確実 非同期/準同期レプリケーションのフェイルオーバーやACIDの保証は難しすぎる ‐ MySQL Routerの扱いをどうするかは個々の事情に合わせた方が良さそう ‐
図は2台構成で書いてますが2台にするよりは3台にするのが激しくお勧め MySQL自体は2台で済ませる場合でも第三者ノードを作った方が無難 ‐ 3/44
では歴史をさか のぼっていきます 4/44
MySQLのHAの歴史 Shared Nothing, Active/Standby, ストレージデバイス同期型 というくくりにしてはみたけれど、オーバービューで見ると共有ストレージ型もやってることはほぼ一緒 ‐ オープンソースだけで組むならPacemaker + DRBD
+ heartbeatとかcolosyncとか バリエーションとしてCLUSTERPROとかLifeKeeper + DetaKeeperとか ‐ 2015年の公式のホワイトペーパーにもその存在が MySQLの高可用性ソリューション ‐ 5/44
Pacemaker + DRBD + heartbeat 6/44
Pacemaker + DRBD + heartbeat これで組んでいたパターンはたまにあった MySQL 5.0からMySQL 5.5くらいまでの時代 ‐
当時「インフラエンジニア」と呼ばれていた職種がDRBD周りのデバイスファイルもMySQLも見てい たことが多い気がする とかく「切り替わりに失敗する」「切り替わるとDRBDの再同期が大変」なイメージがある 7/44
その頃の商用版MySQL MySQL最新動向 8/44
ストレージデバイス同期型と共有ストレージ型の違い 9/44
ストレージデバイス同期型と共有ストレージ型の違い 単に共有ストレージにすると高くつくだけ 共有ストレージ前提のクラスタ用ソフトウェアには共有ストレージを使ったフェンシング機能がついて いる バックエンドをモノリシックにするからこそ得られるメリットだと思う ‐ 10/44
フェンシング 11/44
フェンシング サーバーは綺麗に電源停止するとは限らない SET GLOBAL read_only = ON が成功するとも、 mysqladmin shutdown
が成功 するとも限らない メモリ不足によるスラッシング、ストレージレイヤの一時的な沈黙 切り替え中にプロセスが「復活」してきてしまうことがHAの一番の敵 12/44
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
MHA for MySQL 14/44
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
ProxySQL 16/44
ProxySQL ProxySQLはフェイルオーバー機能は持たない、接続の切り替えのみ MariaDB MaxScaleはフェイルオーバー機能も持ってる ‐ MHA for MySQLでVIPを使いたくない場合の接続先切り替えや、後述のフェイルオーバー機構 の要らないGalera Replicationと組み合わせて使う
あるいは、フェイルオーバー自体はエンジニアがやるようなパターン ‐ 17/44
その頃の商用MySQL Oracle Linux + Oracle VM Manager DB技術者必見! 圧倒的な進化を続けるMySQLの最新機能 ‐
レプリケーションによる高可用性構成 だけ3ページにわたってメリットデメリットを説明してい る(それだけニーズも実績も多かったのであろう…) MySQLの高可用性ソリューション ‐ つまりがレプリケーションベースのHAは公式にはなかった 18/44
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
Galera Cluster 20/44
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
MySQLのHAの歴史 Shared Nothing, Active/Standby?, バイナリログ加工型 バイナリログの出力までをMySQLネイティブな部分で、バイナリログの伝搬と反映の部分を管理 ‐ Tungsten Replicatorという老舗があるが使ったことはない 日本で「試してみた」以上の話を聞いたことがない…
‐ 22/44
Tungsten Replicator? 23/44
Tungsten Replicator? レプリカI/OスレッドとレプリカSQLスレッドが担当していた「バイナリログの転送」と「バイナリログイベ ントのリプレイ」を独自のプロセスが担当する ネイティブなレプリケーションは「ソースはバイナリログを手渡すところまでしか知らない」のに対し、独自の作り込み ならではの制御ができる…はず ‐ 1年くらい前の時点で、DebeziumでMySQL 5.7のバイナリログをMySQL 8.0のインスタンスに
流して、切り替え後は8.0から5.7にロールバック用に流すという猛者を見た MySQL本体にあるレプリケーション非互換も、別実装だからこそ吸収できる ‐ 24/44
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
ポスト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
ポスト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
MySQL Fabricの教訓 バグは多かった その割にバグレポートは少なかった 「誰も使わない機能は、どれだけたくさんの目玉があってもバグは登録されない」 ‐ バグレポートをしても微塵も直らなかった 「誰も使わない機能は略 ‐ その意味に気が付いた頃にはもう引き返せないところまで来ていた()
‐ 公式だからと思って油断してはいけない 28/44
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
InnoDB Cluster 30/44
その頃の商用版MySQL MySQL Enterprise High Availability 31/44
Σ(゚д゚lll) GPL 版と同じ機能 32/44
サンプル ### 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
サンプル ### 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
サンプル ### 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
ね、簡単で しょ 36/44
その後の商用版MySQL MySQL 8.3 Enterprise Edition & Open Telemetry MySQL Replication
Monitoring : Enhanced Features for the Enterprise Edition 37/44
( ゚д゚) 38/44
( ゚д゚ ) 39/44
(゚д゚ ) 40/44
忘れてた… 41/44
MySQL Carrier Grade Edition MySQL Cluster(MySQL NDB Cluster)の商用版 GPL版のNDBCLUSTER自体が今日話してきた仕組みとは全く違う方法でHAを実装している どちらかというとストレージデバイス同期型に近い動きはするんだけれど
‐ MySQL :: MySQL 8.4 Reference Manual :: 25.2 NDB Cluster Overview 42/44
まとめ 公式, コミュニティ製入り乱れたけど今ならMySQL InnoDB Clusterが一番手軽で一番確実 非同期/準同期レプリケーションのフェイルオーバーやACIDの保証は難しすぎる ‐ MySQL Routerの扱いをどうするかは個々の事情に合わせた方が良さそう ‐
図は2台構成で書いてますが2台にするよりは3台にするのが激しくお勧め MySQL自体は2台で済ませる場合でも第三者ノードを作った方が無難 ‐ 43/44
Any Question and/or Suggestion? 44/44