要测试 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 路由器已自动将我们重新连接到新的主节点实例,从而实现高可用性。