AWS RDS 读取副本失败问题

AWS RDS Read repica failure issue

我们在 MySQL RDS 服务器上创建了只读副本并且我们的主实例启用了 多可用区 ,当我们试图强制故障转移测试我们的只读副本时IO 线程停止了,我们得到了 Error 1236 fatal error 我们的二进制日志已损坏。

为避免此副本失败,必须启用 innodb_flush_log_at_trx_commit=1sync_binlog=1,但如果我们按照建议设置这些变量,那么它会使我们的写入操作降低 50% - 60%。

有什么方法可以避免此复制错误,而不是设置高于建议值,否则如果有必要按照建议进行设置,请向我们建议一种改进写入操作的方法?

此答案一般适用于 MySQL 复制,而不仅仅是 AWS。

如果您接近超出系统的容量,您需要认真研究正在发生的事情。

简短的回答是将多个交易合并(在可行的情况下)为一个。 innodb_flush_log_at_trx_commit=1 涉及每个事务结束时的 'extra' fsync。因此,更少的事务 --> 更少 I/O --> 更少的争用。

在我明白发生了什么之前,我使用了 sync_binlog=0 随机数。当某些东西确实崩溃时,二进制日志实际上并不是 "corrupt",但从站将指向一个 "impossible position"。这是因为位置信息在实际写入 Master 磁盘之前已经发送给 Slave。解决方案很简单:将指针(在 Slave 上)移动到下一个 binlog(在 Master 上)的开头(Pos=0 或 4)。

我怀疑(没有任何真实证据)innodb_flatc 比 sync_binlog 对性能的影响更大。

现在介绍一些 AWS 的细节。如果 "multi-AZ" 意味着 每个磁盘写入 都在写入两个不同数据中心的机器,那么问题不仅仅是您提出的两个设置。相反,如果这意味着从站远离主站,那么它就像普通的 MySQL 复制(针对此问答)。