Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Perl MongersのためのMySQL InnoDB Cluster超入門
Search
yoku0825
February 19, 2021
Technology
3
9.7k
Perl MongersのためのMySQL InnoDB Cluster超入門
2021/02/19 Japan.pm 2021
https://yapcjapan.connpass.com/event/198170/
yoku0825
February 19, 2021
Tweet
Share
More Decks by yoku0825
See All by yoku0825
MySQL Community EditionとMySQL Enterprise Editionから見たMySQLのHA方式の変遷
yoku0825
1
4
今、MySQLのバックアップを作り直すとしたら何がどう良いのかを考える旅
yoku0825
2
2.4k
2025年になってもまだMySQLが好き
yoku0825
8
5.9k
いまさらMySQLの非同期レプリケーションでのHAの難しさについて考える
yoku0825
3
1.2k
HeatWave をオンプレの MySQL と同じように使おうとしてみた!
yoku0825
0
270
MySQLのロックの種類とその競合
yoku0825
12
4.9k
MySQL 8.4 LTS が あらわれた
yoku0825
2
2.5k
ぼくたちはMySQL 8.1とどう生きるか
yoku0825
6
2.7k
2022年のMySQLerが20年前のMySQL 4.0に触ると何が起きるか
yoku0825
0
620
Other Decks in Technology
See All in Technology
文字列の並び順 / Unicode Collation
tmtms
3
610
大企業でもできる!ボトムアップで拡大させるプラットフォームの作り方
findy_eventslides
1
830
まだ間に合う! Agentic AI on AWSの現在地をやさしく一挙おさらい
minorun365
5
320
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.5k
MLflowダイエット大作戦
lycorptech_jp
PRO
1
140
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
1
350
Snowflakeでデータ基盤を もう一度作り直すなら / rebuilding-data-platform-with-snowflake
pei0804
6
1.6k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
20251218_AIを活用した開発生産性向上の全社的な取り組みの進め方について / How to proceed with company-wide initiatives to improve development productivity using AI
yayoi_dd
0
120
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
390
AWS運用を効率化する!AWS Organizationsを軸にした一元管理の実践/nikkei-tech-talk-202512
nikkei_engineer_recruiting
0
100
Oracle Cloud Infrastructure IaaS 新機能アップデート 2025/09 - 2025/11
oracle4engineer
PRO
0
160
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Visualization
eitanlees
150
16k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
A Tale of Four Properties
chriscoyier
162
23k
Documentation Writing (for coders)
carmenintech
77
5.2k
Navigating Team Friction
lara
191
16k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Transcript
Perl Mongersのための MySQL InnoDB Cluster超入門 「それ、違うわよ」君はつぶやいた。「それは、村上龍」と続けたあと、僕の顔をのぞき込む。 「村上龍だったっけ?」僕の言葉が聞こえなかったかのように、物憂げに窓の外に視線を移しながら君は話題を変えた。 「レプリケーション」「レプリケーション?」「そう。レプリケーション。マルチマスターの」 ©sakaik 2021/02/18
yoku0825 Japan.pm 2021
Chiba.pmの方 から来ました 1/48
Chiba.pmの “m” はMySQLの “m” ※諸説あり 2/48
What’s InnoDB Cluster? 初出は2017/04 (MySQL 5.7.18) 比較的新しい と言うほどではなかった… ‐ 3つのプロセスを協調動作させて
“InnoDB Cluster” と呼んでいる グループレプリケーション(mysqld) データの同期とメンバーの管理に責任を持つ ‐ MySQL Router Read-Write/Read-Onlyのメンバーへのルーティング(NATting)に責任を持つ ‐ MySQL Shell(常駐不要) グループレプリケーション操作のラッパーと、MySQL Routerが使うスキーマの作成をラップする ‐ 3/48
\こんばんは/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter:
@yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ 4/48
What’s InnoDB Cluster? 初出は2017/04 (MySQL 5.7.18) 比較的新しい と言うほどではなかった… ‐ 3つのプロセスを協調動作させて
“InnoDB Cluster” と呼んでいる グループレプリケーション(mysqld) データの同期とメンバーの管理に責任を持つ ‐ MySQL Router Read-Write/Read-Onlyのメンバーへのルーティング(NATting)に責任を持つ ‐ MySQL Shell(常駐不要) グループレプリケーション操作のラッパーと、MySQL Routerが使うスキーマの作成をラップする ‐ 5/48
よういするもの 6/48
MySQL Shellでdba.configureInstanceします 7/48
それを受けてMySQLはグループレプリケーション専用アカウントを作ります 8/48
他のノードにも実行します 9/48
MySQL Shellでdba.createClusterします 10/48
最初の1台でグループレプリケーションが開始されました 11/48
cluster.addInstanceで他の2台をクラスターに追加します 12/48
これでグループレプリケーションは完了です 13/48
グループレプリケーションの参加ノードは、お互いを相互に監視しています 14/48
どこか1か所のキープアライブが途切れると 15/48
自分が大多数かどうかを確かめる (多数派に属していればグループレプリケーションを継続できる。 この場合は3台とも利用可能なまま) 16/48
ノードダウンやネットワーク障害で1ホストが完全に通信不能になると 17/48
それぞれのノードが自分が多数派かどうかを考えて 18/48
少数派は group_replication_exit_state_action の動作をする (デフォルトはread_only) 19/48
多数派は少数派をグループレプリケーションにいないと認識する 20/48
シングルプライマリーモードでプライマリーサーバーが切り離された場合、 残った中から分散合意で新しいプライマリーサーバーを選出する 21/48
それぞれのノードがグループレプリケーションを「どう」認識しているかは、 performance_schema.replication_group_membersで観測可能 22/48
弾き出されたノードはcluster.rejoinInstanceまたは group_replication_autorejoin_triesや group_replication_start_on_bootで復帰可能 23/48
再度参加できればそのまま元通りに (バイナリログ適用による追い付くまでのラグはあるけど) 24/48
さて、MySQL Routerからグループレプリケーションにアクセスする方法 25/48
の前に(時を戻そう) 26/48
MySQL Shellがdba.createClusterした時 27/48
MySQL Shellがdba.createClusterした時 28/48
cluster.addInstanceで他の2台をクラスターに追加した時 29/48
cluster.addInstanceで他の2台をクラスターに追加した時 30/48
MySQL Routerは --bootstrap で初期化する時に 31/48
mysql_innodb_cluster_metadata.instancesにアクセスして 32/48
/var/lib/mysqlrouter/state.json にストアする 33/48
この時ストアするのは「メタデータノード」と呼ばれ 34/48
「このノードにアクセスすれば、 performance_schema.replication_group_membersで グループレプリケーションを観測できるはず」という 問い合わせ先候補 35/48
bootstrapが済んで起動後のMySQL Routerに DBI:: connect します 36/48
MySQL Routerはメタデータノードを選んで (first aliveで先頭から最初に接続できたノード) 37/48
メタデータをフェッチしてオンメモリにキャッシュします (実際はバックグラウンドスレッドによる非同期、 デフォルトTTL=0.5秒) 38/48
6446ポートならRead-Writeでプライマリーサーバー宛てなので 39/48
mysqlrouterプロセスが接続元であるようにNAPTして、 プライマリーサーバーに転送します 40/48
こんな感じ です 41/48
MySQL InnoDB Cluster超入門 mysql_innodb_cluster_metadata.instances はMySQL Shellによって更新されたり されなかったりすることを期待している 「メタデータの取得候補」なので、リアルタイムに反映されなくても「どれか一つに到達でき ればOK」 ‐
このテーブル自体、グループレプリケーションによって同じデータが反映されていることを期 待する ‐ performance_schema.replication_group_members はグループレプリケーションに よってリアルタイムに正しく更新されることを期待している このテーブルの中身のキャッシュであるメタデータキャッシュのTTLが (グループレプリケー ション側でのフェイルオーバー/スイッチオーバーが終わったあとの) 切り替えにかかる時間 ‐ STATEがERRORになっていたら迂回するなど基本的な機能はある ‐ 42/48
MySQL InnoDB Cluster超入門 グループレプリケーション単体で使うことも可能(その場合はInnoDB Clusterとは 呼ばないけれども) MySQL Routerが嫌ならConsulやVIPとか既存の仕組みと組み合わせることもできる ‐ なんならDBD::innodb_clusterとか作ってmysqlrouterプロセスの代わりをさせることもでき
る気がする ‐ クラスタ管理用のデーモンがいなくて良いのは楽で良い グループレプリケーション(N*2+1とでも呼ぶか), MySQL Router(N)もいずれも、マスター/ レプリカのような非対称性がない ‐ MySQL Shellは使いたい時に、グループレプリケーション管理用のアカウントで接続さえでき れば良い(なんなら、そのたびにアカウントを作ったって良い) ‐ 43/48
MySQL InnoDB Cluster超入門 マスター/レプリカのポートの打ち分けはアプリケーション側の責務 クエリーの中身をパースして I や U だったらマスターに振る…とかは一切しない ‐
パースしないからこそMySQL over SSLでも特に設定変更は要らないし ‐ トランザクションやロック、 LAST_INSERT_ID() が途中ですげ変わる心配もない ‐ DBD::mysql (やその他の接続ライブラリ) からは完全に透過的に振る舞う mysqlrouterは本当にNAPTするくらいしかパケットに触らない ‐ 44/48
The next step for MySQL InnoDB Cluster超入門 グループレプリケーションは監視方法がガラっと違う SHOW REPLICA
/* (SLAVE) */ STATUS はからっぽ ‐ performance_schema.replication_group_member_stats とかを監視していく Release yt-healthcheck supports –role=group_replication · yoku0825/ytkit ‐ mysqlrouterが新しい障害点として現れる ヘルスチェック用のエンドポイント、mysqlrouter越しに SELECT 1 でもするようにしておくと いいかも ‐ 45/48
InnoDB Cluster 3つのプロセスを協調動作させて “InnoDB Cluster” と呼んでいる グループレプリケーション(mysqld) データの同期とメンバーの管理に責任を持つ ‐ MySQL
Router Read-Write/Read-Onlyのメンバーへのルーティング(NATting)に責任を持つ ‐ MySQL Shell(常駐不要) グループレプリケーション操作のラッパーと、MySQL Routerが使うスキーマの作成をラップする ‐ 46/48
Stay tuned!! 47/48
Any Questions and/or Suggestions? 48/48