2021/02/19 Japan.pm 2021 https://yapcjapan.connpass.com/event/198170/
Perl MongersのためのMySQL InnoDB Cluster超入門「それ、違うわよ」君はつぶやいた。「それは、村上龍」と続けたあと、僕の顔をのぞき込む。「村上龍だったっけ?」僕の言葉が聞こえなかったかのように、物憂げに窓の外に視線を移しながら君は話題を変えた。「レプリケーション」「レプリケーション?」「そう。レプリケーション。マルチマスターの」©sakaik2021/02/18yoku0825Japan.pm 2021
View Slide
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 RouterRead-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 RouterRead-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 Cluster3つのプロセスを協調動作させて “InnoDB Cluster” と呼んでいるグループレプリケーション(mysqld)データの同期とメンバーの管理に責任を持つ‐MySQL RouterRead-Write/Read-Onlyのメンバーへのルーティング(NATting)に責任を持つ‐MySQL Shell(常駐不要)グループレプリケーション操作のラッパーと、MySQL Routerが使うスキーマの作成をラップする‐46/48
Staytuned!!47/48
Any Questionsand/orSuggestions?48/48