(点击
上方公众号
,可快速关注)
来源:
阿里云 RDS - 数据库内核组
mysql.taobao.org/monthly/2016/04/08/
如有好文章投稿,请点击 → 这里了解详情
前言
只读实例是目前 RDS 用户实现数据读写分离的一种常见架构,用户只需要将业务中的读请求分担到只读节点上,就可以缓解主库查询压力,同时也可以把一些 OLAP 的分析查询放到另外的只读节点上,减小复杂统计查询对主库的冲击,RDS只读节点架构图如下:
由于RDS只读节点采用原生的MySQL Binlog复制技术,那么延迟必然会成为其成立之初就会存在的问题。延迟会导致只读节点与主库的数据出现不一致,进而可能造成业务上逻辑的混乱或者数据不正确。
最近也收到了很多用户关于只读实例延迟的问题反馈,下面将会分析RDS只读实例出现延迟的几种常见场景,希望能够帮助用户理解和处理只读节点的延迟,更好地使用只读节点:
-
只读节点规格过小(10%)
-
主库的TPS过高(20%)
-
主库的DDL(alter、drop、repair)(40%)
-
主库大事务(insert..select)(20%)
-
其他(无主键)(10%)
场景一:只读实例规格配置过小导致延迟
这类延迟场景的出现往往是主节点购买的一个较大规格的配置,而只读节点却购买了一个最小规格的配置(例如240M内存/150 IOPS)。
分析:只读节点的数据为了和主节点保持同步,采用了MySQL原生的binlog复制技术,由一个IO线程和一个SQL线程来完成,IO线程负责将主库的binlog拉取到只读节点,SQL线程负责消费这些binlog日志,这两个线程会消耗掉只读节点的IO资源,所以当只读节点IOPS配置不够的时候,则会导致只读节点的数据出现延迟:
可以通过只读节点性能监控来判断是否已经达到只读实例的资源配额:
所以当这样的延迟情况的发生的时候,需要用户升级只读实例的规格(可以参考主库此时的IOPS的消耗情况),防止由于只读实例的规格较小导致了数据延迟。
最佳实践:只读实例节点的配置大于或者等于主节点的配置;
场景二:主库的TPS过高导致只读节点延迟
这一类的延迟也是非常常见的延迟,由于只读节点与主库的同步采用的是单线程同步,而主库的压力是并发多线程写入,这样势必会导致只读节点的数据延迟,可以通过观察只读节点的TPS与主节点的TPS性能数据来完成判断:
主库的TPS性能数据:
只读节点的TPS性能数据:
针对这样场景的延迟,开启只读节点的并行复制是解决这一问题的根本方法,目前RDS生产环境默认开启了并行复制。但是并行复制也不能够彻底解决单表更新的问题,所以用户需要排查业务写入压力是否正常,适当对业务进行优化或者拆分,保证主库的TPS不会导致slave出现延迟。