要测试 InnoDB 集群高可用性是否正常工作,请通过终止实例来模拟意外停止。集群检测到该实例已离开集群,并重新配置自身。集群的重新配置方式取决于您使用的是单主节点集群还是多主节点集群,以及该实例在集群中的角色。
在单主节点模式下
如果当前主节点离开集群,则其中一个从属节点将被选为主节点,优先选择具有最低
server_uuid
的实例。MySQL 路由器将读写连接重定向到新选定的主节点。如果当前从属节点离开集群,MySQL 路由器将停止将只读连接重定向到该实例。
有关更多信息,请参阅 单主节点模式。
在多主节点模式下
如果当前“R/W”实例离开集群,MySQL 路由器将读写连接重定向到其他主节点。如果离开的实例是集群中最后一个主节点,则集群将完全消失,您将无法连接到任何 MySQL 路由器端口。
有关更多信息,请参阅 多主节点模式。
有多种方法可以模拟实例离开集群,例如,您可以强行停止实例上的 MySQL 服务器,或者在测试沙箱部署时使用 AdminAPI 的 dba.killSandboxInstance()
。在此示例中,有一个包含三个服务器实例的单主节点沙箱集群部署,侦听端口 3310 的实例是当前主节点。该实例意外离开集群,模拟方式是 终止
该实例。
例如,通过发出 JavaScript 命令
mysql-js> dba.killSandboxInstance(3310)
或者,通过发出 Python 命令
mysql-py> dba.kill_sandbox_instance(3310)
集群将检测到更改并自动选举新的主节点。
假设您的会话已连接到端口 6446(默认的读写经典 MySQL 协议端口),MySQL 路由器应该检测到集群拓扑结构的更改,并将您的会话重定向到新选定的主节点。要验证这一点,请使用 \sql
命令切换到 MySQL Shell 中的 SQL 模式,并选择实例的 port
变量,以检查您的会话已重定向到哪个实例。
第一个 SELECT
语句失败,因为与原始主节点的连接已断开,这意味着当前会话已关闭。MySQL Shell 会自动为您重新连接,当您再次发出命令时,将确认新的端口。
mysql-js> \sql
Switching to SQL mode... Commands end with ;
mysql-sql> SELECT @@port;
ERROR: 2013 (HY000): Lost connection to MySQL server during query
The global session got disconnected.
Attempting to reconnect to 'root@localhost:6446'...
The global session was successfully reconnected.
mysql-sql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3330 |
+--------+
1 row in set (0.00 sec)
在此示例中,端口 3330 上的实例已被选为主节点。此选举表明 InnoDB 集群已提供自动故障转移,MySQL 路由器已自动将我们重新连接到新的主节点实例,并且我们具有高可用性。