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 に接続する。
この検証で何回かフェイルオーバーしたら
InnoDB Cluster フェイルオーバーしたら super-read-only 持ったまま primary に昇格されたんですがなんでやろなあ…🤯
— るいす (@lu_iskun_) October 7, 2019