るいすのブログ

オタクエンジニアの雑記

InnoDB Cluster のフェイルオーバー時間を計測してみる


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

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