使用 MariaDB 只读副本 - Amazon Relational Database Service

使用 MariaDB 只读副本

接下来,您可以找到有关使用 Amazon RDS for MariaDB 上的只读副本的特定信息。有关只读副本及其使用说明的一般信息,请参阅使用数据库实例只读副本

使用 MariaDB 配置只读副本

确保先通过将备份保留期设置为一个非零值来在源数据库实例上启用自动备份,然后 MariaDB 数据库实例才能充当复制源。此要求也适用于作为一个只读副本的源数据库实例的另一个只读副本。

您可以从同一区域内的一个数据库实例创建多达 15 个只读副本。为了高效地进行复制,每个只读副本具有的计算和存储资源的量应与源数据库实例的一样多。如果扩展源数据库实例,则还应扩展只读副本。

RDS for MariaDB 支持级联只读副本。要了解如何配置级联只读副本,请参阅 将级联只读副本用于 RDS for MariaDB

您可以在引用相同源数据库实例的同时,运行多个只读副本创建和删除操作。当您执行这些操作时,应将每个源实例的只读副本数限制在 15 个以内。

使用 MariaDB 配置复制筛选条件

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

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

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

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

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

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

注意

您还可以使用复制筛选条件来指定使用入站复制拓扑中主 MariaDB 数据库实例的数据库和表。有关此配置的更多信息,请参阅配置与外部源实例之间的二进制日志文件位置复制

设置 RDS for MariaDB 的复制筛选参数

要配置复制筛选条件,请在只读副本上设置以下复制筛选参数:

  • 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 参数时,不会评估此参数。

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

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

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

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

注意

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

RDS for MariaDB 的复制筛选限制

以下限制适用于对 RDS for MariaDB 进行复制筛选:

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

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

  • 不支持用于二进制日志筛选的 MariaDB binlog_do_dbbinlog_ignore_db 选项。

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

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

  • RDS for MariaDB 版本 10.2 不支持复制筛选。

RDS for MariaDB 的复制筛选示例

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

注意

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

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

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

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

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

以下示例将 mydb1mydb2 数据库包含在复制之内。为只读副本 replicate-do-db 设置时,仅复制参数中指定的数据库。

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-do-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"

对于 Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-do-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"
例 将表包含在复制之中

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

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-do-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"

对于 Windows:

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

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

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

对于 Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"
例 转义名称中的通配符

以下示例展示了如何使用转义字符 \ 来转义名称中的通配符。

假设数据库 mydb1 中有多个以 my_table 开头的表名,而且您希望将这些表包含在复制之中。表名包括下划线(下划线也是通配符),因此该示例将表名中的下划线转义。

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "my\_table%", "ApplyMethod":"immediate"}]"

对于 Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "my\_table%", "ApplyMethod":"immediate"}]"
例 将数据库排除在复制之外

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

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-ignore-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"

对于 Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-ignore-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"
例 将表排除在复制之外

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

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-ignore-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"

对于 Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-ignore-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"
例 使用通配符将表排除在复制之外

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

对于 Linux、macOS 或 Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-wild-ignore-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

对于 Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-wild-ignore-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

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

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

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

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

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

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

    • Replicate_Do_DB

    • Replicate_Ignore_DB

    • Replicate_Do_Table

    • Replicate_Ignore_Table

    • Replicate_Wild_Do_Table

    • Replicate_Wild_Ignore_Table

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

    注意

    以前的 MariaDB 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用的 MariaDB 版本低于 10.5,那么请使用 SHOW SLAVE STATUS

使用 MariaDB 配置延迟复制

可以使用延迟复制作为灾难恢复策略。使用延迟复制,可指定最短的时间(以秒为单位)以延迟从源到只读副本的复制。如果出现灾难(如意外删除了表),可完成以下步骤以快速从灾难恢复:

注意
  • MariaDB 10.6 及更高版本支持延迟复制。

  • 使用存储过程配置延迟复制。无法使用AWS Management Console、AWS CLI 或 Amazon RDS API 配置延迟复制。

  • 您可以在延迟复制配置中使用基于全局事务标识符 (GTID) 的复制。

在创建只读副本时配置延迟复制

要为未来通过数据库实例创建的任何只读副本配置延迟复制,请使用 mysql.rds_set_configuration 参数运行 target delay 存储过程。

在创建只读副本时配置延迟复制
  1. 通过使用 MariaDB 客户端,以主用户身份连接到作为只读副本源的 MariaDB 数据库实例。

  2. 使用 mysql.rds_set_configuration 参数运行 target delay 存储过程。

    例如,运行以下存储过程,针对从当前数据库实例创建的任何只读副本,指定将复制延迟至少一小时(3600 秒)。

    call mysql.rds_set_configuration('target delay', 3600);
    注意

    运行此存储过程之后,将为使用 AWS CLI 或 Amazon RDS API 创建的任何只读副本配置延迟指定秒数的复制。

修改现有只读副本的延迟复制

要修改现有只读副本的延迟复制,请运行 mysql.rds_set_source_delay 存储过程。

修改现有只读副本的延迟复制
  1. 使用 MariaDB 客户端,以主用户的身份连接到只读副本。

  2. 使用 mysql.rds_stop_replication 存储过程停止复制。

  3. 运行 mysql.rds_set_source_delay 存储过程。

    例如,运行以下存储过程,指定复制到只读副本延迟至少一小时(3600 秒)。

    call mysql.rds_set_source_delay(3600);
  4. 使用 mysql.rds_start_replication 存储过程开始复制。

提升只读副本

在灾难恢复方案中,当复制停止后,您可以将只读副本提升为新的源数据库实例。有关提升只读副本的信息,请参阅 将只读副本提升为独立的数据库实例

使用 MariaDB 更新只读副本

只读副本旨在支持读取查询,但您可能需要偶尔进行更新。例如,您可能需要添加索引,以加快访问副本的特定类型的查询。您可通过在只读副本的数据库参数组中将 read_only 参数设置为 0 来启用更新。

使用 MariaDB 处理多可用区只读副本部署

您可从单可用区或多可用区数据库实例部署中创建只读副本。您可以使用多可用区部署提高关键数据的持久性和可用性,但无法使用多可用区为只读查询提供辅助服务。您可以改为从大流量、多可用区数据库实例创建只读副本以分载只读查询。如果多可用区部署的源实例故障转移到辅助可用区,则任何关联的只读副本都将自动切换为使用辅助可用区(现在为主可用区)作为其复制源。有关更多信息,请参阅“配置和管理多可用区部署”。

您可以将只读副本创建为多可用区数据库实例。Amazon RDS 会在另一个可用区中创建您的副本的备用,用于支持副本的故障转移。创建您的只读副本作为多可用区数据库实例与源数据库是否为多可用区数据库实例无关。

将级联只读副本用于 RDS for MariaDB

RDS for MariaDB 支持级联只读副本。使用级联只读副本,您可以扩展读取操作,而不会增加源 RDS for MariaDB 数据库实例的开销。

使用级联只读副本,您的 RDS for MariaDB 数据库实例会将数据发送到链中的第一个只读副本。然后,该只读副本将数据发送到链中的第二个副本,依此类推。最终结果是,链中的所有只读副本都具有来自 RDS for MariaDB 数据库实例的更改,但不会只在源数据库实例上产生开销。

您可以从源 RDS for MariaDB 数据库实例在链中创建一系列最多三个只读副本。例如,假设您具有 RDS for MariaDB 数据库实例 mariadb-main。您可执行以下操作:

  • mariadb-main 开始,创建链中的第一个只读副本 read-replica-1

  • 接下来,从 read-replica-1,创建链中的下一个只读副本 read-replica-2

  • 最后,从 read-replica-2,创建链中的第三个只读副本 read-replica-3

除了 mariadb-main 系列中的第三个级联只读副本之外,您无法创建另一个只读副本。从 RDS for MariaDB 源数据库实例到一系列级联只读副本末尾的完整实例系列最多可以包含四个数据库实例。

为了使级联只读副本正常工作,每个源 RDS For MariaDB 数据库实例必须启用自动备份。要对只读副本开启自动备份,请先创建只读副本,然后修改只读副本以开启自动备份。有关更多信息,请参阅创建只读副本

与任何只读副本一样,您可以升级属于级联一部分的只读副本。从只读副本链中升级只读副本将从链中移除该副本。例如,假设您希望将一些工作负载从 mariadb-main 数据库实例转移到新实例,以仅供会计部门使用。假设该示例中的链有三个只读副本,您决定升级 read-replica-2。该链受到如下影响:

  • 升级 read-replica-2 会将其从复制链中移除。

    • 现在它是一个完全读/写数据库实例。

    • 它继续复制到 read-replica-3,就像在升级之前那样。

  • 您的 mariadb-main 继续复制到 read-replica-1

有关升级只读副本的更多信息,请参阅将只读副本提升为独立的数据库实例

监控 MariaDB 只读副本

对于 MariaDB 只读副本,您可以通过在 Amazon CloudWatch 中查看 Amazon RDS ReplicaLag 指标来监控复制滞后。ReplicaLag 指标报告 Seconds_Behind_Master 命令的 SHOW REPLICA STATUS 字段的值。

注意

以前的 MariaDB 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用的 MariaDB 版本低于 10.5,那么请使用 SHOW SLAVE STATUS

MariaDB 复制滞后的常见原因如下所示:

  • 网络中断。

  • 向只读副本上带索引的表写入。如果只读副本上的 read_only 参数未设置为 0,它可以中断复制。

  • 使用 MyISAM 等非事务性存储引擎。仅 MariaDB 上的 InnoDB 存储引擎支持复制。

ReplicaLag 指标达到 0 时,即表示副本已赶上源数据库实例进度。如果 ReplicaLag 指标返回 -1,则当前未激活复制。ReplicaLag = -1 等效于 Seconds_Behind_Master = NULL

开始和停止 MariaDB 只读副本复制

可通过调用系统存储过程 mysql.rds_stop_replicationmysql.rds_start_replication,在 Amazon RDS 数据库实例上停止再重新开始复制过程。对于长时间运行的操作 (如创建大型索引),在两个 Amazon RDS 实例之间进行复制时可以这样做。在导入或导出数据库时,也需要停止再开始复制。有关更多信息,请参阅“将数据导入到停机时间更少的 Amazon RDS MariaDB 或 MySQL 实例”和“使用复制从 MySQL 数据库实例中导出数据”。

如果复制连续 30 天停止,不论是手动还是由于复制错误,Amazon RDS 将结束源数据库实例与所有只读副本之间的复制。这样做是为了防止源数据库实例上的存储需求增长以及长故障转移时间。只读副本数据库实例仍可用。但是无法恢复复制,因为在结束复制后,已从源数据库实例中删除只读副本所需的二进制日志。您可为源数据库实例创建新的只读副本来重新建立复制。

排查 MariaDB 只读副本问题

MariaDB 的复制技术是异步的。由于它们是异步的,因此,源数据库实例上偶发的 BinLogDiskUsage 会增多,而只读副本上应有 ReplicaLag。例如,对源数据库实例的大量写入操作可以并行进行。与之对比的是,对只读副本的写入操作使用单个 I/O 线程串行进行,这会导致源实例与只读副本之间存在滞后。有关 MariaDB 文档中只读副本的更多信息,请转到复制概述

您可通过多种方式来减少对源数据库实例的更新与对只读副本的后续更新之间的滞后,例如:

  • 将只读副本的存储大小和数据库实例类调整到与源数据库实例类似。

  • 确保源数据库实例和只读副本使用的数据库参数组中的参数设置相兼容。有关更多信息和示例,请参阅本部分后面的有关 max_allowed_packet 参数的讨论。

Amazon RDS 监控只读副本的复制状态,如果由于任何原因停止复制,则将只读副本实例的 Replication State 字段更新为 Error。可能会有这样的例子,在您的只读副本上运行的 DML 查询与对源数据库实例的更新冲突。

可通过查看 Replication Error 字段来检查 MariaDB 引擎引发的关联错误的详细信息。还生成指示只读副本状态的事件,包括 RDS-EVENT-0045RDS-EVENT-0046RDS-EVENT-0047。有关这些事件和事件订阅的详细信息,请参阅 使用 Amazon RDS 事件通知。如果返回 MariaDB 错误消息,则检查 MariaDB 错误消息文档中的错误。

一个可导致复制出错的常见问题是只读副本的 max_allowed_packet 参数的值小于源数据库实例的 max_allowed_packet 参数的值。max_allowed_packet 参数是可在数据库参数组中进行设置的自定义参数,用于指定可在数据库上运行的最大 DML 代码大小。有时候,与源数据库实例关联的数据库参数组中的 max_allowed_packet 参数值,要小于与源的只读副本关联的数据库参数组中的 max_allowed_packet 参数值。在这些情况下,复制过程可能会引发错误 (数据包大于 'max_allowed_packet' 字节) 并停止复制。通过将源和只读副本设置为使用具有相同 max_allowed_packet 参数值的数据库参数组,即可更正此错误。

其他可导致复制错误的常见情况包括:

  • 对只读副本上的表进行写入操作。如果是在只读副本上创建索引,则需要将 read_only 参数设置为 0 才能创建索引。如果对只读副本上的表进行写入操作,则可能会中断复制。

  • 使用非事务性存储引擎,如 MyISAM。只读副本需要使用事务性存储引擎。仅 MariaDB 上的 InnoDB 存储引擎支持复制。

  • 使用不安全的不确定性查询,如 SYSDATE()。有关更多信息,请参阅确定二进制日志记录中的安全和不安全语句

如果您确定可安全跳过错误,那么可以按照跳过当前的复制错误中描述的步骤操作。否则,可删除只读副本,然后使用相同的数据库实例标识符创建实例,以使终端节点保持与旧只读副本的终端节点相同。如果复制错误得到纠正,则 Replication State 将更改为 replicating

对于 MariaDB 数据库实例,在某些情况下,如果某些二进制日志 (binlog) 事件在故障期间未刷新,则只读副本将无法切换到辅助可用区。在这些情况下,请手动删除并重新创建只读副本。您可通过设置以下参数值来降低发生这种情况的可能性:sync_binlog=1innodb_flush_log_at_trx_commit=1。这些设置可能降低性能,因此,请先测试其影响,然后在生产环境中实施更改。