常见的几种场景
场景一:源端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,否则解析报错。




