暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

MySQL8 MGR集群间异步复制的故障转移

原创 杨明翰 2021-11-15
15066

MySQL 8.0.22开始支持异步连接故障转移机制,在异步复制的主故障时,从库会基于配置的权重自动从备选主库列表中选择一个新的主库。8.0.23开始支持当源端是MGR时自动维护备选主库列表。8.0.27开始MGR集群(单主模式)作为备库时,如果备库的主发生切换则该机制将自动让新主从源库进行异步复制。

说人话就是从8.0.27开始,两个MGR集群间(备集群是单主模式)的异步复制,可以利用异步连接故障转移机制(asynchronous connection failover mechanism),实现集群节点级故障的auto failover。

使用这个机制需要满足以下要求:

  • 主备上必须开启GTID(gtid_mode=ON),且配置复制时需开启master_auto_position
  • 同一channel的备选主库都必须存在相同的复制用户;且该用户需要赋予performance_schema.*的SELECT权限
  • 要在change master语句中配置复制用户和密码,不能在start replication语句中指定
  • 8.0.27开始备集群的所有成员都需执行change replication source to命令配置异步复制channel。如想禁用此功能执行SELECT group_replication_disable_member_action("mysql_start_failover_channels_if_primary", "AFTER_PRIMARY_ELECTION");

下面简单测试下该机制的功能

1、搭建两个测试用MGR

为方便演示使用mysql shell 创建沙箱实例并配置MGR

dba.deploySandboxInstance(3315,{password:'123456'})
dba.deploySandboxInstance(3316,{password:'123456'})
dba.deploySandboxInstance(3317,{password:'123456'})
dba.deploySandboxInstance(3318,{password:'123456'})
dba.deploySandboxInstance(3319,{password:'123456'})
dba.deploySandboxInstance(3320,{password:'123456'})

#创建cluster1
\c root@127.0.0.1:3315
dba.createCluster('cluster1', {memberWeight:50})
var mycluster = dba.getCluster()
mycluster.addInstance('root@127.0.0.1:3316', {memberWeight:40})
mycluster.addInstance('root@127.0.0.1:3317', {memberWeight:30})

1.png

#创建cluster2
\c root@127.0.0.1:3318
dba.createCluster('cluster2', {memberWeight:50})
var mycluster = dba.getCluster()
mycluster.addInstance('root@127.0.0.1:3319', {memberWeight:40})
mycluster.addInstance('root@127.0.0.1:3320', {memberWeight:30})

2.png

2、配置从cluster1 到 cluster2的异步复制及故障转移

  • 创建用户
在master上执行
create user 'rep'@'%' identified by 'XXXXXX';
grant replication slave  on *.* to 'rep'@'%';
grant select on performance_schema.* to 'rep'@'%';
  • 配置异步复制
登录cluster2 的 所有节点执行【注意 这个命令必须在cluster2的所有节点运行】 change replication source to source_host='127.0.0.1',source_port=3315,source_user='rep',source_password='123456',source_auto_position=1,source_connection_auto_failover=1, MASTER_RETRY_COUNT=2 for channel 'channel999'; 登录cluster2 的primary节点执行 start replica for channel 'channel999';
  • 配置故障转移
#相关命令
asynchronous_connection_failover_add_managed(channel, managed_type, managed_name, host, port, network_namespace, primary_weight, secondary_weight)

其中
#channel:异步复制channel名
#managed_type:GroupReplication
#managed_name:源端group_replication_group_name值
#host:源host
#port:源端口
#network_namespace:'' 空字符
#primary_weight:主的权重
#secondary_weight:备的权重

示例:

SELECT asynchronous_connection_failover_add_managed('channel999', 'GroupReplication', 'd78d94a3-45e5-11ec-a8b6-000c298c47fa', '127.0.0.1', 3315, '', 80, 60);

#查询performance_schema.replication_connection_configuration 确认规则已开启
select CHANNEL_NAME, SOURCE_CONNECTION_AUTO_FAILOVER from performance_schema.replication_connection_configuration where channel_name='channel999';

3.png
4.png

#查询performance_schema.replication_asynchronous_connection_failover_managed 确认规则已创建
#查询performance_schema.replication_asynchronous_connection_failover 确认备选主列表

5.png

3、测试源端主库故障转移

  • 当前复制状态
    6.png

  • 关闭3315实例

7.png

8.png

  • 查看异步复制故障转移情况,可以看到已正常切换

9.png
10.png

  • 3315恢复后会自动加入备选主库列表中
    11.png

  • 如果源端为单主模式,效果类似;但需注意primary_weight 和 secondary_weight 会影响备库的选择
    12.png

  • 修改源端主备的权重

#删除原有策略
SELECT asynchronous_connection_failover_delete_managed('channel999', 'd78d94a3-45e5-11ec-a8b6-000c298c47fa');

#新增策略修改备库的权重高于主库
SELECT asynchronous_connection_failover_add_managed('channel999', 'GroupReplication', 'd78d94a3-45e5-11ec-a8b6-000c298c47fa', '127.0.0.1', 3315, '', 60, 80);

13.png

4、测试目标端故障转移

8.0.27开始目标端是单主模式的MGR,异步同步模式下 primary切换后,新主会自动连接源端;
14.png

关闭3318实例,3319被选为primary,并且自动开始从源端同步

15.png
16.png
17.png

  • 如想禁用此功能,在primary上执行以下命令。这样primary切换后,新主不会自动启动同步
select  group_replication_disable_member_action("mysql_start_failover_channels_if_primary", "AFTER_PRIMARY_ELECTION");

18.png

5、提示

  • 如未禁用目标端的故障转移mysql_start_failover_channels_if_primary,配置异步复制的命令change replication source to必须在备MGR所有节点执行
  • 删除策略执行命令SELECT asynchronous_connection_failover_delete_managed('channel999', 'd78d94a3-45e5-11ec-a8b6-000c298c47fa');
  • 如源端为单主模式,设置故障切换策略asynchronous_connection_failover_add_managed 时如调整主备权重,会导致备MGR切换复制源;
最后修改时间:2021-11-16 09:46:55
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论