?
?
具体的做法如下:
?
1、1.103 和 1.104 新建实例,搭建主从关系,此时的主节点和从节点处于空载;
?
2、确认 1.102 MySQL 状态(主要看 PROCESS LIST),注意观察 MASTER STATUS 不再变化。观察机器流量,确认无误后,停止 1.102 从节点的服务;
?
3、1.103 新建 MySQL 实例,建成以后,停止 MySQL 服务,并且将整个数据目录 mv 到其他地方做备份;
?
4、将 1.102 的整个 mysql 数据目录使用 rsync 拷贝到 1.103;
?
5、拷贝的同时,在 1.101 授权,使 1.103 有拉取 binlog 的权限(REPLICATION SLAVE, REPLICATION CLIENT);
?
6、待拷贝完成,修改 1.103 配置文件中的 server_id,注意不要和 1.102 上的一致;
?
7、在 1.103 启动 MySQL 实例,注意配置文件中的数据文件路径以及数据目录的权限;
?
8、进入 1.103 MySQL 实例,使用 SHOW SLAVE STATUS 检查从库状态,可以看到 Seconds_Behind_Master 在递减;
?
9、Seconds_Behind_Master 变为 0 后,表示同步完成,此时可以用 pt-table-checksum 检查 1.101 和 1.103 的数据一致,但比较耗时,而且对主节点有影响,可以和开发一起进行数据一致性的验证;
?
10、我们使用相同的办法,使 1.104 变成 1.103 的从库;
?
11、和研发沟通,除了做数据一致性验证外,还需要验证账号权限,以防业务迁走后访问出错;
?
12、此时,我们要做的就是将 1.103 变成 2.101 的从库,具体的做法可以参考场景四;
?
13、需要注意的是,1.103 的单双号配置需要和 1.101 一致;
?
14、做完上述步骤,可以和研发协调,把 1.101 的读写业务切到 1.103,把 1.102 的读业务切到 1.104。观察业务状态;
?
15、如果业务没有问题,证明迁移成功。
?
3.6,场景六:多实例跨机房迁移
接下来我们看看多实例跨机房迁移证明做。每台机器的实例关系,我们可以参考图六。此次迁移的目的是为了做数据修复。在 2.117 上建立 7938 和 7939 实例,替换之前数据异常的实例。因为业务的原因,某些库只在 A 地写,某些库只在 B 地写,所以存在同步过滤的情况。
?
下图是 F 项目 MySQL 架构图。
?
?
具体的做法如下:
?
1、1.113 针对 7936 实例使用 innobackupex 做数据备份,注意需要指定
数据库,并且加上 slave-info 参数;
?
2、备份完成后,将压缩文件拷贝到 2.117;
?
3、2.117 创建数据目录以及配置文件涉及的相关目录;
?
4、2.117 使用 innobackupex 恢复日志;
?
5、2.117 使用 innobackupex 拷贝数据;
?
6、2.117 修改配置文件,注意如下参数:replicate-ignore-db、innodb_file_per_table = 1、read_only = 1、 server_id;
?
7、2.117 更改数据目录权限;
?
8、1.112 授权,使 2.117 有拉取 binlog 的权限(REPLICATION SLAVE, REPLICATION CLIENT);
?
9、2.117 CHANGE MASTE TO 1.112,LOG FILE 和 LOG POS 参考 xtrabackup_slave_info;
?
10、2.117 START SLAVE,查看从库状态;
?
11、2.117 上建立 7939 的方法类似,不过配置文件需要指定 replicate-wild-do-table;
?
12、和开发一起进行数据一致性的验证和验证账号权限,以防业务迁走后访问出错;
?
13、做完上述步骤,可以和研发协调,把相应业务迁移到 2.117 的 7938 实例和 7939 实例。观察业务状态;
?
14、如果业务没有问题,证明迁移成功。
?
四、注意事项
介绍完不同场景的迁移方案,需要注意如下几点:
?
1、
数据库迁移,如果涉及事件,记住主节点打开 event_scheduler 参数;
?
2、不管什么场景下的迁移,都要随时关注服务器状态,比如磁盘空间,网络抖动;另外,对业务的持续监控也是必不可少的;
?
3、CHANGE MASTER TO 的 LOG FILE 和 LOG POS 切记不要找错,如果指定错了,带来的后果就是数据不一致;
?
4、执行脚本不要在 $HOME 目录,记住在数据目录;
?
5、迁移工作可以使用脚本做到自动化,但不要弄巧成拙,任何脚本都要经过测试;
?
6、每执行一条命令都要三思和后行,每个命令的参数含义都要搞明白;
?
7、多实例环境下,关闭 MySQL 采用 mysqladmin 的形式,不要把正在使用的实例关闭了;
?
8、从库记得把 read_only = 1 加上,这会避免很多问题;
?
9、每台机器的 server_id 必须保证不一致,否则会出现同步异常的情况;
?
10、正确配置 replicate-ignore-db 和 replicate-wild-do-table;
?
11、新建的实例记得把 innodb_file_per_table 设置为 1,上述中的部分场景,因为之前的实例此参数为 0,导致 ibdata1 过大,备份和传输都消耗了很多时间;
?
12、使用 gzip 压缩数据时,注意压缩完成后,gzip 会把源文件删除。
?
13、所有的操作务必在从节点或者备节点操作,如果在主节点操作,主节点很可能会宕机;
?
14、xtrabackup 备份不会锁定 InnoDB 表,但会锁定 MyISAM 表。所以,操作之前记得检查下当前数据库的表是否有使用 MyISAM 存储引擎的,如果有,要么单独处理,要么更改表的 Engine;
?
五、技巧
在 MySQL 迁移实战中,有如下技巧可以使用:
?
1、任何迁移 LOG FILE 以 relay_master_log_file(正在同步 master 上的 binlog 日志名)为准,LOG POS 以 exec_master_log_pos(正在同步当前 binlog 日志的 POS 点)为准;
?
2、使用 rsync 拷贝数据,可以结合 expect、nohup 使用,绝对是绝妙组合;
?
3、在使用 innobackupex 备份数据的同时可以使用 gzip 进行压缩;
?
4、在使用 innobackupex 备份数据,可以加上 --slave-info 参数,方便做从库;
?
5、在使用 innobackupex 备份数据,可以加上 --throttle 参数,限制 IO,减少对业务的影响。还可以加上 --parallel=n 参数,加快备份,但需要注意的是,使用 tar 流压缩,--parall