亚马逊AWS官方博客

使用基于 GTID 的复制通过回退选项迁移至 Amazon Aurora MySQL

Original URL: https://aws.amazon.com/blogs/database/migrating-to-amazon-aurora-mysql-with-fallback-option-using-gtid-based-replication/

 

迁移生产应用程序时,回退选项往往非常重要。本博文演示了如何使用基于全局事务标识符 (GTID) 的复制将 Amazon RDS MySQL 工作负载迁移至 Amazon Aurora MySQL。此外,我们还讨论了如何在遇到任何问题时使用回退机制。

有关基于 GTID 复制的更多信息,请参阅 Amazon Aurora for MySQL 兼容性现在支持全局事务标识符 (GTID) 复制

本博文中的复制拓扑具有一个包含两个只读副本(RDS MySQL 只读副本和 Aurora MySQL 副本)的 RDS MySQL 主实例。如果在迁移过程中遇到任何问题,您可以将 RDS MySQL 只读副本用作回退实例,从而使原始 RDS MySQL 主实例不受影响。但是,您也 可以将原始 RDS MySQL 主实例用作回退选项。成功迁移之后,Aurora MySQL 副本将成为 RDS MySQL 副本实例的主实例。

使用基于 GTID 的复制的主要优势在于,它可以为每一个事物分配一个唯一标识符,并且复制拓扑中的每一个 MySQL 服务器均可跟踪其已执行的事务。基于 GTID 的复制是基于交易的,因此,确定主实例和副本之间的数据一致性非常简单。如果将主实例上提交的所有交易也提交至副本,则两者之间具有一致性。这允许自动定位,该功能可使副本指向主实例,而无需指定二进制日志文件名称或位置。

先决条件

若要完成此演练,您必须满足以下先决条件:

  • 在复制拓扑中,主实例和回退副本均位于 RDS MySQL 上。对于 RDS MySQL 实例,基于 GTID 的复制受 RDS MySQL 版本 5.7.23 及更高的 MySQL 5.7 版本支持。
  • 由于目标迁移服务器为 Aurora MySQL,因此,基于 GTID 的复制受 Aurora MySQL 版本 2.04 及更高版本中的 MySQL 5.7 兼容集群支持。

基于 GTID 的复制受 Aurora MySQL 版本 2.04 及更高版本和 RDS MySQL 版本 5.7.23 及更高的 MySQL 5.7 版本的支持。复制配置中的所有 RDS MySQL 数据库实例均必须满足此条件。基于 GTID 的复制不受 RDS MySQL 5.5、5.6 或 8.0 的支持。有关更多信息,请参阅为 Aurora MySQL 使用基于 GTID 的复制为 Amazon RDS MySQL 使用基于 GTID 的复制

解决方案概览

该演练包含以下步骤:

  1. 配置基于 GTID 的复制
  2. 将 Aurora MySQL 配置为一个新的主实例,并将回退选项设置为 RDS MySQL 副本
  3. 将应用程序切换为 Aurora 数据库集群
  4. 将回退选项配置回 RDS MySQL 副本

配置基于 GTID 的复制

下图所示为两种可能的复制方案。根据您的主实例和只读副本,选择在 RDS MySQL 主实例与您的新只读副本之间或者在现有副本之间配置基于 GTID 的复制。

为新的只读副本配置基于 GTID 的复制

此复制拓扑中的所有实例均具有自定义参数组,并且已使用相应参数进行配置,以支持基于 GTID 的复制。有关更多信息,请参阅基于 GTID 的复制参数

在主实例 (RDS MySQL) 与新的只读副本(RDS MySQL 只读副本)之间配置基于 GTID 的复制

要在主实例 (RDS MSQL) 与新副本(RDS MySQL 只读副本)之间配置基于 GTID 的复制,请执行以下操作:

  1. 使用参数gtid-mode = ON 和 enforce_gtid_consistency = ON 为 RDS MySQL 主实例创建一个自定义参数组
  2. 通过修改数据库实例关联该参数组。
  3. 手动重启 RDS MySQL 实例,使数据库实例使用新的数据库参数组。 如果您已有与 RDS MySQL 实例关联的自定义参数组,则若要启用基于 GTID 的复制,请配置参数gtid-mode = ON 和 enforce_gtid_consistency = ON。这些参数在 RDS 中是静态的,因此,您必须重启 RDS MySQL 实例。有关更多信息,请参阅使用数据库参数组重启数据库实例
  4. 在 RDS MySQL 主实例上启用二进制日志。 如果您已启用备份,则会自动启用二进制日志。否则,通过将备份保留期限设置为非0 值启用 RDS MySQL 实例上的二进制日志(如果是从 更改为非 0 值,则需要重启)。 您必须重启以启用 RDS MySQL 中的二进制日志,因此,您可能希望在配置自定义参数组时将此步骤包含在内。
  5. 配置 RDS MySQL 主实例上的二进制日志的保留期限。 默认情况下,RDS MySQL 实例将会尽快清除二进制日志。若要设置二进制日志保留时长,请使用程序mysql_rds_set_configuration 并指定二进制日志保留时长的配置参数和小时数,以便保留 RDS MySQL 主实例上的二进制日志文件。对于 MySQL 数据库实例,二进制日志的最大保留时长为 168 个小时(7 天)。查看以下命令:
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
  1. 创建一个 RDS MySQL 只读副本。有关更多信息,请参阅创建只读副本使用 MySQL 只读副本。 默认情况下,只读副本将继承主实例的参数组。作为最佳实践,您应删除主实例自定义参数组的依赖项。如果特定于主数据库实例的主数据库参数组中的参数发生任何更改,则这些更改也会应用至与该参数组关联的所有数据库实例。
  2. 为只读副本创建一个新的自定义参数组并配置参数gtid-mode = ON 和 enforce_gtid_consistency = ON
  3. 通过修改实例并手动重启实例来关联新创建的自定义参数组。 现在,RDS MySQL 只读副本实例使用新的自定义数据库参数组。
  4. 验证基于 GTID 的复制是否已启用以及复制是否在 RDS MySQL 主实例与 RDS MySQL 只读副本之间正常工作。) 在主实例上,输入命令SHOW MASTER STATUS\G 并验证 Executed_Gtid_Set 列,它将显示主实例上运行的事务 GTID。查看以下命令输出: 
mysql> SHOW MASTER STATUS\G;
*************************** 1. row ***************************
File: mysql-bin-changelog.000038
Position: 194
Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:1-19

b.) 在副本上,输入命令 SHOW SLAVE STATUS\G 并验证以下列:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

这些值意味着复制正常工作。您可以检查输出中的 Retrieved_Gtid_Set 和 Executed_Gtid_Set。以下示例输出显示副本已检索到事务并且已执行在主示例上执行的相同事务 (1–19):

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Master_Log_File: mysql-bin-changelog.000038
Read_Master_Log_Pos: 194
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error: 
Master_Server_Id: 2052411434
Master_UUID: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04
Retrieved_Gtid_Set: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:11-19
Executed_Gtid_Set: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:1-19
Auto_Position: 1

上一步用于确认已将 RDS MySQL 主实例与 RDS MySQL 只读副本之间的复制配置为基于 GTID 的复制。

配置主实例 (RDS MySQL) 与新副本 (Aurora MySQL) 之间的基于 GTID 的复制

要配置主实例 (RDS MySQL) 与新副本 (Aurora MySQL) 之间的基于 GTID 的复制,请执行以下步骤:

  1. 从 RDS MySQL 主数据库实例创建一个 Aurora 只读副本。 有关更多信息,请参阅使用 Aurora 只读副本将数据从 MySQL 数据库实例迁移至 Amazon Aurora MySQL 数据库集群从 RDS MySQL 数据库实例创建 Amazon Aurora 只读副本。 默认情况下,Aurora 集群使用默认参数组及默认配置gtid-mode = OFF_PERMISSIVE作为只读副本,配置接受带有和不带有 GTID 的事务。但是,根据您的复制拓扑,这是用于回退选项的目标主服务器。
  2. 若要确保每一个事务均具有 GTID,请创建一个自定义集群参数组并设置参数gtid-mode = ON 和 enforce_gtid_consistency = ON
  3. 通过修改集群将集群参数组关联至新创建的 Aurora 集群。
  4. 手动重启集群。
  5. 验证基于 GTID 的复制是否已启用以及复制是否在 RDS MySQL 主实例与 Aurora 只读副本之间正常工作。) 在主实例上,输入SHOW MASTER STATUS\G; 并验证 Executed_Gtid_Set 列,它将显示主实例上运行的事务 GTID。查看以下命令输出:
mysql> SHOW MASTER STATUS\G;
*************************** 1. row *************************
File: mysql-bin-changelog.000059
Position: 868
Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:1-46

b.) On the replica, enter SHOW SLAVE STATUS\G; and verify the following columns:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

这些值意味着复制正常工作。您可以检查输出中的 Retrieved_Gtid_Set 和 Executed_Gtid_Set。以下示例输出显示副本已检索到事务并且已执行在主示例上执行的相同事务 (1–46):

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Master_Log_File: mysql-bin-changelog.000059
Read_Master_Log_Pos: 868
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Seconds_Behind_Master: 0
Master_Server_Id: 2052411434
Master_UUID: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04
Retrieved_Gtid_Set: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:11-46
Executed_Gtid_Set: 7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:1-46
Auto_Position: 1

上一步用于确认已将 RDS MySQL 主实例与 Aurora 只读副本之间的复制配置为基于 GTID 的复制。 

在现有只读副本上配置基于 GTID 的复制

此复制拓扑中的所有实例均具有自定义参数组,并且已使用相应参数进行配置,以支持基于 GTID 的复制。

默认情况下,在为 RDS MySQL 创建只读副本时,它将使用二进制日志文件及其中的位置,以实现主实例与副本之间的同步。因此,对于未使用基于 GTID 复制的现有 RDS MySQL 数据库实例及只读副本(RDS MySQL 和 Aurora MySQL),您必须手动配置基于 GTID 的复制。

在主实例 (RDS MySQL) 与现有副本(RDS MySQL 和 Aurora MySQL)之间启用 GTID 复制

要在主实例 (RDS MySQL) 与现有副本(RDS MySQL 副本和 Aurora MySQL 副本)之间启用 GTID 复制,请执行以下步骤:

  1. 验证 RDS MySQL 实例的版本。 如果您使用的是 RDS MySQL 版本7.22 或更低版本,请将 RDS MySQL 版本升级到 5.7.23 或更高的 MySQL 5.7 版本。有关更多信息,请参阅升级 MySQL 数据库引擎
  2. 验证 Aurora 数据库集群的版本 如果 Aurora MySQL 版本低于04,请将 Aurora 数据库集群版本升级到 2.04 或更高版本。
  3. 在主实例上配置二进制日志,直到不再需要。 默认情况下,RDS MySQL 实例将会尽快清除二进制日志。使用mysql_rds_set_configuration 并指定二进制日志保留时长的配置参数和小时数以保留 RDS MySQL 主实例上的二进制日志文件,以此设置二进制日志的保留时长。对于 MySQL 数据库实例,二进制日志的最大保留时长为 168 个小时(7 天)。查看以下命令:

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

作为最佳实践,您应删除主实例自定义参数组的依赖项。

  1. 为 RDS MySQL 主实例和 RDS MySQL 副本实例创建一个不同的自定义参数组。
  2. 对于 Aurora MySQL 副本,请创建一个自定义集群参数组。
  3. 使用gtid-mode = OFF_PERMISSIVE 和 enforce_gtid_consistency = WARN 配置 RDS MySQL 主实例、RDS MySQL 只读副本和 Aurora MySQL 只读副本的自定义参数组。
  4. 通过修改 RDS 数据库实例将这些参数组分别关联至相应的 RDS 实例。
  5. 修改数据库实例(RDS MySQL 主实例、RDS MySQL 只读副本和 Aurora MySQL 副本)的默认参数组后,手动重启这些实例,数据库实例随后将使用新的自定义参数组。
  6. 在进入下一步之前,请确保错误日志中没有生成任何警告。 如果出现任何警告,请调整您的应用程序,使其仅使用与 GTID 兼容的功能且不会生成任何警告。有关更多信息,请参阅 MySQL 网站上的与 GTID 复制相关的限制
  7. 确认错误日志中未生成任何警告之后,使用gtid-mode = ON_PERMISSIVE 和 enforce_gtid_consistency = WARN 配置 RDS MySQL 主实例和只读副本(RDS MySQL 只读副本和 Aurora MySQL 副本)的参数组。
  8. 手动重启实例,使数据库实例可使用这些参数。
  9. 确保中继日志中没有未指定 GTID 的事务。 要验证这些匿名事务,请在只读副本(RDS MySQL 和 Aurora MySQL)上运行以下命令:SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';查看以下命令输出:
mysql> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0     |
+-------------------------------------+-------+
  1. 确认没有任何匿名事务后,请使用gtid_mode = ON 和 enforce_gtid_consistency = ON 在主实例和只读副本自定义参数组上设置 GTID。
  2. 手动重启实例。
  3. 确保两个只读副本上均没有匿名事务。
  4. 在两个只读副本上执行rds_set_master_auto_position。 这会将复制模式设置为使用基于 GTID 的复制方法。查看以下命令:
mysql> CALL mysql.rds_set_master_auto_position (1);
  1. 连接到 RDS MySQL 主实例和只读副本(RDS MySQL 副本和 Aurora MySQL 副本)并验证 GTID 是否已启用以及复制是否正常工作。) 在主实例上,输入SHOW MASTER STATUS\G; 并验证 Executed_Gtid_Set 列,它将显示主实例上运行的事务 GTID。查看以下命令输出:
mysql> SHOW MASTER STATUS\G;
*************************** 1. row ***************************
File: mysql-bin-changelog.119716
Position: 194
Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: d8e0b642-62b2-11e9-a674-06f30def75ee:1-5091

b.) 在副本上,输入 SHOW SLAVE STATUS\G; 并验证以下列:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

这些值意味着复制正常工作。您可以检查输出中的 Retrieved_Gtid_Set 和 Executed_Gtid_Set。以下示例输出显示副本服务器已检索到事务并且已执行在主示例上执行的相同事务 (1–5091):

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Log_File: mysql-bin-changelog.119716
Read_Master_Log_Pos: 194
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error: 
Seconds_Behind_Master: 0
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Retrieved_Gtid_Set: d8e0b642-62b2-11e9-a674-06f30def75ee:5090-5091
Executed_Gtid_Set: d8e0b642-62b2-11e9-a674-06f30def75ee:1-5091
Auto_Position: 1

上一步用于确认已将 RDS MySQL 主实例与只读副本(RDS MySQL 只读副本和 Aurora 只读副本)之间的复制配置为基于 GTID 的复制。下图展示了此配置。

将 Aurora MySQL 副本配置为新的主实例和回退选项

开始之前,请验证复制已同步,因为默认情况下复制是异步的。复制延迟可能会各不相同,这主要取决于必须在单线程进程中对副本应用的主实例上的写入操作量。因此,最好的选择是停止应用程序并验证复制是否同步。

要将 Aurora MySQL 副本配置为新的主实例和回退选项,请执行以下步骤:

  1. 将示例配置为只读,以确保 RDS MySQL 数据库主实例上没有任何写入操作。 要将实例设置为只读模式,请修改为该实例分配的自定义参数组。参数read_only 默认为值 {TrueIfReplica}。在本用例中,将此值设为 1,它表示实例已处于只读模式。此参数具有动态应用类型,这意味着更改将会立即生效,无需重启。
  2. 等待任何进行中的事务完全复制到两个副本实例(Aurora MySQL 副本和 RDS MySQL 副本)。
  3. 要进行验证,请连接到副本实例并在相对短的时间内数次输入SHOW SLAVE STATUS\G;。
  4. 检查以下列:Slave_IO_StateSlave_IO_RunningSlave_SQL_RunningSlave_SQL_Running_StateSeconds_Behind_Master 和 Executed_Gtid_Set。 您可以检查输出中的 Executed_Gtid_Set,如果副本已同步,那么它应该与主实例的 Executed_Gtid_Set 相同。如果副本已与 RDS MySQL 主实例同步,那么 Seconds_Behind_Master 自然会随之为 0。 SQL_IO_State 和 SQL_SQL_Running_State 应与以下所示类似:
Slave_IO_Running: Yes
Slave_IO_State: Waiting for master to send event
Slave_SQL_Running: Yes
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

有关更多信息,请参阅 MySQL 网站上的复制从属 I/O 线程状态复制从属 SQL 线程状态

  1. 如果副本已同步,请将 Aurora MySQL 配置为一个新的主实例,并将回退选项设置为 RDS MySQL 只读副本。 下图展示了此架构。

将 Aurora MySQL 数据库集群配置为主实例

要将 Aurora MySQL 数据库集群配置为主实例,请执行以下步骤:

  1. 将 Aurora 只读副本提升为独立的 Aurora 数据库集群。 有关更多信息,请参阅提升 Aurora 只读副本
  2. 配置从 Aurora 数据库集群到 RDS MySQL 只读副本的基于 GTID 的复制。 要执行此操作,您必须在 Aurora 数据库集群上启用二进制日志。有关更多信息,请参阅在复制主实例上启用二进制日志记录。 使用binlog_format = “MIXED” 更新集群参数组(您也可以使用其他格式,如 ROW 或 STATEMENT,但建议设置为 MIXED)。有关更多信息,请参阅 MySQL 网站上的设置二进制日志格式基于语句和基于行的复制的优缺点
  3. 重启 Aurora 数据库集群。
  4. 要验证是否正在生成二进制日志,请连接到 Aurora 集群并输入SHOW BINARY LOGS;。查看以下命令输出:
    mysql> SHOW BINARY LOGS;
    +----------------------------+-----------+
    | Log_name                   | File_size |
    +----------------------------+-----------+
    | mysql-bin-changelog.000001 |       154 |
    | mysql-bin-changelog.000002 |      3030 |
    +----------------------------+-----------+
  5. 连接到 Aurora 集群时,创建一个复制账户。查看以下命令:
    mysql> CREATE USER 'repl_user'@'<domain_name>' IDENTIFIED BY '<password>';

    出于安全原因,请将此账户仅用于复制。有关更多信息,请参阅 MySQL 网站上的创建复制用户

  6. 向复制用户授予REPLICATION SLAVE 权限。查看以下命令:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'<domain_name>' IDENTIFIED BY '<password>';

将 RDS MySQL 只读副本实例配置为 Aurora MySQL 数据库集群的副本

要将 RDS MySQL 只读副本实例配置为回退选项的 Aurora MySQL 数据库集群的副本,请执行以下步骤:

  1. 将 RDS MySQL 只读副本提升为独立的数据库实例。
  2. 重启实例。 有关更多信息,请参阅将只读副本提升为独立的数据库实例
  3. 使用主用户连接到 RDS MySQL 只读副本并输入rds_set_external_master_with_auto_position。 该存储的程序将执行必要的更改,以便 RDS MySQL 只读副本可以连接到 Aurora MySQL 数据库集群并请求二进制日志。它还会根据全局事务标识符配置复制。查看以下命令:
mysql> CALL mysql.rds_set_external_master_with_auto_position (AuroraClusterEndpoint',3306,'repl_user','password',0,0);
  1. 运行重置从属实例以清除旧引用。查看以下命令:
mysql> reset slave;

有关更多信息,请参阅 MySQL 网站上的 RESET SLAVE Statement

  1. 在目标 RDS MySQL 只读副本上启动复制。查看以下命令:
mysql> call mysql.rds_start_replication();

前面的步骤将在新的主实例 (Aurora MySQL) 与副本实例(RDS MySQL 只读副本)之间配置基于 GTID 的复制。

将应用程序切换为使用 Aurora 数据库集群

您现在已准备就绪,可将您的应用程序切换为使用新的 Aurora MySQL 主实例。当您从 MySQL(RDS 或本地)迁移至 Aurora MySQL 时,务必知道 Aurora 与使用 InnoDB 存储引擎的 MySQL(5.6 和 5.7)兼容。您可以将当前用于 MySQL 的大部分驱动器、连接器和工具与 Aurora MySQL 搭配使用,只需少量或无需任何更改。因此,在迁移过程中,无需对应用程序代码进行任何更改,大部分应用程序也可以正常运行。

要将应用程序切换为使用 Aurora 数据库集群,请执行以下步骤:

  1. 将您的应用程序指向新的Aurora 集群终端节点。可以通过两种方式完成此操作,具体取决于您在应用程序中使用的方法:
  • 更改具有 Aurora 集群终端节点的所有应用程序的连接字符串。
  • 如果您的应用程序使用的是指向数据库引擎的主机名的自定义规范名称 (CNAME),请将域名系统 (DNS) 中的 CNAME 记录更新为 Aurora 集群终端节点。
  1. 应用程序指向 Aurora 数据库集群后,请验证复制是否正常运行。) 在 Aurora 数据库主实例上,输入SHOW MASTER STATUS\G; 并验证 Executed_Gtid_Set。查看以下命令输出:
mysql> SHOW MASTER STATUS\G;
*************************** 1. row ***************************
File: mysql-bin-changelog.000002
Position: 4615
Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 5c619be5-381d-3436-9104-3d8fbb228334:1-10,
7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:1-24:26-46

b.) 在从属 RDS 只读副本上,输入 SHOW SLAVE STATUS\G;。查看以下命令输出:

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: AuroraClusterEndpoint.us-west-2.rds.amazonaws.com
Master_User: repl_user
Master_Port: 3306
Master_Log_File: mysql-bin-changelog.000002
Read_Master_Log_Pos: 4615
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error: 
Exec_Master_Log_Pos: 4615
Seconds_Behind_Master: 0
Master_UUID: 5c619be5-381d-3436-9104-3d8fbb228334
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Retrieved_Gtid_Set: 5c619be5-381d-3436-9104-3d8fbb228334:1-10
Executed_Gtid_Set: 5c619be5-381d-3436-9104-3d8fbb228334:1-10,
7d90b125-77f6-11e9-b3b1-02bb8ffa5a04:1-46
Auto_Position: 1

根据前面的结果,以下参数提供重要信息:

  • Master_Host 确认从属实例已作为主实例连接到新配置的 Aurora 数据库集群
  • Retrieved_Gtid_Set 和 Executed_Gtid_Set 确认数据已按预期从主实例复制到从属实例
  • Exec_Master_Log_Pos 显示从属实例已自动定位至主实例的二进制日志位置

验证可确认主实例 (Aurora MySQL) 与副本实例(RDS MySQL 只读副本)之间的复制正在运行并且已配置为基于 GTID 的复制。

退回至 RDS MySQL 副本

要配置回退,请执行以下步骤:

  1. 停止应用程序。
  2. 将 Aurora 集群配置为只读。 这将确保 Aurora 数据库集群上午任何写入操作。要将集群设置为只读,请修改为集群分配的自定义集群参数组。参数read_only 默认为值 {TrueIfReplica}。在本用例中,将此值设为 1,它表示 Aurora MySQL 集群已处于只读模式。此参数具有动态应用类型,这意味着更改将会立即生效,无需重启。
  3. 等待进行中的事务完全复制到副本(RDS MySQL 只读副本)。
  4. 验证复制是否已同步。
  5. 连接到副本(RDS MySQL 只读副本)并在相对短的时间内数次输入SHOW SLAVE STATUS\G;。
  6. 检查以下列:Slave_IO_StateSlave_IO_RunningSlave_SQL_RunningSlave_SQL_Running_StateSeconds_Behind_Master 和 Executed_Gtid_Set。 您可以检查输出中的 Executed_Gtid_Set,如果副本已同步,那么它应该与主实例的 Executed_Gtid_Set 相同。如果副本已与 Aurora MySQL 主实例同步,那么 Seconds_Behind_Master 自然会随之为 0SQL_IO_State 和 SQL_SQL_Running_State 应与以下所示类似:
Slave_IO_Running: Yes
Slave_IO_State: Waiting for master to send event
Slave_SQL_Running: Yes
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

确认副本已与主实例同步后,最好是在副本(RDS MySQL 只读副本)上停止复制。

  1. 运行以下命令- CALL mysql.rds_stop_replication; 和 reset slave; 这将终止 Aurora MySQL 实例上的复制。 此时,您的 RDS MySQL 只读副本已成为独立的数据库实例。您现在可以将应用程序重新指向作为退回选项的独立数据库实例终端节点。

小结

本博文介绍了通过将 RDS MySQL 只读副本作为回退选项来将 RDS MySQL 迁移至 Aurora MySQL 数据库集群的过程。我们在方案中使用了基于 GTID 的复制方法,以充分利用它的各种优势,加强一致性以及复杂复制流中的二进制日志自动定位。此外,您还可以使用基于 GTID 的复制方法将本地 MySQL 或 EC2 MySQL 实例迁移至 Amazon Aurora MySQL。

 

本篇作者

Vijay Karumajji

Amazon Web Services 的数据库解决方案架构师。他与客户一起工作,提供有关大数据项目的指导和技术协助,帮助客户在使用 AWS 时提高其解决方案的价值。