MySQL · 最佳实践 · RDS 只读实例延迟分析

前言

只读实例是目前 RDS 用户实现数据读写分离的一种常见架构,用户只需要将业务中的读请求分担到只读节点上,就可以缓解主库查询压力,同时也可以把一些 OLAP 的分析查询放到另外的只读节点上,减小复杂统计查询对主库的冲击,RDS只读节点架构图如下:

由于RDS只读节点采用原生的MySQL Binlog复制技术,那么延迟必然会成为其成立之初就会存在的问题。延迟会导致只读节点与主库的数据出现不一致,进而可能造成业务上逻辑的混乱或者数据不正确。

最近也收到了很多用户关于只读实例延迟的问题反馈,下面将会分析RDS只读实例出现延迟的几种常见场景,希望能够帮助用户理解和处理只读节点的延迟,更好地使用只读节点:

  1. 只读节点规格过小(10%)
  2. 主库的TPS过高(20%)
  3. 主库的DDL(alter、drop、repair)(40%)
  4. 主库大事务(insert..select)(20%)
  5. 其他(无主键)(10%)

场景一:只读实例规格配置过小导致延迟

这类延迟场景的出现往往是主节点购买的一个较大规格的配置,而只读节点却购买了一个最小规格的配置(例如240M内存/150 IOPS)。

分析:只读节点的数据为了和主节点保持同步,采用了MySQL原生的binlog复制技术,由一个IO线程和一个SQL线程来完成,IO线程负责将主库的binlog拉取到只读节点,SQL线程负责消费这些binlog日志,这两个线程会消耗掉只读节点的IO资源,所以当只读节点IOPS配置不够的时候,则会导致只读节点的数据出现延迟:

可以通过只读节点性能监控来判断是否已经达到只读实例的资源配额:

所以当这样的延迟情况的发生的时候,需要用户升级只读实例的规格(可以参考主库此时的IOPS的消耗情况),防止由于只读实例的规格较小导致了数据延迟。

最佳实践:只读实例节点的配置大于或者等于主节点的配置;

场景二:主库的TPS过高导致只读节点延迟

这一类的延迟也是非常常见的延迟,由于只读节点与主库的同步采用的是单线程同步,而主库的压力是并发多线程写入,这样势必会导致只读节点的数据延迟,可以通过观察只读节点的TPS与主节点的TPS性能数据来完成判断:

主库的TPS性能数据:

只读节点的TPS性能数据:

针对这样场景的延迟,开启只读节点的并行复制是解决这一问题的根本方法,目前RDS生产环境默认开启了并行复制。但是并行复制也不能够彻底解决单表更新的问题,所以用户需要排查业务写入压力是否正常,适当对业务进行优化或者拆分,保证主库的TPS不会导致slave出现延迟。

场景三:主库的DDL(alter、drop、repair、create)导致只读节点延迟

这种延迟是非常常见的延迟, 可以分为两类:

第一类:只读节点与主库的DDL同步是串行进行的,如果DDL操作在主库执行时间很长,那么同样在备库也会消耗同样的时间,比如在主库对一张500W的表添加一个字段耗费了10分钟,那么在只读节点上也同样会耗费10分钟,所以只读节点会延迟600S,其他常见操作比如:

create index,repair table,
alter table add column;

范例:只读节点出现延迟

主实例备库同样出现延迟:

查看主库这这一段时间是否存在DDL,发现主库在添加索引:

第二类:由于只读节点上会有用户的查询在上面运行,所以如果只读节点上有一个执行时间非常长的的查询正在执行,那么这个查询会堵塞来自主库的DDL,直到查询结束为止,进而导致了只读节点的数据延迟。在只读节点上可以通过执行show processlist命令查看连接的状态处于: Waiting for table metadata lock

这个时候只需要kill掉只读节点上的大查询就可以恢复只读节点与主节点的数据同步。

场景四:主库执行大事务导致延迟

这一种延迟场景也是比较常见的,比如在主库执行一个大的update、delete、insert … select的事务操作,产生大量的binlog传送到只读节点,只读节点需要花费与主库相同的时间来完成该事务操作,进而导致了只读节点的延迟。只读实例发生延迟,在只读节点执行show slave status\G命令,可以通过两个关键的位点参数来判断只读实例上是否在执行大事务:Seconds_Behind_Master不断增加,但是Exec_Master_Log_Pos 却没有发生变化,这样则可以判断只读节点的SQL线程在执行一个大的事务或者DDL操作。

例如下面的例子,用户在主库执行了一条insert … select非常大的插入操作,该操作产生了近几十G的binlog文件传输到只读节点,进而导致了只读节点出现应用binlog延迟:

针对此类大事务延迟的场景,需要将大事务拆分成为小事务进行排量提交,这样只读节点就可以迅速的完成事务的执行,不会造成数据的延迟。

场景五:其他只读实例出现延迟的情况

如对无主键的表进行删除(可以参考MySQL主键的缺少导致备库hang),RDS目前已经支持对表添加隐式主键,但是对于以前历史创建的表需要进行重建才能支持隐式主键。

总结

综上所述,当只读实例出现延迟后的排查思路:

  1. 看只读节点IOPS定位是否存在资源瓶颈;
  2. 看只读节点的binlog增长量定位是否存在大事务;
  3. 看只读节点的comdml性能指标,对比主节点的commdml定位是否是主库写入压力过高导致;
  4. 看只读节点show full processlist,判断是否有Waiting for table metadata lock和alter,repair,create等ddl操作。

最佳实践

  1. 使用innodb存储引擎;
  2. 只读实例的规格不低于主实例;
  3. 大事务拆分为小事务;
  4. 购买多个只读节点冗余;
  5. DDL变更期间观察是否有大查询。
时间: 2024-09-14 12:10:18

MySQL · 最佳实践 · RDS 只读实例延迟分析的相关文章

关于RDS只读实例延迟分析

只读实例是目前RDS用户实现数据读写分离的一种常见架构,用户只需要将业务中的读请求分担到只读节点上,就可以缓解主库查询压力,同时也可以把一些OLAP的分析查询放到另外的只读节点上,减小复杂统计查询对主库的冲击,RDS只读节点架构图如下: 由于RDS只读节点采用原生的MySQL Binlog复制技术,那么延迟必然会成为他成立之初就会存在的问题.延迟会导致只读节点与主库的数据出现不一致,进而可能造成业务上逻辑的混乱或者数据不正确:另外只读实例延迟同样也会触发binlog堆积,导致只读实例的空间迅速消

MySQL · 最佳实战 · 审计日志实用案例分析

审计日志是RDS安全策略中非常重要的一环,它采集了数据库中所有的访问请求,包括常见的insert,update,delete,select,alter,drop,create语句, 还有一些比如set,commit,rollback命令语句.有了这些日志后可以帮助我们进行问题回溯,分析问题.下面这则案例讲述如何使用审计日志来分析只读实例延迟问题,如果没有审计日志我们很难想象该问题该如何解决. 问题描述: 一客户使用了2个RDS只读节点来承担业务的读流量,两个RDS的资源规格和业务流量完全一样,但

一分钟了解阿里云产品:阿里云RDS只读实例 分担数据库读写压力

阿里云推出RDS只读实例,将满足大量的数据库读取工作负载,帮助用户应对数据库读取压力,实现读取能力的弹性扩展.   阿里云RDS只读实例不但适用于专业的DBA,也非常适用于"小白客户",备份设置.参数修改.阈值报警等数据库常用应用都是图形化操作,对于不精通数据库的用户也可以"零门槛"使用.   RDS实例采用主备架构,RDS在支持只读实例后,只读实例将挂载在主节点上,实例的备节点以及只读实例均利用MySQL的原生复制同步主节点的增量数据.   目前,一个RDS主实例

SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善

title: SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善 author: 石沫 背景 SQL Server 作为一种强大的关系型数据库,能够提供所有场景的应用.在绝大多数云计算公司中,都提供了SQL Server作为服务的云数据库服务,譬如阿里云.但既然是服务,那么服务就需要可管理,可控制,因此,在云计算初期,都对云数据库服务进行了严格的权限控制,好处就是可控可管理,但给用户会带来一些限制,某些限制实际上是可以再细粒度管控.因此,今

MySQL · 最佳实践 · 空间优化

在前三期介绍了RDS for MySQL参数优化,锁问题以及延迟优化最佳实践之后,本期将介绍存储空间相关的最佳实践. 存储空间是RDS很重要的一个指标,在RDS的工单问题中,空间问题的咨询可以排在top 5,当RDS的实际使用空间超过了购买的空间后,实例就会被锁定了,这样就会导致应用无法再写入,更新数据,造成应用的报错.在RDS的控制台中可以设定空间的报警阀值,当实例空间到达报警阀值后用户就会收到报警短信, 这个时候用户则需要对判断当前的空间增长是否合理. 如果增长合理则需要对实例的进行弹性升级

SQLServer · 最佳实践 · RDS for SQLServer 2012权限限制提升与改善

背景 SQL Server 作为一种强大的关系型数据库,能够提供所有场景的应用.在绝大多数云计算公司中,都提供了SQL Server作为服务的云数据库服务,譬如阿里云.但既然是服务,那么服务就需要可管理,可控制,因此,在云计算初期,都对云数据库服务进行了严格的权限控制,好处就是可控可管理,但给用户会带来一些限制,某些限制实际上是可以再细粒度管控.因此,今天我们就要介绍一下阿里云数据库SQL Server 2012在权限限制方面的提升与改善. 用户最关注的权限和使用 根据我们对用户的理解和日常用户

云监控最佳实践之-容器实例热力图

背景: 从某个客户那里收到信息, 他们正在做一个容器服务上所有实例的各种指标的热力图.希望能够整体展示所有容器实例的负载情况. 随着上云不断深入,越来越多的企业级用户选择将服务直接部署在容器服务里,容器实例越来越多,用户期望能够有一个大图显示所有容器实例的热力负载情况.便于随时掌握全局情况. 所以这个需求不是个例,恰好,云监控的dashboard和容器服务监控两者结合可以满足这个需求场景. 具体步骤如下: 使用云账号登录云监控控制台: https://cms.console.aliyun.com

云服务器 ECS 最佳实践:借助于实例 RAM 角色访问其它云产品 API

借助于实例 RAM 角色访问其它云产品 API 概述 以往部署在 ECS 实例中的应用程序如果需要访问阿里云其他云产品的 API,您通常需要借助 Access Key ID 和 Access Key Secret(下文简称 AK)来实现.AK 是您访问阿里云 API 的密钥,具有相应账号的完整权限.为了方便应用程序对 AK 的管理,您通常需要将 AK 保存在应用程序的配置文件中或以其他方式保存在 ECS 实例中,这在一定程度上增加了 AK 管理的复杂性,并且降低了 AK 的保密性.甚至,如果您需

Android应用性能优化最佳实践.2.2 性能分析工具

2.2 性能分析工具 从前一节可以看到,Android系统在4.1以后从框架上解决了由于系统问题导致的卡顿现象,但在实际的使用过程中,在用户的感受上,卡顿仍然是应用开发中主要面临的问题,而原因从上一节的分析中也知道本质是VSync信号到来时,不能及时处理绘制事件导致,本节先抛出以下两个问题: 1)应用层做了什么会导致VSync事件不能及时处理? 2)卡顿能监控吗? 性能问题并不容易复现,也不好定位,光从几个场景不能完全覆盖所有的问题,因此在做性能优化时,最直接有效的方法,就是尽量复现存在性能问题