Amazon RDS 只读副本——跳过复制错误

Posted

技术标签:

【中文标题】Amazon RDS 只读副本——跳过复制错误【英文标题】:Amazon RDS Read Replica -- Skipping Replication Errors 【发布时间】:2015-01-15 08:28:31 【问题描述】:

我有一个亚马逊 rds 实例数据库,我正在使用只读副本进行分析。但是,每周左右,只读副本都会因复制错误而崩溃。

我已经尝试查看从属状态并按照this help article 跳过复制错误,但是我只能通过摆弄和创建新的只读副本来恢复它。

由于外部服务依赖于初始只读副本,这成为问题的几个原因。

主数据库很好,但似乎一些完整性错误导致只读副本崩溃并且无法恢复。

目前我的只读副本具有以下参数:

Replication State: Error
Replication Error: Error 'Cannot add or update a child row: a foreign key constraint fails.....

有没有办法可以将此只读副本配置为跳过所有错误?我只是想弄清楚如何使它更稳定。谢谢!

【问题讨论】:

【参考方案1】:

在您了解导致错误的原因、修复了根本问题并且 更正了主副本和副本之间的任何数据不一致。

随着您跳过的每个错误,您的主数据集和副本数据集之间的差异会增加,并且任何差异都是不可接受的。

您别无选择,只能创建一个新的副本实例并丢弃旧的实例。如果新的复制错误发生,停止,找出原因,并修复您的配置或应用程序中的任何错误操作,从而导致错误。

跳过 RDS for mysql 上的复制错误应被视为紧急权宜之计,除非您对 MySQL 复制的内部有透彻的了解...因为在正确的设置中,它们很少见。

【讨论】:

感谢您的回答。我们使用的是 MyISAM 而不是 InnoDB,我认为这是问题的根源。由于其他原因我们切换到了 MyISAM,因此我们仍然没有修复。【参考方案2】:

原来问题的根源在于存储引擎。从这里的亚马逊常见问题解答: http://aws.amazon.com/rds/faqs/#130

用于 MySQL 只读副本的 Amazon RDS 需要事务性存储 引擎并且仅支持 InnoDB 存储引擎。 MyISAM 等非事务性 MySQL 存储引擎可能会阻止 读取副本按预期工作。 但是,如果您仍然选择 要将 MyISAM 与只读副本一起使用,我们建议您观看 Amazon CloudWatch “副本滞后”指标(可通过 AWS 管理获得 控制台或 Amazon CloudWatch API)仔细并重新创建读取 副本应该由于复制错误而落后。相同 注意事项适用于使用临时表和任何其他 非事务性引擎。

我们使用的是 MyISAM。但是,由于其他原因,我们已经从 InnoDB 表切换。所以我们在这里没有完全的答案,因为似乎 InnoDB 存储引擎给了我们一个问题,而 MyISAM 引擎给了我们另一个问题。我们必须深入研究才能弄清楚这一点,但似乎我们需要一个事务存储引擎来使只读副本始终如一地正常工作。

【讨论】:

【参考方案3】:

我通过创建这样的 mysql 事件调度程序解决了这个问题:

CREATE EVENT repl_error_skipper 
ON SCHEDULE 
EVERY 15 MINUTE
COMMENT 'Calling rds_skip_repl_error to skip replication error'
Do
CALL mysql.rds_skip_repl_error;
/*also you can add other logic */

【讨论】:

以上是关于Amazon RDS 只读副本——跳过复制错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cloudformation 模板创建 Amazon RDS aurora Master 和只读副本集群

AWS RDS中的负载平衡或只读副本

在 terraform 失败的不同 vpc 中创建时出现 rds 副本错误

AWS RDS 读取复制错误:“您必须在主数据库实例上启用备份才能设置数据库实例到数据库集群的复制”

如何水平扩展 Amazon RDS 实例?

级联副本仍然适用于 RDS MySQL 吗?