如何在最短的停机时间内对 MySQL 或 MariaDB 未加密的 Amazon RDS 数据库实例进行加密?

2 分钟阅读
0

我尝试为 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-RRSOURCE-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_FileExec_Master_Log_Pos 的值:

    mysql> SHOW SLAVE STATUS \G
    Relay_Master_Log_File: mysql-bin-changelog.000012
    Exec_Master_Log_Pos: 123
  5. SOURCE-EU 中,设置二进制日志保留小时数参数,以将二进制日志保留完成此操作所需的时间。在以下示例中,将二进制日志保留小时数设置为 24 小时:

    mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
  6. 获取 TEMP-RR 的快照。或者,在获取快照后删除 TEMP-RR

  7. 复制 TEMP-RR 的快照,然后将启用加密设置为

从加密快照恢复新的数据库实例

要从加密快照恢复新的数据库实例,请按照以下步骤操作:

  1. 从已开启加密的副本快照中恢复新的数据库实例。在此示例中,新的加密数据库实例名为 NEW-RR-EN
  2. 修改 SOURCE-EU 安全组中的入站规则,允许来自 NEW-RR-EN 的流量。如果您在两个数据库实例上使用相同的安全组,则可以使用与 SOURCE-EU 相同的安全组 ID 参考。
    **注意:**允许出站流量从 NEW-RR-EN 流向 SOURCE-EU

将源实例的更改同步到新的加密实例

要使用 MySQL 复制将源数据库实例的更改同步到新的加密数据库实例,请按照以下步骤操作:

  1. 登录 SOURCE-EU
  2. 创建复制用户,然后向该用户授予必要的权限:
    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 替换为您的密码。
  3. 连接到 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_userpassword123 替换为您创建的用户名和密码。使用 Relay_Master_Log_FileExec_Master_Log_Pos 的值对 mysql.rds_set_external_master 过程设置复制。如果 SOURCE-EU公开访问,并且将 NEW-RR-EN 设置为“私有”,则要使用 SOURCE-EU 的私有 IP 地址而不是 rds-endpoint
  4. NEW-RR-EN 中,开始复制:
    mysql > CALL mysql.rds_start_replication;

验证加密实例是否与源实例同步

要验证新的加密数据库实例是否与源数据库实例同步,请按照以下步骤操作:

  1. NEW-RR-EN 中,确认复制成功并且在 SOURCE-EUNEW-RR-EN 之间保持同步:

    mysql> SHOW SLAVE STATUS \G

    如果源数据库实例与只读副本之间成功连接,则输出如下所示:

    Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0
  2. Seconds_Behind_Master 的值稳定为 0 后,停止流量并关闭 SOURCE-EU 上的连接。
    **注意:**停止连接到 SOURCE-EU 的所有应用程序服务器和客户端,确保没有对 SOURCE-EU 进行新的更改。或者,您可以暂时锁定 SOURCE-EU 使用的安全组。您必须阻止来自任何应用程序或客户端的入站流量,但来自 NEW-RR-EN 和用户执行这些操作的主机除外。

切换连接并将流量重定向到新的数据库实例

要切换连接并将流量重定向到新的数据库实例,请按照以下步骤操作:

  1. 以数据库主用户身份连接到 NEW-RR-EN,然后停止复制:

    MySQL > call mysql.rds_stop_replication;

    **重要事项:**在运行此命令后,NEW-RR-EN 不再复制 SOURCE-EU 的数据。

  2. 要将 NEW-RR-EN 升级为独立的服务器,请停止 SOURCE-EUNEW-RR-EN 之间的复制关系:

    MySQL > call mysql.rds_reset_external_master;
  3. 要将所有应用程序、客户端和数据库连接指向 NEW-RR-EN,请在所有连接字符串中指定 NEW-RR-EN DNS 端点。或者,对 SOURCE-EU 重新命名,然后修改 NEW-RR-EN,以使用与 SOURCE-EU 使用的相同名称。

  4. 确认 NEW-RR-EN 上的安全组规则允许来自相应应用程序和客户端的入站流量。

  5. 删除 SOURCE-EU
    **注意:**在生产环境中应用此操作之前,最佳做法是在测试实例上测试此操作

相关信息

使用数据库实例只读副本

如何使用 KMS 密钥加密 Amazon RDS 快照?

MySQL 网站上的 Troubleshooting replication

配置与外部源实例之间的二进制日志文件位置复制

AWS 官方
AWS 官方已更新 1 年前