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