InnoDB Cluster

環境は MySQL 8.0.17
Single-Primary

パターンは下記2つ

  • クエリが少ないとき
  • クエリが多いとき

シェルスクリプトで1秒ごとに MySQL Router の 6446 に対して select @@hostname を実行。

クエリが少ないとき

02:58:08: db03
02:58:13: db01

5秒で切り替わった。

クエリが多いとき

sysbench で下記コマンドを実行中

sysbench /usr/share/sysbench/oltp_write_only.lua --db-driver=mysql --table-size=1000000 --mysql-host=127.0.0.1 --mysql-port=6446 --mysql-password='' --mysql-user=root --time=60 --db-ps-mode=disable --threads=128 run
05:48:11: db03
05:48:13:
05:48:17: db02

負荷が小さいかったかも

最低5秒以上で MySQL Router は新プライマリへ切り替わる

お使いの環境によりますが

MySQL Router のメタデータが更新されるタイミング

GR はお互いに監視しあっているのでどっかのタイミングである MySQL Server が死んだらそれ以外の GR メンバーの performance_shcema にはそのことがリアルタイムで反映される。
そして、MySQL Router が自身が持つメタデータを最新に保つためにクラスタのあるサーバーと接続され続ける。(多分 Primary だと思う)

{
"clusterName": "main",
"defaultReplicaSet": {
"name": "default",
"primary": "db02:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"db01:3306": {
"address": "db01:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE",
"version": "8.0.17"
},
"db02:3306": {
"address": "db02:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE",
"version": "8.0.17"
},
"db03:3306": {
"address": "db03:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE",
"version": "8.0.17"
},
"db04:3306": {
"address": "db04:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE",
"version": "8.0.17"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "db02:3306" ← これのこと
}

Single-Primary 環境で MySQL Router はデフォルトで 6446 -> R/W になり、6447 -> R/O にフォワードされる。
フェイルオーバーが起きたときにどうやって Primary が切り替わるかと言うと

クエリが失敗するとそれをトリガーに MySQL Router がメタデータを更新するために他の MySQL Server に接続する。

dev.mysql.com

この検証で何回かフェイルオーバーしたら