如何以极少的停机时间对适用于 MySQL 或 MariaDB 的未加密 Amazon RDS 数据库实例进行加密?
我尝试为适用于 MySQL 或 MariaDB 的未加密 Amazon Relational Database Service(Amazon RDS)实例创建加密只读副本。但是,我收到了一条错误消息。如何解决此问题?
简短描述
Amazon RDS 对加密的数据库实例有以下限制:
- 无法通过修改现有未加密的 Amazon RDS 数据库实例来加密该实例。
- 无法在未加密实例的基础上创建加密的只读副本。
由于您无法加密现有 Amazon RDS 实例,因此必须创建新的加密实例。否则,当您为未加密的 Amazon RDS for MySQL 实例创建加密只读副本时,您会收到以下错误信息:
"You cannot create an encrypted Read Replica from an unencrypted DB instance. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID:)"
要以最短的停机时间加密非加密版的数据库实例,请遵循以下步骤:
1. 对您拍摄的该数据库实例的未加密只读副本的未加密快照进行加密。
2. 从加密快照还原新的数据库实例,以此部署新的加密数据库实例。
3. 使用 MySQL 复制功能将更改从源数据库实例同步到新的加密数据库实例。
4. 验证新的加密数据库实例与源数据库实例是否同步。
5. 切换连接,并将您的流量重定向到新数据库实例。
解决方法
以最短的停机时间设置复制
1. 为未加密的源 Amazon RDS 数据库实例创建临时只读副本。在此示例中,未加密的源数据库实例称为 SOURCE-EU,临时只读副本称为 TEMP-RR。
2. 连接到 TEMP-RR,然后监控副本滞后情况,直到 Seconds_Behind_Master 稳定在 0 值。这表明 TEMP-RR 与 SOURCE-EU 同步:
mysql> SHOW SLAVE STATUS \G Seconds_Behind_Master: 0
3. 停止 TEMP-RR 的复制进程。
MySQL > call mysql.rds_stop_replication; +---------------------------+ | Message | +---------------------------+ | Slave is down or disabled | +---------------------------+
4. 记下来自 TEMP-RR 的 Relay_Master_Log_File 和 Exec_Master_Log_Pos 的值:
mysql> SHOW SLAVE STATUS \G Relay_Master_Log_File: mysql-bin-changelog.000012 Exec_Master_Log_Pos: 123
5. 在 SOURCE-EU 中,设置 binlog retention hours 参数,以便在完成操作所需的时间内保留二进制日志。在以下示例中,binlog retention hours 设置为 24 小时:
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
6. 为 TEMP-RR 拍摄快照。或者在拍摄快照后删除 TEMP-RR。
7. 复制 TEMP-RR 的快照,然后将启用加密设置为是。
8. 从已启用加密的已复制快照还原新的数据库实例。在此示例中,新的加密数据库实例称为 NEW-RR-EN。
9. 修改 SOURCE-EU 的安全组中的入站规则,以允许来自 NEW-RR-EN 的流量。如果两个数据库实例使用的安全组相同,您可以使用与 SOURCE-EU 相同的安全组 ID 参考。
**注意:**请确保允许从 NEW-RR-EN 到 SOURCE-EU 的出站流量。
10. 登录 SOURCE-EU,设置复制用户,然后向该用户授予必要的权限:
mysql> create user 'repl_user'@'%' identified by 'password123'; mysql> grant replication slave, replication client on *.* to 'repl_user'@'%'; mysql> show grants for 'repl_user'@'%';
**注意:**将 repl_user 和 password123 分别替换成您自己的复制用户名和密码。
11. 连接 NEW-RR-EN,然后建立到 SOURCE-EU 的复制连接:
mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );
rds-endpoint 是 SOURCE-EU 的数据库实例端点。
用户名(repl_user)和密码(password123)与您在步骤 10 中创建的用户名和密码相同。使用在步骤 4 获得的 Relay_Master_Log_File 和 Exec_Master_Log_Pos 的值,来使用 mysql.rds_set_external_master procedure 设置复制。
注意:如果 SOURCE-EU 是可公开访问且 NEW-RR-EN(新加密数据库实例)设置为“私有”,请使用(SOURCE-EU)的私有 IP 地址而不是 rds-endpoint。
12. 在 NEW-RR-EN 中,开始复制:
mysql > CALL mysql.rds_start_replication;
13. 在 NEW-RR-EN 中,确认 SOURCE-EU 和 NEW-RR-EN 之间的复制成功保持同步。
mysql> SHOW SLAVE STATUS \G
如果源数据库实例和只读副本之间的连接成功,则输出如下所示:
Slave_IO_State: Waiting for master to send event Seconds Behind master: 0
14. 当 Seconds_Behind_Master 稳定在 0 值后,停止流量并关闭 SOURCE-EU 上的连接。停机随后开始。
**注意:**停止连接到 SOURCE-EU 的所有应用程序服务器和客户端,以验证未对 SOURCE-EU 进行任何新的更改。您还可以临时锁定 SOURCE-EU 使用的安全组。这可以阻止来自任何任何应用程序或客户端(NEW-RR-EN 以及用户执行这些操作时所使用的主机除外)的入站流量。
15. 以数据库主用户身份连接到 NEW-RR-EN,然后停止复制:
MySQL > call mysql.rds_stop_replication;
**重要提示:**运行此命令后,NEW-RR-EN 将不再从 SOURCE-EU 复制数据。
16. 停止 SOURCE-EU 和 NEW-RR-EN 之间的复制关系,以将 NEW-RR-EN 提升为独立服务器:
MySQL > call mysql.rds_reset_external_master;
17. 在所有连接字符串中指定 NEW-RR-EN 的 DNS 终端节点,以将所有应用程序、客户端和数据库连接指向 NEW-RR-EN。或者,重命名 SOURCE-EU,然后修改 NEW-RR-EN,以使用与 SOURCE-EU 所用相同的名称。
18. 确认 NEW-RR-EN 上的安全组规则允许来自相应应用程序和客户端的入站流量。
19. 将应用程序和客户端均指向 NEW-RR-EN 并测试了环境后,便可以删除 SOURCE-EU。
**提示:**最佳实践是在测试实例上测试此项操作,然后再在生产环境中应用此项操作。
相关信息
相关内容
- 已提问 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前