2020年3月10日火曜日

グループレプリケーションのメンバーとInnoDB Clusterのメタデータと cluster.rescan()

TL;DR

  • グループレプリケーション(mysqldそのもの)が認識してるノードの情報は performance_schema.replication_group_members
  • InnoDB Clusterの中でMySQL ShellとMySQL Routerが使うノードの情報は mysql_innodb_cluster_metadata.instances
  • 整合性が取れなったら cluster.rescan でグループレプリケーション側の情報を正としてInnoDB Clusterのメタデータを修正できる

以下、 performance_schema.replication_group_members をメンバー、 mysql_innodb_cluster_metadata.instances をメタデータと略するます。

メンバーにいるけどメタデータにいないパターン

再現方法

  • 手で(=MySQL Shellを使わずに)グループレプリケーションのノードを追加したり、 メタデータのレコードを直接DELETEしたりするとなる

影響

  • MySQL Routerはメタデータ経由で接続先をバランシングするので、メタデータに載っていないノードにはMySQL Router経由でアクセスできない
    • 戯れにシングルプライマリーのプライマリーノードをメタデータから消したら、R/Wの6446ポートにアクセスできなくなった
  • MySQL Shellの動作もおかしくなる
    • シングルプライマリーのプライマリーノードをメタデータから消したら dba.getCluster できなくなった
      • SQLインターフェースで SELECT group_replication_set_as_primary(..) でスイッチしたらgetClusterはできるようになったけど
    • cluster.setPrimaryInstance とかも動かない
      • Cluster.setPrimaryInstance: This operation requires all the cluster members to be ONLINE (RuntimeError) って言われた

復旧

  • cluster.rescan はメンバーとメタデータを突き合わせて、メンバー(Group Replication上の状態を正として) に合わせてくれる
 MySQL  localhost:33060+ ssl  JS > cluster.rescan()
Rescanning the cluster...

Result of the rescanning operation for the 'myfabric' cluster:
{
    "name": "myfabric",
    "newTopologyMode": null,
    "newlyDiscoveredInstances": [
        {
            "host": "node3:3306",
            "member_id": "f95ce2c9-62a0-11ea-b1cc-12d40307b547",
            "name": null,
            "version": "8.0.19"
        }
    ],
    "unavailableInstances": []
}

A new instance 'node3:3306' was discovered in the cluster.
Would you like to add it to the cluster metadata? [Y/n]:
Adding instance to the cluster metadata...
The instance 'node3:3306' was successfully added to the cluster metadata.

メタデータにいるけどメンバーにいないパターン

再現方法

  • そのへんで STOP GROUP_REPLICATION するとあっさりこうなる

影響

  • MySQL Routerはメタデータとメンバーの状態をそれぞれSELECTしてルーティング先を決めるっぽいので特に影響はない

復旧

  • これも cluster.rescan() で何とかなる
 MySQL  localhost:33060+ ssl  JS > cluster.rescan()
Rescanning the cluster...

Result of the rescanning operation for the 'myfabric' cluster:
{
    "name": "myfabric",
    "newTopologyMode": null,
    "newlyDiscoveredInstances": [],
    "unavailableInstances": [
        {
            "host": "node2:3306",
            "label": "node2:3306",
            "member_id": "f96e7097-62a0-11ea-b1c0-12ae12a2047f"
        }
    ]
}

The instance 'node2:3306' is no longer part of the cluster.
The instance is either offline or left the HA group. You can try to add it to the cluster again with the cluster.rejoinInstance('node2:3306') command or you can remove it from the cluster configuration.
Would you like to remove it from the cluster metadata? [Y/n]: Y
Removing instance from the cluster metadata...
The instance 'node2:3306' was successfully removed from the cluster metadata.
cluster.rescan べんり!!

0 件のコメント :

コメントを投稿