暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

mysql mgr异步复制故障自动转移&搭载异步从库(灾备)的几种方案

原创 金同学 2023-05-22
1945

常见的几种场景

场景一:源端mgr+vip, 目标端:单实例        #建议mysql5.7.29以上版本

在接收者(R1)上配置异步复制,与绑定到源mgr主库(S1)的虚拟vip建立异步复制通道(C1),实现异步数据同步。


当S1发生故障时,VIP会自动漂移,同时触发异步复制线程重连,并自动更新复制源新主为S2,整个过程无需 DBA干预。


场景二:源端mgr, 目标端:单实例      #建议mysql8.0.23以上版本

在接收者(R1)上配置异步复制,与源mgr的主库(S1)建立复制通道C1。使用source_connection_auto_failover开启异步复制故障转移功能,并配置UDF自动收集、获取潜在源(组成员)。


发送者(S1)发生故障后,接收者将自动连接到故障转移权重最高的下一个可用源S2(新主)。同时源列表会在接收者(R1)上自动更新,整个过程无需DBA干预。


场景三:源端mgr, 目标端mgr       #适用于mysql8.0.27以上版本

发送者(源mgr主库)故障后的故障转移机制同场景二。另外接受者异步复制通道自动跟随MGR的主成员(目标端mgr主库)。即接收者R1(主库)发生故障时,目标端mgr主库发生切换,异步复制会自动发现并切换到mgr新主库(R2)。


接受者(R1)发生故障后,异步复制通道会自动跟随目标端主成员的变化,然后在故障节点R1上停止复制,在R2(新主)上开启复制,整个过程无需DBA干预。



部署方案及操作步骤

场景1:源端mgr+vip, 目标端:单实例

目标端配置异步复制,change master 指向源端vip。当源端主库发生切换时,复制线程触发检测重连机制,然后重新获取、定位新主gtid及binlog位置信息。

<1>环境信息

#源端(mgr) port:3307
172.16.89.71   Primary      VIP:172.16.89.74
172.16.89.72   Secondary
172.16.89.73   Secondary
#目标端(单实例)
172.16.89.75

<2>克隆数据

从源端mgr主节点克隆数据库到目标节点。   

说明:我部署的时候使用了mysql clone插件,大家也可以使用其他备份恢复工具,如mysqldump、xtrabackup、mysqlbackup等等。

#克隆过程
1)源端、目标端均安装克隆插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so'; 

2)源端(主库)创建克隆账号 
CREATE USER 'donor_clone'@'%' IDENTIFIED BY '123456';
GRANT BACKUP_ADMIN on *.* to 'donor_clone'@'%';

3)目标端添加doner_list
'将源端(mgr主库)地址添加到 clone_valid_donor_list 变量设置中'
SET GLOBAL clone_valid_donor_list = '172.16.89.71:3306';

4)目标端执行克隆
'克隆完成后会自动重启,稍等2分钟后重新登录'
CLONE INSTANCE FROM 'donor_clone'@'172.16.89.71':3306 IDENTIFIED BY '123456';

5)目标端查看克隆日志
SELECT STATE FROM performance_schema.clone_status;
SELECT STATE, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status;

<3>配置复制

1)源端(mgr主库)创建复制账号
CREATE USER 'replzb'@'%' IDENTIFIED WITH mysql_native_password by '20#123';
GRANT REPLICATION SLAVE ON *.* TO 'replzb'@'%';

2)目标端(接受方)创建一个复制通道,其中master_host指向源端(发送方)vip
change master to 
master_host='172.16.89.74',
master_port=3307,
master_user='replzb',
master_password='20#123',
master_auto_position=1;

3)目标端启动主从、查看同步状态
start slave;
show slave status\G;

4)测试验证
模拟源端主库故障,观察目标库异步复制线程的同步状态。

场景2:源端mgr, 目标端 单实例

mysql8.0.22发布了有关自动异步复制连接故障转移功能,并在mysql8.0.23有所增强,可以实现目标从库自动获知复制源(mgr)的成员身份变化。

MySQL官方文档:

https://dev.mysql.com/doc/refman/8.0/en/replication-asynchronous-connection-failover.html

<1>环境信息

#源端(mgr) port:3307
172.16.89.71   Secondary
172.16.89.72   Secondary
172.16.89.73   Primary
#目标端(单实例)
172.16.89.75

<2>配置异步复制

1)源端(mgr主库)创建复制账号
CREATE USER 'replzb'@'%' IDENTIFIED WITH mysql_native_password by '20#123';
GRANT REPLICATION SLAVE ON *.* TO 'replzb'@'%';
GRANT SELECT ON performance_schema.* TO 'replzb'@'%';  
#该权限用于访问mgr,自动收集和添加组成员

2)目标端(接受方)创建一个复制通道,source_host为发送方主库,异步复制通道命名为:C1
change replication source TO 
source_host='bmsmgrpro03',
source_user='replzb', 
source_password='20#123',
source_port=3307,
source_auto_position=1, 
source_connection_auto_failover=1,  #启用异步连接自动故障转移的功能
source_connect_retry=10,
source_retry_count=3,
for channel 'C1';

3)添加异步复制通道的备用源配置信息
#SELECT asynchronous_connection_failover_add_managed(channel, managed_type, managed_name, host, port,network_namespace, primary_weight, secondary_weight);

#查看managed_name的2个语句
SELECT @@group_replication_group_name  
show master status

#示例(添加备用源)
SELECT asynchronous_connection_failover_add_managed('C1', 'GroupReplication','04cec092-912b-4349-8545-575759097fa8','bmsmgrpro03',3307,'',80,60);

#添加后查看,是否自动收集和添加组成员
select channel_name,host,port,weight,managed_name from performance_schema.replication_asynchronous_connection_failover;

#查看复制通道C1是否启用异步连接自动故障转移功能
select channel_name,source_connection_auto_failover from performance_schema.replication_connection_configuration where channel_name = 'C1';


4)启动复制
start replica for channel 'C1';
#检查I/O线程状态
select channel_name,source_uuid,service_state from performance_schema.replication_connection_status\G;

扩展:删除源配置信息

SELECT asynchronous_connection_failover_delete_managed('C1', '04cec092-912b-4349-8545-575759097fa8');

场景3:源端mgr, 目标端mgr

从mysql8.0.27开始,两个mgr集群间的异步复制,可以利用异步连接故障转移机制实现集群节点故障auto failover。即目标端mgr主库异常时,异步复制通道会自动向目标端新主库同步数据。

注:目标端mgr集群必须是单主模式

<1>在mgr集群间配置异步复制

1)配置异步复制(接收方)  
#在目标端mgr的所有节点执行
CHANGE REPLICATION SOURCE TO 
SOURCE_HOST='bmsmgrpro03',
SOURCE_USER='replzb', 
SOURCE_PASSWORD='20#123',
SOURCE_PORT=3307,
SOURCE_AUTO_POSITION=1, 
SOURCE_CONNECTION_AUTO_FAILOVER=1,
SOURCE_CONNECT_RETRY=10,
SOURCE_RETRY_COUNT=3 
FOR CHANNEL 'yashen_C';

#Primary节点执行上面命令后,mgr的2个secondary节点会退出集群,
处理方法:依次在备节点执行以上命令后,执行start group_replication加入即可。


#在目标端mgr的主库执行
start replica for channel 'yashen_C';

2)配置故障转移
#在目标端mgr主库执行
SELECT asynchronous_connection_failover_add_managed('yashen_C', 'GroupReplication','04cec092-912b-4349-8545-575759097fa8','bmsmgrpro03',3307,'',80,60);

#查看,确认规则已开启
select CHANNEL_NAME, SOURCE_CONNECTION_AUTO_FAILOVER from performance_schema.replication_connection_configuration where channel_name='yashen_C';
#查看源成员列表(3个节点查看)
SELECT CHANNEL_NAME, HOST, PORT, WEIGHT, MANAGED_NAME FROM performance_schema.replication_asynchronous_connection_failover;

<2>故障转移测试

1)测试源端主库故障转移
#查看源端组成员
root@localhost: 13:38:  [(none)]> SELECT CHANNEL_NAME, HOST, PORT, WEIGHT, MANAGED_NAME FROM performance_schema.replication_asynchronous_connection_failover;
+--------------+-------------+------+--------+--------------------------------------+
| CHANNEL_NAME | HOST        | PORT | WEIGHT | MANAGED_NAME                         |
+--------------+-------------+------+--------+--------------------------------------+
| Yashen_C     | bmsmgrpro01 | 3307 |     60 | 04cec092-912b-4349-8545-575759097fa8 |
| Yashen_C     | bmsmgrpro02 | 3307 |     60 | 04cec092-912b-4349-8545-575759097fa8 |
| Yashen_C     | bmsmgrpro03 | 3307 |     80 | 04cec092-912b-4349-8545-575759097fa8 |
+--------------+-------------+------+--------+--------------------------------------+
3 rows in set (0.01 sec)

#模拟主库故障 在节点bmsmgrpro03上执行
stop group_replication;

#再次查看
root@localhost: 13:43:  [(none)]> SELECT CHANNEL_NAME, HOST, PORT, WEIGHT, MANAGED_NAME FROM performance_schema.replication_asynchronous_connection_failover;
+--------------+-------------+------+--------+--------------------------------------+
| CHANNEL_NAME | HOST        | PORT | WEIGHT | MANAGED_NAME                         |
+--------------+-------------+------+--------+--------------------------------------+
| Yashen_C     | bmsmgrpro01 | 3307 |     60 | 04cec092-912b-4349-8545-575759097fa8 |
| Yashen_C     | bmsmgrpro02 | 3307 |     80 | 04cec092-912b-4349-8545-575759097fa8 |
+--------------+-------------+------+--------+--------------------------------------+
2 rows in set (0.00 sec)

#查看复制信息,master_host已经切换
root@localhost: 13:47:  [(none)]> show replica status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: bmsmgrpro02
                  Master_User: replzb
                  Master_Port: 3307
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 7937
               Relay_Log_File: mysql-relay-bin-yashen_c.000004
                Relay_Log_Pos: 404
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

4)测试目标端故障转移
#模拟主节点切换
root@localhost: 13:36:  [(none)]> stop group_replication;
Query OK, 0 rows affected (4.11 sec)

root@localhost: 13:36:  [(none)]> start group_replication;
Query OK, 0 rows affected, 1 warning (6.45 sec)

#当前节点异步复制同步状态已经停止
root@localhost: 13:37:  [(none)]> 
root@localhost: 13:37:  [(none)]> show replica status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: bmsmgrpro03
                  Master_User: replzb
                  Master_Port: 3307
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 7937
               Relay_Log_File: mysql-relay-bin-yashen_c.000002
                Relay_Log_Pos: 404
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No


#在新主查看
root@localhost: 13:56:  [(none)]> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 010c9262-de56-11ed-8141-0050569c3e9f | mysqlpxcwjh01 |        3307 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
| group_replication_applier | 30e88deb-de57-11ed-913b-0050569ccca8 | mysqlpxcwjh03 |        3307 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
| group_replication_applier | 99671d60-de56-11ed-8d61-0050569cdf83 | mysqlpxcwjh02 |        3307 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

root@localhost: 13:57:  [(none)]> system hostname
mysqlpxcwjh01

#可以看到同步状态已经启动
root@localhost: 13:57:  [(none)]> show replica status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: bmsmgrpro02
                  Master_User: replzb
                  Master_Port: 3307
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 8304
               Relay_Log_File: mysql-relay-bin-yashen_c.000004
                Relay_Log_Pos: 771
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes


注意点

1、在mysql 8.0新版本中,复制相关的命令发生了变化。目前旧命令还可以正常使用,但是数据库会打印warning信息

change master to 变为 change replication source to
master_host      变为 source_host
master_user      变为 source_user
master_password  变为 source_password
master_port      变为 source_port
.....

2、两个mgr之间做异步复制是,目标端mgr必须是单主模式。

3、异步复制与组复制使用同一个账号。因为mgr异常后再次启动时,会优先读取到异步复制的账号,这样会导致mgr重组失败。

4、异步复制source_host配置主机名时,须将源端mgr主机名信息写入/etc/hosts,否则解析报错。

最后修改时间:2023-05-22 19:59:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论