AWS RDS Mysql 跨账号迁移

Posted hsbxxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWS RDS Mysql 跨账号迁移相关的知识,希望对你有一定的参考价值。

AWS云平台上,RDS mysql数据库的跨账号迁移。并没有像同账号内的简易创建方式,在控制台“点一点”实现。但是为了将业务停机时间降到最低,master+replica 的方式又是最成熟有效的方案。如何自行实现这个方案呢?

本文就是将 RDS Mysql 5.7 的数据库,从 A 账号,迁移到 B 账号。使用 master+replica 的方式,进行迁移。迁移前进行方案验证,步骤如下:

1. 环境准备:

Region/AZ: us-east-1f
账号 A
EC2(M5.xlarge): 安装 sysbench,模拟生产,持续访问数据库
RDS Mysql 5.7(M5.large): 主数据库(MasterA)
RDS Mysql 5.7(M5.large): 临时从数据库(replicaA)

账号 B
RDS Mysql 5.7(M5.large): 从数据库,迁移后的主数据库(replicaB)

2. 账号 A 的 masterA 和 replicA 已经准备完成

AWS

注释:RDS mysql 是没有权限 lock table 的,为了能拿到一致性备份,并且获取 binglogID 和 position ID,所以临时
需要账号 A 的 RDS replica。

3. 使用 sysbench 模拟生产数据,后续通过 sysbench 模拟生产流量(在 masterA 上插入)

mysql>create database dbtest;

#sysbench --test=oltp.lua \\
--mysql-host=mysql-host-ip --mysql-port=3306 \\
--mysql-user=admin \\
--mysql-password=password \\
--mysql-db=dbtest --oltp-tables-count=20 --oltp-table-size=500000 \\
--report-interval=10 --rand-init=on --max-requests=0 \\
--oltp-read-only=off --max-time=120 --num-threads=30 \\
[ prepare | run | cleanup ]

4. 暂停 masterA 和 replicaA 的同步
4.1. 在主库根据情况设置 binlog 的保留期限,我这里滚动间隔设置为 96 小时,语句如下:

CALL mysql.rds_set_configuration(binlog retention hours, 96);

查询设置信息:

CALL mysql.rds_show_configuration;

4.2. 准备获取生产的一致性备份,需要暂停“账号 A“主从之间复制,在 replicaA 上执行:

mysql -hreplica-local.xxxxxxxx.us-east-1.rds.amazonaws.com -uadmin -p<password>
MYSQL> CALL mysql.rds_stop_replication;

恢复同步命令:

CALL mysql.rds_start_replication;

需要紧密监控 RDS 存储所剩空间,以防磁盘空间枯竭的情况发生。
4.3. 命令输出参考:

AWS

5. 创建 Amazon RDS 数据库实例的快照
5.1. 连接到只读副本 replicaA,然后运行 mysql_rds_stop_replication 过程以停止复制。

AWS

5.2.当只读副本处于 Stopped(已停止)时,连接到只读副本并运行

SHOW SLAVE STATUS\\G

Relay_Master_Log_File 字段检索当前二进制日志文件名,并从 Exec_Master_Log_Pos 字段检索日志文件位置。在开始复制前,保存这些值。

mysql> SHOW SLAVE STATUS \\G

*************************** 1. row ***************************
Slave_IO_State:

Master_Host: 10.1.1.206
Master_User: rdsrepladmin
Master_Port: 3306
Connect_Retry: 60

Master_Log_File: mysql-bin-changelog.000336
Read_Master_Log_Pos: 154
Relay_Log_File: relaylog.000106
Relay_Log_Pos: 387Relay_Master_Log_File: mysql-bin-changelog.000336
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
mysql.plugin,mysql.rds_monitor,mysql.rds_sysinfo,innodb_memcache.cache_policies,mysql.rds_history,innodb_memcache.config_options,mysql.rds_configuration,m
ysql.rds_replication_status
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 644
Until_Condition: None

5.3. 在只读副本保持 Stopped (已停止) 状态期间,创建只读副本的数据库快照。

AWS

6. 传输镜像到账号 B
6.1. 创建一个客户管理的 Key,用于后续在账户 B 中还原 RDS 使用

AWS

6.2. 创建 Key 的过程中,直接共享给“账号 B”

AWS

AWS

6.3. 拷贝镜像,修改 AWS Managed Key 为 Customer Managed Key

AWS

AWS

这里要选择刚刚创建的Key

AWS

6.4. 共享快照给账号B

AWS

6.5.  在账号 B,可以看到账号 A 共享的镜像

  1. AWS

6.6.  通过镜像,复制一份到账号 B,然后通过该镜像创建 RDS Mysql

6.7.  此时,只读副本 replicaA 已经没有用处,可以删除。

7. 开始准备跨账号的 master+replica 的设置

7.1.  在 masterA 上创建专用于复制的用户 ID。

mysql> CREATE USER repl_user@% IDENTIFIED BY <password>;

7.2.  该用户需要 REPLICATION CLIENT 和 REPLICATION SLAVE 权限。向该用户授予这些权限。

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl_user@%;

7.3. 如果您需要使用加密复制,则需为复制用户要求 SSL 连接。例如,您可以使用下面一个语句来要求用户账户repl_user的 SSL 连接。

GRANT USAGE ON *.* TO repl_user@<domain_name> REQUIRE SSL;

7.4.  ReplicaB 上设置同步,命令如下:

CALL mysql.rds_set_external_master (masterA-hostname, 3306,repl_user, <password>, mysql-bin-
changelog.000336, 154, 0);

7.5.  启动同步

CALL mysql.rds_start_replication;

注:重置 replica 命令

CALL mysql.rds_reset_external_master

7.6. 现在可以在 replicaB 上查询 slave 状态,已经正常同步

AWS

7.7. 在 masterA 上,可以观察连接信息。 Repl_user 已经连上 master,并且等待 master 发送新的 binlog

AWS

8. 效果和性能验证

8.1. 经过测试,在主库masterA插入 5W 行,replicaB 可以立即查询到,同步速度在 ms 级别,左边窗口为masterA,右边窗口为replicaB

AWS

注释:账号 B 的 replica,是无法在控制台观察同步的 lag 的。

只能通过 show slave status\\G检查状态,重点关注指标如下:

判断 Slave_IO_Running 和 Slave_SQL_Running 两个线程的状态Slave_IO 线程负责把主库的 bin 日志(Master_Log)内容,投递到从库的中继日志上(Relay_Log)。
Slave_SQL 线程负责把中继日志上的语句在从库上执行一遍。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_SQL_Running_State:显示为 wait意思是中继日志的 sql 语句已经全部执行完毕

8.2. ReplicaB 的输出参考:

MySQL> show slave status\\G
*************************** 1. row ***************************
......
Slave_IO_State: Waiting for master to send event

Master_Host: master.xxxxxxxx.us-east-1.rds.amazonaws.com
Master_User: repl_user

Master_Port: 3306
Connect_Retry: 60

Master_Log_File: mysql-bin-changelog.000421
Read_Master_Log_Pos: 511
Relay_Log_File: relaylog.000092
Relay_Log_Pos: 744

Relay_Master_Log_File: mysql-bin-changelog.000421
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 511
Relay_Log_Space: 1001
......
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 775308671
Master_UUID: e910577b-b95d-11ec-8675-164e76cd8371
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:

8.3. 验证方法二,自动化校验 replica 同步情况8.4.

在主库创建一个表,每 10s 插入时间戳,在 replica 查询时间戳,就可以判断同步情况

mysql> create table test.master_time (master_time datetime);
mysql> insert into test.master_time values(now());

自动化脚本,contab 每 10s 执行一次

#!/bin/sh

#insert time into master table
mysql -hmaster.xxxxxxxx.us-east-1.rds.amazonaws.com -uadmin -p<password> -e insert into test.master_time
values(now());
# query time gap from replica
sleep 3
gap=$(mysql -haccb.cpbyya1ujkgc.us-east-1.rds.amazonaws.com -uadmin -p<password> -N -e select
time_to_sec(timediff(now(),(select max(master_time) from test.master_time as aa))););
#Check the gap, then print the info
if [ $gap -gt 60 ]
then echo "Gap is bigger then 60s!!! Gap is "$gap"s"
else echo "Syncing, gap is "$gap"s"
fi


  1. 至此,完整的AWS RDS Mysql的迁移方案已经准备好。但是在实际生产切换之前,还有几点需要注意:

9.1. MasterA上已有的用户和权限,需要手动在replicaB上创建;

9.2. 持续观察几天数据同步的状态,尤其是特殊类型字段的查询;

9.3. 业务层访问测试,关注网络连通性,安全组设置等。


现在,我们可以申请维护窗口,准备生产切换了。


参考文档:

https://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.html#AuroraMySQL.Rep
lication.MySQL.RetainBinlogs
https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/mysql_rds_set_configuration.html
https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/mysql_rds_stop_replication.htmlhttps://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/mysql_rds_start_replication.html
https://blog.csdn.net/qq_38486203/article/details/80654040









以上是关于AWS RDS Mysql 跨账号迁移的主要内容,如果未能解决你的问题,请参考以下文章

更改 AWS RDS mysql时区 -摘自网络

阿里云RDS实例内不同数据库之间的数据迁移

如何将自建库迁移到阿里云RDS

AWS 跨账户 Postgres RDS IAM 身份验证

从阿里云RDS MySQL在线迁移数据到本地MySQL

无法 ping AWS RDS 终端节点