要测试 InnoDB Cluster 高可用性是否有效,请通过终止实例来模拟意外停止。集群检测到实例离开集群并重新配置自身的事实。集群如何重新配置自身取决于您使用的是单主集群还是多主集群,以及实例在集群中扮演的角色。
在单主模式下:
如果当前主实例离开集群,则其中一个辅助实例被选为新的主实例,实例优先级最低
server_uuid
。MySQL Router 将读写连接重定向到新选出的主节点。如果当前的辅助节点离开集群,MySQL Router 将停止将只读连接重定向到该实例。
有关详细信息,请参阅 单主模式。
在多主模式下:
如果当前的“R/W”实例离开集群,MySQL Router 会将读写连接重定向到其他主实例。如果留下的实例是集群中的最后一个主实例,则集群完全消失,您无法连接到任何 MySQL 路由器端口。
有关详细信息,请参阅 多主模式。
有多种方法可以模拟离开集群的实例,例如,您可以强制停止实例上的 MySQL 服务器,或者
dba.killSandboxInstance()
如果测试沙箱部署则使用 AdminAPI。在此示例中,有一个具有三个服务器实例的单主沙箱集群部署,侦听端口 3310 的实例是当前主实例。实例意外离开集群,由
killing
实例模拟:
例如,通过发出 JavaScript 命令:
mysql-js> dba.killSandboxInstance(3310)
或者,通过发出 Python 命令:
mysql-py> dba.kill_sandbox_instance(3310)
集群检测到变化并自动选择一个新的主节点。
假设您的会话连接到端口 6446,默认的读写经典 MySQL 协议端口,MySQL 路由器应该检测集群拓扑的变化并将您的会话重定向到新选出的主节点。要验证这一点,请使用命令在 MySQL Shell 中切换到 SQL 模式\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 Cluster 提供了自动故障转移,MySQL Router 已经自动将我们重新连接到新的主实例,并且我们具有高可用性。