Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 MariaDB 只读副本

此部分包含有关使用 Amazon RDS MariaDB 上的只读副本的特定信息。有关只读副本及其使用说明的一般信息,请参阅使用 MariaDB、MySQL 和 PostgreSQL 数据库实例的只读副本

只读副本配置 (MariaDB)

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

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

如果一个只读副本运行的是任何版本的 MariaDB,则可指定它为另一个只读副本的源数据库实例。例如,可从 MyDBInstance 创建 ReadReplica1,然后从 ReadReplica1 创建 ReadReplica2。对 MyDBInstance 的更新将复制到 ReadReplica1,然后从 ReadReplica1 复制到 ReadReplica2。一个复制链中不能涉及四个以上的实例。例如,您可以从 MySourceDBInstance 创建 ReadReplica1,再从 ReadReplica1 创建 ReadReplica2,然后从 ReadReplica2 创建 ReadReplica3,但不能再从 ReadReplica3 创建 ReadReplica4。

如果所提升的 MariaDB 只读副本进而复制到其他只读副本,则这些只读副本仍有效。设想一个示例,其中 MyDBInstance1 复制到 MyDBInstance2,然后 MyDBInstance2 复制到 MyDBInstance3。如果提升 MyDBInstance2,则将不再从 MyDBInstance1 复制到 MyDBInstance2,但 MyDBInstance2 仍将复制到 MyDBInstance3。

要对 Amazon RDS MariaDB 的只读副本启用自动备份,请先创建只读副本,然后修改只读副本以启用自动备份。

只要不超过源实例的 5 个只读副本的限制,即可同时运行多个引用同一源数据库实例的只读副本创建或删除操作。

只读副本更新 (MariaDB)

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

多可用区只读副本部署 (MariaDB)

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

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

监控 MariaDB 只读副本

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

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

  • 网络中断。

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

  • 使用 MyISAM 等非事务性存储引擎。仅 MariaDB 10.2 及更高版本上的 InnoDB 存储引擎和 MariaDB 10.1 及更高版本上的 XtraDB 存储引擎支持复制。

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

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

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

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

删除 MariaDB 只读副本

必须使用与删除数据库实例相同的机制显式地删除只读副本。如果只删除源数据库实例而不删除副本,则各个副本将提升为独立的数据库实例。

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 10.2 及更高版本上的 InnoDB 存储引擎和 MariaDB 10.1 及更高版本上的 XtraDB 存储引擎支持复制。

  • 使用不安全的不确定性查询,如 SYSDATE()。有关详细信息,请参阅 Determination of Safe and Unsafe Statements in Binary Logging(确定二进制日志记录中的安全和不安全语句)。

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

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