AWS RDS MySQL 只读副本滞后问题

Posted

技术标签:

【中文标题】AWS RDS MySQL 只读副本滞后问题【英文标题】:AWS RDS MySQL Read Replica Lag Issues 【发布时间】:2014-05-04 04:06:44 【问题描述】:

我运行的服务需要能够支持大约 4000+ IOPS 并保持副本延迟

我正在使用 AWS RDS mysql 实例并且有 2 个只读副本。我的服务在只读副本上遇到了巨大的副本延迟峰值,因此我与 AWS 支持人员联系了一周,试图了解我遇到延迟的原因——我预置了 6000 IOPS,并且我的实例非常强大。他们给了我各种各样的理由。

更改实例类型后,从 5.5 升级到 MySQL 5.6 以利用多线程,并且它们替换了底层硬件,我仍然随机看到明显的副本延迟。

最终,我决定开始修改参数组,将我的配置更改为只读副本的任何我能找到的与复制过程有关的东西,现在终于体验到

以下是我更改的设置及其看似成功的值(我复制了默认的 mysql 5.6 参数组并将这些值更改为仅将更新的参数组应用于只读副本):

innodb_flush_log_at_trx_commit=0
sync_binlog=0
sync_master_info=0
sync_relay_log=0
sync_relay_log_info=0

请阅读其中的每一项以了解修改的影响:http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html

其他需要注意的事项:

Convert any MyISAM tables to InnoDB
Upgrade from MySQL < 5.6 to MySQL >= 5.6
Ensure that your provisioned IOPS are > the combined read/write IOPS you require
Ensure that your read replica instances are >= master instance

如果其他人有任何其他参数可以在只读副本或主数据库上进行修改以获得最佳复制性能,我很乐意听到更多信息。

2014 年 7 月 8 日更新

为了利用我设置的 Mysql 5.6 多线程复制:

slave_parallel_workers=5 (Set it to the number of read replica DBs you have running)

我在这里找到了这个:

https://blogs.oracle.com/MySQL/entry/benchmarking_mysql_replication_with_multi

【问题讨论】:

您能否澄清“确保您的只读副本实例 >= 主实例” - 您是指实例类吗? 是的,如果不是更大,请确保实例类至少相同 【参考方案1】:

Mysql 复制按顺序执行单个数据库上的所有事务,而 master - 可以并行执行这些事务。

您可能在单个 DA 上执行了大部分更新,这就是不允许您利用多线程复制的原因。

检查您的副本服务器上的iostat。大多数情况下,这些问题是由于机器上的高 IO 而发生的。

为了减少机器上的 IO - 您可以进行一些额外的更改:

增加innodb_buffer_pool_size - 这是您应该更改默认值的第一件事。如果此实例仅运行 mysql - 您可以在此处分配大约 80% 的可用内存。

还要验证以下参数:

 log_slave_updates = false
 binlog_format = STATEMENT

(如果您配置了 MIXED 或 ROW binlog_format - 请确认您从此处了解这意味着什么 http://dev.mysql.com/doc/refman/5.6/en/binary-log-setting.html

如果你有很多数据被多次更改 - 增加

innodb_max_dirty_pages_pct 到 90 或 95% 值得检查。

【讨论】:

以上是关于AWS RDS MySQL 只读副本滞后问题的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

AWS RDS极光 - 通过boto3或aws cli创建跨区域读取副本

Amazon RDS 的 Oracle 只读副本

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