
MGR 主备集群实现异步连接故障转移
1.概述
MySQL 8.0.22 开始,支持异步连接故障切换机制,在现有主从复制连接失败后,自动建立到新主的异步复制连接。
MySQL 8.0.23 开始,异步连接故障切换机制还支持组复制拓扑,通过自动监视组成员身份的更改并区分主节点和从节点,在组复制主节点故障选出新主节点后,自动建立到新主的异步复制连接。
MySQL 8.0.26 开始,组复制可以设置组成员在特定情况下采取的操作,比如成员操作 mysql_disable_super_read_only_if_primary
当选择一个新的primary时,使处于单主模式的组保持超级只读模式,这样该组只接受复制的事务,不接受来自客户端的任何直接写操作。
MySQL 8.0.27 开始,异步连接故障切换机制还允许组复制作为副本,组的主节点发生故障时,新的主节点自动重新连接到源端。新增成员操作mysql_start_failover_channels_if_primary
,默认情况下,此成员操作是启用的,当启用此成员动作时,在"CHANGE replication SOURCE TO"
语句中为复制通道设置SOURCE_CONNECTION_AUTO_FAILOVER=1
时,组复制主节点复制通道上的异步连接故障转移将激活。
2.架构
MGR B 作为 MGR A 的备份
本次测试通过搭建2套MGR作为主备集群,进行异步连接故障切换测试:
(1)当主集群MGR A 的主节点发生故障时,备集群MGR B的主节点能够实现异步故障转移,自动连接MGR A 的新主节点,主备集群同步不断开,实现数据正常同步。
(2)当备集群MGR B 的主节点发生故障时,MGR B 的新主节点能够自动启动复制通道,自动连接MGR A 主节点,主备集群同步不断开,实现数据正常同步。
(3)设置MGR B成员行为,使处于单主模式的组 MGR B 保持超级只读模式,这样该组只接受复制的事务,不接受来自客户端的任何直接写。
3.测试
本次测试基于 MySQL 8.0.31,搭建2套MGR集群(单主模式)
3.1 搭建MGR集群
MGR A:
MGR B:
3.2 创建复制用户
在MGR A 的主节点创建用于复制的用户 repl_user
注意:这里复制用户需要有 performance_schema
库的select权限,主要用于获取MGR A集群成员的状态,如果没有这个权限,将不能进行异步连接故障转移。
3.3停止MGR B的组复制
在MGR B的所有节点停止组复制,可先停止从节点,避免发生节点切换
注意:这里停止组复制是为了下一步创建异步复制通道,如果不停止复制通道,在运行正常的MGR B 的主节点执行创建复制通道的语句,会导致从节点退出组,报如下错误:
3.4创建异步复制通道
在MGR B的所有节点创建异步复制通道
-
source_host
:MGR A 主节点的IP -
source_port
:MGR A 主节点的端口 -
source_connection_auto_failover=1
:表示开启自动故障转移功能。 -
source_connect_retry
:指定复制副本在与源端的连接超时后重新连接尝试之间的间隔(秒)。 -
source_retry_count
:设置复制副本在连接到源超时后进行的最大重新连接尝试次数。
3.5配置复制源
在MGR B 的主节点配置复制源
语法:
参数:
-
channel
:上面创建的复制通道名称; -
managed_type
:管理服务的类型,当前可传入的值必须是GroupReplication; -
managed_name
:管理组的识别符,即group_replication_group_name参数的值; -
host
:源端主机名; -
port
:源端端口号; -
network_namespace
:预留为将来使用,置空; -
primary_weight
:MGR主服务器的权重,值为1到100,值越大,优先级越高; -
secondary_weight
:MGR从服务器的权重,值为1到100,值越大,优先级越高;
3.6查看配置的用于异步连接切换的复制源
这里只显示刚才配置的一个节点,启动异步复制通道后就能看到MGR A所有节点。
3.7启动 MGR B 组复制
在MGR B 的主节点重新引导启动组复制
3.8启动异步复制通道
在MGR B的主节点启动
异步复制通道运行正常,至此MGR A 与 MGR B已建立主备关系,MGR A主节点与 MGR B 主节点建立异步复制通道。
3.9查看配置的用于异步连接切换的复制源
可以看到这里显示了 MGR A的所有节点信息,weight 最高的为主节点
3.10故障模拟:主集群MGR A 的主节点发生故障
(1)查看当前MGR A 信息
当前MGR A 主节点为 6001
(2)查看异步复制信息
登录MGR B 主节点查看
当前MGR B主节点 连接的是 MGR A的主节点 6001
(3)模拟MGR A故障
在MGR A主节点执行切主命令,模拟MGR A主节点故障,将6002设置为新主节点
(4)查看异步复制信息
登录MGR B 主节点查看
可以看到MGR B主节点已经自动进行异步连接故障转移,与MGR A新主节点6002建立连接并且连接正常,在此过程中并不需要人为去操作。
3.11故障模拟:备集群MGR B 的主节点发生故障
(1)查看当前MGR B信息
(2)查看异步复制信息
- 登录MGR B主节点6005
当前MGR B主节点与MGR A新主节点6002 异步复制连接正常
- 登录MGR B从节点6006
(3)模拟MGR B主节点故障
这里不能通过对MGR B执行切主命令模拟故障,会报如下错误:
我们通过停止组复制让MGR B主节点6005主动退出组,模拟故障
(4)查看当前MGR B信息
当前MGR B发生切主,新主节点为6006
(5)查看异步复制信息
登录MGR B新主节点6006
可以看到MGR B新主节点已经自动进行异步连接故障转移,与MGR A主节点6002建立连接并且连接正常,在此过程中并不需要人为去操作。
3.12 设置备集群MGR B为超级只读模式
配置MGR B集群所有节点为超级只读模式,避免执行误操作。默认情况下,MGR单主模式下主节点为读写模式,从节点为超级只读模式。
当一个组只是作为另一个组的备份的时候,只需要执行复制事物就可以了,不需要登录执行其他客户端事物,避免造成数据不一致的问题。因此我们可以通过 group_replication_disable_member_action()
函数设置成员操作,将备集群所有节点设置为超级只读模式,即使切主后选出新的主节点也要保持超级只读模式。
(1)查看MGR B当前成员操作
(2)设置MGR B为超级只读模式
注意:这里执行完此函数后,不会对当前主节点产生影响,当发生切主选择出新主节点后,会将新主节点设置为超级只读模式。
(3)停止MGR B主节点
MGR B新主节点为 6005
(4)查看MGR B新主节点是否进入超级只读模式
此时新主节点处于超级只读模式,不允许用户执行操作。
4.总结
通过异步连接故障切换机制,当复制连接出现问题时,不需要人工介入手动去重新建立复制连接,副本会自动进行异步故障转移与新的节点建立连接。
异步复制通道的建立只能在2个MGR集群的主节点上。
5.参考文档
1. https://dev.mysql.com/doc/refman/8.0/en/replication-asynchronous-connection-failover.html
2. https://dev.mysql.com/doc/refman/8.0/en/replication-asynchronous-connection-failover-replica.html
Enjoy GreatSQL :)
文章转载自公众号:GreatSQL社区
