1. AWS RDS作为主库,自建MySQL为从库,建立master-slave架构:
提前配置并测试本地数据库和RDS所在VPC,子网之间的网络连通性,确保我们班可以通过RDS的endpoint连接到数据库,并提前在RDS中创建我们本地从库所使用的user,赋予相应的权限(grant replication slave)。建议尽量设置从库的版本与主库相同,或者从库的版本高于主库。
1.1 RDS MySQL的binlog是通过开启自动备份的方式开启,请确认RDS自动备份保留期为大于0的天数。
同时,为保证在配置master-slave期间binlog在RDS内保留足够的时长,请运行如下语句进行配置[1]:
call mysql.rds_set_configuration('binlog retention hours', 3); //--> 将binlog在RDS内保留3小时(或者更多)
1.2 请在RDS内运行 show master status; 并记录此时的binlog 信息
1.3 请通过mysqldump的方式,将RDS内的业务数据库进行export, 而后import进自建MySQL数据库
1.4 可以在本地库中通过如下指令配置master-slave连接:
mysql> CHANGE MASTER TO
-> MASTER_HOST='RDS endpoint',
-> MASTER_USER='xxx',
-> MASTER_PASSWORD='xxx',
-> MASTER_LOG_FILE='mysql-bin.000003', //--> 1.2中记录的binlog名字
-> MASTER_LOG_POS=73; //--> 1.2中记录的binlog位置
而后,可以start slave; 以完成master-slave的配置。
2. 将自建MySQL作为主库,RDS MySQL 作为从库的架构
也是可以实现的,作为从库的RDS无论是一个single instance,还是作为拥有一个只读副本的master,配置方式均一致,步骤总结如下:
2.1 提前配置本地数据库和RDS VPC,子网的联通性,确保RDS可以连接到本地数据库。在本地数据库中创建主从结构所需要的user,并赋予相应权限。建议尽量设置从库的版本与主库相同,或者从库的版本高于主库。
2.2 在本地数据库运行show master status; 并记录相应信息
2.3 通过mysqldump 的方式,将本地数据库中业务数据库导出,并导入RDS[2].
因为RDS的master user不具备更改information_schema, mysql,sys等系统数据库的权限。因此,请您仅操作业务数据库的导出导入。
2.4 参考文档[3]的指令,配置master-slave 连接:
CALL mysql.rds_set_external_master (
host_name //-- 本地MySQL IP
, host_port
, replication_user_name
, replication_user_password
, mysql_binary_log_file_name //-- 2.2中记录的binlog名字
, mysql_binary_log_file_location //-- 2.2中记录的binlog位置
, ssl_encryption
);
然后可以运行文档[3]中的CALL mysql.rds_start_replication; 从 RDS for MySQL 数据库实例发起复制。
3. 配置rds的只读副本(Read Replica)为主库,线下本地部署的mysql为从库
3.1. 默认情况下,在创建RDS Read Replica以后,只读副本的自动备份功能是关闭的。因此,只读副本本身不会存储binlog。
可以将只读副本进行modify,并将自动备份保留期设置成大于0的数,这样只读副本本身会开启binlog。
而后,可以在RDS内通过如下指令保留binlog为更久的时间:
call mysql.rds_set_configuration('binlog retention hours', 3); //--> 将binlog在RDS内保留3小时(或者更多)
更改只读副本的自动备份保留期,从0 更改为非0值,会导致RDS重启。
3.2.
在通过mysqldump来导出RDS database过程中,有可能会因为RDS托管服务的admin user本身权限限制的因素,导致锁表本身缺少权限,导致执行--lock-table失败。可以先进行测试,看是否mysqldump锁表方案能够成功执行。
推荐如下备选方案:
根据参考文档[4], 可通过调用系统存储过程 mysql.rds_stop_replication 和 mysql.rds_start_replication,在 Amazon RDS 数据库实例上停止再重新开始复制过程。
在RDS只读副本上执行:
CALL mysql.rds_stop_replication;
CALL mysql.rds_start_replication;
这样,在开启RDS只读副本的binlog以后,停止主从复制,而后show master status; 并运行mysqldump导出RDS MySQL只读副本内的数据。在完成mysqldump以后,可以启动RDS只读副本的主从复制,并通过dump建立自建MySQL从库,而后启动RDS -- 自建MySQL的主从复制。
参考文档:
[1] 设置binlog在RDS内保留期相关文档:
https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.Binarylog.html
[2] 通过mysqldump的方式将数据导入RDS
https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.SmallExisting.html
[3] mysql.rds_set_external_master
https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/mysql-stored-proc-replicating.html#mysql_rds_set_external_master
[4] https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/USER_MySQL.Replication.ReadReplicas.html#USER_MySQL.Replication.ReadReplicas.StartStop