Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Perl MongersのためのMySQL InnoDB Cluster超入門
Search
yoku0825
February 19, 2021
Technology
9.7k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Perl MongersのためのMySQL InnoDB Cluster超入門
2021/02/19 Japan.pm 2021
https://yapcjapan.connpass.com/event/198170/
yoku0825
February 19, 2021
More Decks by yoku0825
See All by yoku0825
MySQL 8.4 LTS to MySQL 9.7 LTS
yoku0825
0
230
MySQL Community EditionとMySQL Enterprise Editionから見たMySQLのHA方式の変遷
yoku0825
1
120
今、MySQLのバックアップを作り直すとしたら何がどう良いのかを考える旅
yoku0825
2
3.3k
2025年になってもまだMySQLが好き
yoku0825
8
7.9k
いまさらMySQLの非同期レプリケーションでのHAの難しさについて考える
yoku0825
3
1.6k
HeatWave をオンプレの MySQL と同じように使おうとしてみた!
yoku0825
0
370
MySQLのロックの種類とその競合
yoku0825
12
6.3k
MySQL 8.4 LTS が あらわれた
yoku0825
2
3.9k
ぼくたちはMySQL 8.1とどう生きるか
yoku0825
6
2.8k
Other Decks in Technology
See All in Technology
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
4
720
Goodbye ShellScript, Hello File-based App
shunsock
0
940
Mastering Agentic Development: Harness Engineering for Effective Coding Agents
konippi
3
490
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
6
740
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
9
1.1k
AI時代、データエンジニアが一番おもろい
genshun9
0
690
EventBridge に「合流」はない ― サーバーレスのワークフローを育てるということ / No Join in EventBridge
yusukeshimizu
2
530
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
5
730
Von-Neumann Machines, Dreams & The Futures of IT
ufried
0
130
[Kiro Meetup #7] Kiro Crew Dive Deep
konippi
0
300
「どのログを見ればいい?」 から始めた サーバーレス障害解析
y_waka1
1
140
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
110
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Being A Developer After 40
akosma
91
590k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Fireside Chat
paigeccino
43
4k
The Pragmatic Product Professional
lauravandoore
37
7.5k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
The Cost Of JavaScript in 2023
addyosmani
55
10k
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