如何在另一个 AWS 账户中创建 Amazon RDS MySQL 跨区域副本?

上次更新日期:2021 年 9 月 8 日

我想在与源数据库实例不同的 AWS 区域和账户中创建 Amazon Relational Database Service(Amazon RDS)MySQL 副本。该如何操作?

简短描述

您可以在另一个 AWS 区域中为以下使用案例创建 Amazon RDS MySQL 副本,并从源数据库实例创建账户:

  • 改进灾难恢复
  • 全球横向扩展
  • 在 AWS 区域和账户之间迁移

注意:无法直接使用 Amazon RDS 控制台或 AWS Command Line Interface(AWS CLI)在另一个 AWS 账户中创建跨区域副本。本文中概述的步骤在不同 AWS 账户或区域中的两个 RDS MySQL 实例之间设置了基于二进制日志的外部复制。

解决方法

要在另一个 AWS 账户中创建 Amazon RDS MySQL 跨区域副本,请按照以下步骤操作。

注意:账户 A 包含源区域中的主 RDS MySQL 实例。账户 B 包含目标区域中的 RDS MySQL 副本。

1.    在账户 A(主要 Amazon RDS MySQL 实例)中,确保已启用二进制日志记录。默认情况下,RDS MySQL 中已启用了自动备份和二进制日志记录。只要启用了自动备份,就会启用二进制日志记录。

注意:如果将备份保留期从“0”更改为非零值,将发生中断,反之亦然。

2.    使用以下命令更新二进制日志保留期:

mysql>  CALL mysql.rds_set_configuration(name,value);

提示:选择在复制源上保留二进制日志文件足够长的时间段,以便在删除之前应用更改。Amazon RDS 将二进制日志文件保留在 MySQL 实例上长达 168 个小时(7 天)。有关更多信息,请参阅 mysql.rds_set_configuration

例如,以下语法将二进制日志保留期设置为 24 小时:

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

3.    在账户 A 的主实例上创建复制用户,然后授予所需的权限:

mysql> CREATE USER 'repl_user'@'<domain_name>' IDENTIFIED BY '<password>';

4.    向在步骤 3 中创建的用户授予(必需的)REPLICATION CLIENTREPLICATION SLAVE 权限:

mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO  'repl_user'@'<domain_name>';

5.    选择目标区域,在主账户(账户 A)中创建跨区域只读副本

6.    在账户 A 中登录已创建的副本实例。然后,确认副本与主数据库实例保持一致:

mysql> SHOW SLAVE STAUS\G

注意:检查以确保 Secons_Behind_Master 值为“0”。当此值为“0”时,副本与主数据库实例保持一致。有关详细信息,请参阅监控只读副本

7.    在将只读副本捕捉到主数据库实例后,停止在步骤 5 中创建的副本实例上的复制。要停止复制,请使用以下语法:

mysql> call mysql.rds_stop_replication();

8.    在副本上运行 SHOW SLAVE STATUS 命令,然后为 Relay_Master_Log_File 和 Exec_Master_Log_Pos 记录输出值。Relay_Master_Log_File 和 Exec_Master_Log_Pos 值是您的二进制日志坐标,用于在后续步骤中设置外部复制。

9.    在账户 A 中创建副本实例的数据库快照

(可选)或者,您可以使用生成逻辑备份的本地工具(例如 mysqldump)从账户 A 中的副本实例中导出数据。然后,使用本地工具将数据导入到账户 B 中相同版本的新创建 RDS MySQL 实例。使用此方法,您无需在两个账户之间复制和共享快照或 AWS KMS 密钥。如果您决定使用此方法,请跳至步骤 12 以在两个实例之间设置网络访问和复制。在采用此方法之前,您必须将数据导入账户 B 中的 Amazon RDS for MySQL 实例。

10.    与账户 B 共享数据库快照

注意:如果数据库快照已加密,则必须与目标账户共享用于加密快照的 AWS KMS 密钥。有关详细信息,请参阅共享加密快照

11.    在账户 B 中还原数据库快照

注意:无法通过共享加密快照恢复数据库实例。可以改为创建数据库快照副本,并通过该副本恢复数据库实例。

12.    在账户 A(来源账户)和账户 B(目标账户)之间设置网络访问权限。网络访问权限允许流量在源账户和目标账户之间流动。

13.    为账户 A 的主数据库实例配置入站安全组规则。此配置允许流量从账户 B(目标账户)中新创建的 RDS MySQL 实例通过公共互联网流动。安全组会保护您的 Amazon RDS MySQL 实例。

对于私有复制流量,必须在两个 AWS 账户之间创建并接受 VPC 对等连接

14.    在账户 B 中的目标实例上设置外部复制:

mysql> CALL mysql.rds_set_external_master (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  );

例如:

mysql> CALL mysql.rds_set_external_master (mytestinnstance.us-east-1.rds.amazonaws.com', 3306, 'repl_user', '<password>', 'mysql-bin-changelog.000031', 107, 0);

mytestinnstance.us-east-1.rds.amazonaws.com:主要实例端点
3306:主实例端口
repl_user:在步骤 3 中创建的复制用户名
password:在步骤 3 中创建的用户密码
mysql-bin-changelog.000031:来自步骤 8 输出的二进制日志文件名
107:步骤 8 输出中的二进制日志位置

15.    在账户 B 中还原的实例上开始复制:

CALL mysql.rds_start_replication;

以下是示例输出:

+-------------------------+
| Message                 |
+-------------------------+
| Slave running normally. |
+-------------------------+

16.    在账户 B 实例上运行以下命令以检查复制状态

mysql> show replica status \G

注意:对于 MySQL 8.0.22 及更高版本,SHOW SLAVE STATUS 已弃用,SHOW REPLICA STATUS 可以使用。有关更多信息,请在 MySQL 网站上参阅检查复制状态

17.    删除在步骤 5 中创建的副本(作为中间实例)。此副本用于提取二进制日志坐标,而不必暂停账户 A 中的主要实例上的写入操作。

跨区域复制注意事项

考虑以下跨区域复制的方法:

  • 源数据库实例可以在多个 AWS 区域中拥有跨区域只读副本。有关更多信息,请参阅在不同的 AWS 区域中创建只读副本
  • 对于与源实例不同的 AWS 区域中的任何只读副本,预计您可能看到更长的延迟时间。产生这种滞后时间的原因是区域数据中心之间的网络通道较长。有关复制滞后时间的信息,请参阅监控只读副本
  • 为跨区域复制而传输的数据会产生 Amazon RDS 数据传输费用。有关这些数据传输费用的更多信息,请参阅跨区域复制成本

这篇文章对您有帮助吗?


您是否需要账单或技术支持?