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

MySql Innodb Cluster 之间使用Clone插件迁移数据

原创 微尘 2021-12-20
1148

===

可选方案

将A 套MySql Innodb Cluster数据迁移到B 套MySql Innodb Cluster,可选方案如下,三种方案都可以将割接操作步骤压缩为断开A->B主从同步关系,尽量将数据迁移同步等复杂操作放到准备工作中。

  1. 使用mysqldump mydumper 进行数据迁移入 B 套,然后使用–replicate-do-db 功能(指定主从同步只同步某些数据库)建立A -> B的主从同步,在割接期间只需断开A->B主从同步关系。

  2. 使用物理备份软件Xtrabackup Mysql backup进行数据迁移,然后使用–replicate-do-db 功能建立A->B的主从同步,再恢复B套MGR(步骤同恢复B套MGR集群),重新配置B 套INNODB CLUSTER(步骤同恢复B套MGR集群 ),在割接期间只需断开A->B主从同步关系。

  3. 使用MYSQL 克隆功能进行数据迁移,然后建立A->B的主从同步,然后使用–replicate-do-db 功能建立A->B的主从同步,再恢复B套MGR(步骤同恢复B套MGR集群),重新配置B 套INNODB CLUSTER(步骤同恢复B套MGR集群 ),在割接期间只需断开A->B主从同步关系。

本文档演示方案3的操作。

演示环境

B套集群已经部署为MySql Innodb Cluster,初始业务数据为空。


IP 主机名 角色 数据目录 端口 版本

源端A 10.9.50.112 mycl112 PRIMARY /mysql/ 3306 Mysql 8.0.19

源端A 10.9.50.113 mycl113 SECONDARY /mysql/ 3306 Mysql 8.0.19

源端A 10.9.50.114 mycl114 SECONDARY /mysql/ 3306 Mysql 8.0.19

目标B 10.9.50.107 mycl107 PRIMARY /mysql/ 3306 Mysql 8.0.19

目标B 10.9.50.108 mycl108 SECONDARY /mysql/ 3306 Mysql 8.0.19

注释:源端:A 套集群 目标:B套集群


克隆前置条件

Doner 和 recipient 可理解为源(数据提供者)和目标(数据接收者)。

  • donor和recipient必须版本相同

  • clone插件要求8.0.17及以上版本

  • 在donor和recipient都需要安装clone插件

  • 克隆用户需要BACKUP_ADMIN权限来访问和传输数据

  • 克隆期间group replication必须停止

  • donor和recipient必须运行在相同的操作系统平台上

  • donor和recipient必须有相同的字符集和校验规则

  • donor和recipient必须有相同的 innodb_page_size 和 innodb_data_file_path 参数配置

  • recipient 上必须有足够的磁盘空间存储克隆数据

克隆限制

  • 源端在克隆操作期间,DDL包含truncate table不允许执行,DML可以执行。

  • 克隆操作不能并发执行,同一时间只能克隆一个节点。

  • 克隆操作不支持对MySQL配置信息进行克隆,包括my.cnf中的配置信息。

  • 克隆操作不支持对binlog日志进行克隆。

  • 克隆操作针对InnoDB引擎的表进行克隆,非InnoDB表,比如MyISAM,CSV等,只克隆出空表。

  • 不支持通过MySQL Router连接到donor节点执行克隆操作。

  • 克隆完成后,recipient实例自动重启

  • 本地克隆不支持创建在绝对路径的通用表空间,可能导致表空间命名冲突。

克隆A套数据

停止B套 group_replication

以下操作在B套每个节点操作,原则上先停SECONDARY,后停PRIAMRY节点。

先确认B套集群状态:

1628826535(1){width=“5.764583333333333in” height=“0.49027777777777776in”}

mycl108

mysql> stop group_replication;

mycl107

mysql> stop group_replication;

开始克隆

节点mycl107操作

将A 套PRIAMRY节点(10.9.50.112)作为数据提供者:

mysql> SET GLOBAL clone_valid_donor_list = "10.9.50.112:3306";  
  
mysql> set global super_read_only=0;  
  
mysql> CLONE INSTANCE FROM root@'10.9.50.112':3306 IDENTIFIED BY 'Root15()';  
  
Query OK, 0 rows affected (3.11 sec) -- 显示克隆完成  

注意:演示使用root用户做为克隆用户,可提前在A套创建专用的克隆用户,示例如下:

CREATE USER ‘donor_clone_user’@’%’ IDENTIFIED BY ‘password’;

GRANT BACKUP_ADMIN on . to ‘donor_clone_user’@’%’;

克隆监控

使用以下语句进行监控和确认克隆是否完成,在数据接收数据库执行:

select STAGE, STATE, CAST(BEGIN_TIME AS DATETIME) as "START TIME",  
  
CAST(END_TIME AS DATETIME) as "FINISH TIME",  
  
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')  
  
as DURATION  
  
from performance_schema.clone_progress;  

1628827066(1){width=“5.7659722222222225in” height=“1.225in”}

注意事项

B套克隆完数据后,mycl107 的数据和用户及密码都与A 套完全一致,后面操作B套都需使用A套用户密码,或是可以在此步骤就更改B套 root密码。

配置A->B主从

创建到A 套的复制通道

change master to master_user=‘root’, master_password=‘Root15()’, master_host=‘10.9.50.112’, master_auto_position=1, master_port=6446 for channel ‘ms_ch’;

设置过滤复制

只复制A 的test1 database变更到B

CHANGE REPLICATION FILTER REPLICATE_DO_DB = (test1) for channel ‘ms_ch’;

启动复制

mysql> START SLAVE;

确认复制状态

mysql> show slave status G;

显示复制的database是 test1,且同步状态正常。

Replicate_Do_DB: test1

恢复B套MGR集群

因为在克隆A套数据之前,B套MGR组复制已经全部停止,且MGR集群内其他节点已经与mycl107节点数据不同,现在同样使用克隆方式恢复B套MGR。

从MYSQL 8.0.17 版本开始,MGR内数据同步,可以使用一定手段自动调起克隆组件来自动同步主节点的数据。

开启mycl107组复制

操作节点:mycl107

mysql> set global group_replication_bootstrap_group=on;

mysql> start group_replication;

mysql> set global group_replication_bootstrap_group=off;

清理INNODB CLUSTER元数据

操作节点:mycl107

此时B套数据库内包含的是A套 INNODB CLUSTER的元数据,需要先清理。

select * from performance_schema.replication_group_members;

清除A

mysql> drop database mysql_innodb_cluster_metadata;

Query OK, 15 rows affected (0.07 sec)

MGR内克隆同步数据

  1. 操作节点mycl108

mysql> reset master;

Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_user=‘root’, master_password=‘Root15()’ for channel ‘group_replication_recovery’;

mysql> start group_replication;

克隆监控

同样可以使用以下语句进行监控和确认克隆是否完成,在数据接收数据库执行:

select STAGE, STATE, CAST(BEGIN_TIME AS DATETIME) as “START TIME”,

CAST(END_TIME AS DATETIME) as “FINISH TIME”,

LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ’ ')

as DURATION

from performance_schema.clone_progress;

MGR状态确认

mycl108操作完成后,使用以下语句确认MGR集群状态:

select * from performance_schema.replication_group_members;

本次演示 B 套MGR 只有两个节点,如果有三个节点,请在B套第三节点按照mycl108的操作MGR内克隆同步数据

MGR & MGR 主从架构多源FAILOVER复制请参考:

文档:mgr – mgr slave.note

演示链接:http://note.youdao.com/noteshare?id=0d2b5a1628ede545e86e4762e7f4655f&sub=5A5FAD1EC7804AFE9982F347E2F0F0F3

恢复B套INNODB CLUSTER配置

目前B套数据库里存储的是A套INNODB CLUSTER的元数据,需要进行以下操作重配置B套INNODB CLUSTER。

INNODB CLUSTER接管MGR

MGR集群接管: 如果在已经配置好的组复制上创建InnoDB Cluster,并且希望使用它来创建集群,可将adoptFromGR选项传递给dba.createCluster()函数。创建的InnoDB Cluster会匹配复制组是以单主数据库还是多主数据库运行。要采用现有的组复制组,使用MySQL Shell连接到组成员。

  1. 使用mysqlsh登录mycl107

mysqlsh --uri root@mycl107:3306

  1. INNODB CLUSTER接管MGR

MySQL mycl107:3306 SQL > js

MySQL mycl107:3306 JS > var cluster = dba.createCluster(‘my_cluster’, {adoptFromGR: true});

MySQL mycl107:3306 JS > cluster.status();

1628843810{width=“4.627083333333333in” height=“3.736111111111111in”}

此时INNODB CLUSTER已经重新配置好。

重新配置MYSQLROUTER

B套集群每个节点都操作。

  1. mysqlrouter --bootstrap root@mycl107:3306 --user mysqlrouter --force

  2. 检查mysqlrouter配置文件,将自定义参数加入配置文件

  3. 重启mysqlrouter

$ /etc/init.d/mysqlrouter restart

or

$ systemctl start mysqlrouter

or

$ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf

  1. 连接验证

mysql -uroot -P6446 -h10.9.50.107 -p

至此B套已经是与A套数据实时同步的单独INNODB CLUSTER。

B 套设置为只读

为避免同步过程中,有其他用户更改B套 MGR中的数据。

操作PRIAMRY节点:mycl107

mysql> set global super_read_only=on;

mysql> set global read_only=on;

割接窗口操作

本章节主要是在割接阶段执行,割接前先将连接A 套所有应用停止,确认A 套不再有数据写入,再确认B套数据已经完全同步完成。

确认A 套连接

登录A 套PRIAMRY 节点

mysql> show processlist;

确认B 套数据同步完成

  1. DB层确认同步应用情况

登录mycl107

mysql> show slave status G

  1. 开发确认数据完整性

解除A->B 主从关系

登录mycl107

mysql -uroot -p

mysql> stop slave; --停止复制

mysql> RESET SLAVE ALL FOR CHANNEL ‘ms_ch’; --清除复制通道配置

mysql> set global super_read_only=off; --开启可读可写

mysql> set global read_only=off; --开启可读可写

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

评论