使用 Amazon Aurora MySQL 进行复制 - Amazon Aurora

使用 Amazon Aurora MySQL 进行复制

Aurora MySQL 复制特征是提高集群可用性与性能的关键所在。Aurora 可以帮助您轻松创建集群并调整大小(最多可创建 15 个 Aurora 副本)。

所有副本采用相同的基础数据。如果某些数据库实例离线,其他处于可用状态的数据库实例将继续处理查询,或者在需要时作为写入器接管这些实例。Aurora 会自动将您的只读连接分配到多个数据库实例中,从而帮助 Aurora 集群更好地支持查询密集型工作负载。

在以下主题中,您可以了解 Aurora MySQL 复制的工作方式以及如何微调复制设置以获得最佳的可用性和性能。

使用 Aurora 副本

Aurora 副本是 Aurora 数据库集群中的独立终端节点,最适合用于扩展读取操作以及提高可用性。对于数据库集群在 AWS 区域中所跨的多个可用区,最多可以分配 15 个 Aurora 副本。虽然数据库集群卷由数据库集群的多个数据副本组成,但集群卷中的数据表示为数据库集群中的主实例和 Aurora 副本的单个逻辑卷。有关 Aurora 副本的更多信息,请参阅 Aurora 副本

Aurora 副本十分适用于读取扩展,因为它们完全专用于集群卷上的读取操作。写入操作由主实例进行管理。由于集群卷是在 Aurora MySQL 数据库集群中的所有实例之间共享的,因此,无需执行额外的操作以复制每个 Aurora 副本的数据副本。相比之下,MySQL 只读副本必须在单一线程上,重放从源数据库实例向其本地数据存储的所有写入操作。此限制会影响到 MySQL 只读副本支持海量读取流量的能力。

对于 Aurora MySQL,在删除 Aurora 副本时,将立即删除其实例终端节点,并将 Aurora 副本从读取器终端节点中删除。如果在正待删除的 Aurora 副本上运行语句,则有 3 分钟宽限期。现有语句可在此宽限期内正常完成。当此宽限期结束后,将关闭并删除 Aurora 副本。

重要

对于在 InnoDB 表上执行的操作,Aurora MySQL 的 Aurora 副本始终使用 REPEATABLE READ 默认事务隔离级别。仅对于 Aurora MySQL 数据库集群的主实例,您可以使用 SET TRANSACTION ISOLATION LEVEL 命令更改事务级别。该限制避免在 Aurora 副本上出现用户级锁定,并允许 Aurora 副本扩展以支持数千个活动用户连接,同时仍保持最小的副本滞后时间。

注意

在主实例上运行的 DDL 语句可能会中断关联的 Aurora 副本上的数据库连接。如果 Aurora 副本连接主动使用数据库对象(如表),并且使用 DDL 语句在主实例上修改该对象,则会中断 Aurora 副本连接。

注意

中国 (宁夏) 区域不支持跨区域只读副本。

Amazon Aurora MySQL 的复制选项

您可以在以下任意选项之间设置复制:

注意

重新引导 Amazon Aurora 数据库集群的主实例还会自动重新引导该数据库集群的 Aurora 副本,以便重新建立入口点来确保数据库集群中的读/写一致性。

Amazon Aurora MySQL 复制的性能注意事项

以下特征可以帮助您微调 Aurora MySQL 复制性能。

副本日志压缩特征自动降低复制消息的网络带宽。由于每条消息将传输到所有 Aurora 副本,因此,较大的集群的好处更大。该特征在写入方节点上产生一些 CPU 开销以执行压缩。在 Aurora MySQL 版本 2 和版本 3 中,始终启用它。

二进制日志筛选特征自动降低复制消息的网络带宽。由于 Aurora 副本不使用复制消息中包含的二进制日志信息,因此,将从发送到这些节点的消息中省略该数据。

在 Aurora MySQL 版本 2 中,您可以通过更改 aurora_enable_repl_bin_log_filtering 参数来控制此特征。默认情况下,该参数为 on。由于该优化应该是透明的,因此,您只能在诊断或故障排除期间禁用该设置以解决与复制相关的问题。例如,与无法使用该特征的旧 Aurora MySQL 集群的行为相符。

在 Aurora MySQL 版本 3 中,二进制日志筛选始终处于启用状态。

Amazon Aurora MySQL 的零停机重启 (ZDR)

零停机重启 (ZDR) 特征可以在某些类型的重启期间保留与数据库实例的部分或全部活动连接。ZDR 适用于 Aurora 自动执行以解决错误条件的重启,例如,当副本开始远远落后于源时。

重要

ZDR 机制运作以尽力而为作为原则。Aurora MySQL 版本、实例类、错误条件、兼容的 SQL 操作以及确定 ZDR 应用位置的其他因素随时可能会发生变化。

Aurora MySQL 2.x 的 ZDR 需要版本 2.10 及更高版本。ZDR 在 Aurora MySQL 3.x 的所有次要版本中都可用。在 Aurora MySQL 版本 2 和 3 中,ZDR 机制默认处于开启状态,且 Aurora 不使用 aurora_enable_zdr 参数。

Aurora 会在 Event(事件) 页面中报告与零停机时间重新启动相关的活动。Aurora 在尝试使用 ZDR 机制重新启动时会记录一个事件。此事件说明了 Aurora 重启的原因。然后,在重启完成后,Aurora 会记录另一个事件。这最后一个事件报告了进程所用时长,以及在重启期间保留或丢弃的连接数。您可以查看数据库错误日志,了解有关重启期间所发生情况的更多详细信息。

尽管成功执行 ZDR 操作后连接保持不变,但一些变量和特征会重新初始化。通过零停机重启进行重启后,以下类型的信息将不会保留:

  • 全局变量。Aurora 将恢复会话变量,但重启后不会恢复全局变量。

  • 状态变量。特别是,引擎状态报告的正常运行时间值将重置。

  • LAST_INSERT_ID.

  • 表的内存中 auto_increment 状态。重新初始化内存中的自动增量状态。有关自动增量值的更多信息,请参阅 MySQL 参考手册

  • 来自 INFORMATION_SCHEMAPERFORMANCE_SCHEMA 表的诊断信息。这些诊断信息也会显示在 SHOW PROFILESHOW PROFILES 等命令的输出中。

下表显示了版本、实例角色以及确定在重启集群中的数据库实例时 Aurora 是否可以使用 ZDR 机制的其它情况。

Aurora MySQL version ZDR 适用于写入器吗? ZDR 适用于读取器吗? ZDR 始终处于启用状态? 注意事项

2.x,低于 2.10.0

不适用

ZDR 不适用于这些版本。

2.10.0–2.11.0

Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。

Aurora 取消任何使用 TLS/SSL、临时表、表锁定或用户锁定的连接。

2.11.1 及更高版本

Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。

Aurora 取消任何使用临时表、表锁定或用户锁定的连接。

3.01–3.03

Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。

Aurora 取消任何使用 TLS/SSL、临时表、表锁定或用户锁定的连接。

3.04 及更高版本

Aurora 回滚活动连接上正在执行的所有事务。您的应用程序必须重试事务。

Aurora 取消任何使用临时表、表锁定或用户锁定的连接。

使用 Aurora MySQL 配置复制筛选条件

您可以使用复制筛选条件来指定使用只读副本的数据库和表。复制筛选条件可以将数据库和表包含在复制之中或排除在复制之外。

以下是复制筛选条件的一些使用案例:

  • 缩减只读副本的大小。使用复制筛选,您可以排除只读副本上不需要的数据库和表。

  • 出于安全原因,将数据库和表从只读副本中排除。

  • 在不同只读副本中为特定使用案例复制不同的数据库和表。例如,您可以使用特定的只读副本进行分析或分片。

  • 对于在不同 AWS 区域中具有只读副本的数据库集群,要在不同的 AWS 区域中复制不同的数据库或表。

  • 指定使用 Aurora MySQL 数据库集群复制哪些数据库和表,该集群配置为入站复制拓扑中的副本。有关此配置的更多信息,请参阅Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制(二进制日志复制)

设置 Aurora MySQL 的复制筛选参数

要配置复制筛选条件,请设置以下参数:

  • binlog-do-db –将更改复制到指定的二进制日志。为二进制日志源集群设置此参数时,仅复制在此参数中指定的二进制日志。

  • binlog-ignore-db –不将更改复制到指定的二进制日志。为二进制日志源集群设置 binlog-do-db 参数时,不会评估此参数。

  • replicate-do-db –将更改复制到指定的数据库。为二进制日志副本集群设置此参数时,仅复制在参数中指定的数据库。

  • replicate-ignore-db –不将更改复制到指定的数据库。为二进制日志副本集群设置 replicate-do-db 参数时,不会评估此参数。

  • replicate-do-table –将更改复制到指定的表。为只读副本设置此参数时,仅复制参数中指定的表。此外,设置 replicate-do-dbreplicate-ignore-db 参数时,请确保包含指定表的数据库包含在使用二进制日志副本集群的复制中。

  • replicate-ignore-table –不将更改复制到指定的表。为二进制日志副本集群设置 replicate-do-table 参数时,不会评估此参数。

  • replicate-wild-do-table – 根据指定的数据库和表名模式复制表。支持 %_ 通配符。设置 replicate-do-dbreplicate-ignore-db 参数时,请确保包含指定表的数据库包含在使用二进制日志副本集群的复制中。

  • replicate-wild-ignore-table –不基于指定的数据库和表名模式复制表。支持 %_ 通配符。为二进制日志副本集群设置 replicate-do-tablereplicate-wild-do-table 参数时,不会评估此参数。

将按这些参数列出的顺序对其进行评估。有关这些参数如何运行的更多信息,请参阅 MySQL 文档:

默认情况下,这些参数中的每个参数都具有一个空值。在每个二进制日志集群上,您可以使用这些参数来设置、更改和删除复制筛选条件。设置其中一个参数时,请用逗号将各筛选条件分开。

您可以在 %_ 参数中使用 replicate-wild-do-tablereplicate-wild-ignore-table 通配符。% 通配符可以匹配任意数量的字符,而 _ 通配符只能匹配一个字符。

源数据库实例的二进制日志记录格式对于复制非常重要,因为它决定了数据更改的记录。binlog_format 参数的设置将决定复制是基于行还是基于语句的复制。有关更多信息,请参阅“配置 Aurora MySQL 二进制日志记录”。

注意

无论源数据库实例上的 binlog_format 设置如何,所有数据定义语言 (DDL) 语句都将作为语句进行复制。

Aurora MySQL 的复制筛选限制

以下限制适用于 Aurora MySQL 的复制筛选:

  • 仅 Aurora MySQL 版本 3 支持复制筛选条件。

  • 每个复制筛选参数不得超过 2000 个字符。

  • 复制筛选条件中不支持逗号。

  • 复制筛选不支持 XA 事务。

    有关更多信息,请参阅 MySQL 文档中的XA 事务限制

Aurora MySQL 的复制筛选示例

要为只读副本配置复制筛选,请修改与只读副本关联的数据库集群参数组中的复制筛选参数。

注意

您无法修改默认数据库集群参数组。如果只读副本使用默认参数组,请创建新的参数组并将其与只读副本关联。有关数据库集群参数组的更多信息,请参阅使用参数组

您可以使用 AWS Management Console、AWS CLI 或 RDS API 在数据库集群参数组中设置参数。有关设置参数的信息,请参阅 修改数据库参数组中的参数。在数据库集群参数组中设置参数时,与参数组关联的所有数据库集群都使用参数设置。如果在数据库集群参数组中设置复制筛选参数,请确保参数组仅与只读副本集群关联。将源数据库实例的复制筛选参数留空。

以下示例使用 AWS CLI 设置参数。这些示例将 ApplyMethod 设置为 immediate,以便在 CLI 命令完成后立即发生参数更改。如果希望在只读副本重新启动后应用待处理的更改,请将 ApplyMethod 设置为 pending-reboot

以下示例设置了复制筛选条件:

例 将数据库包含在复制之中

以下示例将 mydb1mydb2 数据库包含在复制之内。

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name myparametergroup \ --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"

对于 Windows:

aws rds modify-db-cluster-parameter-group ^ --db-cluster-parameter-group-name myparametergroup ^ --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
例 将表包含在复制之中

以下示例将数据库 table1 中的 table2mydb1 表包含在复制之中。

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name myparametergroup \ --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"

对于 Windows:

aws rds modify-db-cluster-parameter-group ^ --db-cluster-parameter-group-name myparametergroup ^ --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
例 使用通配符将表包含在复制之中

以下示例将数据库 order 中名称以 returnmydb 开头的表包含在复制之中。

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name myparametergroup \ --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"

对于 Windows:

aws rds modify-db-cluster-parameter-group ^ --db-cluster-parameter-group-name myparametergroup ^ --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
例 将数据库排除在复制之外

以下示例将 mydb5mydb6 数据库排除在复制之外。

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name myparametergroup \ --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6',ApplyMethod=immediate"

对于 Windows:

aws rds modify-db-cluster-parameter-group ^ --db-cluster-parameter-group-name myparametergroup ^ --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6,ApplyMethod=immediate"
例 将表排除在复制之外

以下示例将数据库 mydb5 中的表 table1 和数据库 mydb6 中的表 table2 排除在复制之外。

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name myparametergroup \ --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"

对于 Windows:

aws rds modify-db-cluster-parameter-group ^ --db-cluster-parameter-group-name myparametergroup ^ --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
例 使用通配符将表排除在复制之外

以下示例将数据库 order 中名称以 returnmydb7 开头的表排除在复制之外。

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name myparametergroup \ --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"

对于 Windows:

aws rds modify-db-cluster-parameter-group ^ --db-cluster-parameter-group-name myparametergroup ^ --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"

查看只读副本的复制筛选条件

您可以通过以下方式查看只读副本的复制筛选条件:

  • 检查与只读副本关联的参数组中复制筛选参数的设置。

    有关说明,请参阅查看数据库参数组的参数值

  • 在 MySQL 客户端中,连接到只读副本并运行 SHOW REPLICA STATUS 语句。

    在输出中,以下字段显示了只读副本的复制筛选条件:

    • Binlog_Do_DB

    • Binlog_Ignore_DB

    • Replicate_Do_DB

    • Replicate_Ignore_DB

    • Replicate_Do_Table

    • Replicate_Ignore_Table

    • Replicate_Wild_Do_Table

    • Replicate_Wild_Ignore_Table

    有关这些字段的更多信息,请参阅 MySQL 文档中的检查复制状态

监控 Amazon Aurora MySQL 复制

读取扩展和高可用性依赖于尽可能短的滞后时间。您可以通过监控 Amazon CloudWatch AuroraReplicaLag 指标来监控 Aurora 副本滞后于 Aurora MySQL 数据库集群主实例的时间。AuroraReplicaLag 指标记录在每个 Aurora 副本中。

主数据库实例还记录 AuroraReplicaLagMaximumAuroraReplicaLagMinimum Amazon CloudWatch 指标。AuroraReplicaLagMaximum 指标记录主数据库实例与数据库集群中每个 Aurora 副本之间的最大滞后量。AuroraReplicaLagMinimum 指标记录主数据库实例与数据库集群中每个 Aurora 副本之间的最小滞后量。

如果您需要 Aurora 副本滞后的最新值,可在 Amazon CloudWatch 中检查 AuroraReplicaLag 指标。有关 Aurora MySQL 数据库集群的每个 Aurora 副本的 Aurora 副本滞后也会记录在 information_schema.replica_host_status 表中。有关此表的更多信息,请参阅 information_schema.replica_host_status

有关监控 RDS 实例和 CloudWatch 指标的更多信息,请参阅监控 Amazon Aurora 集群中的指标