有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断
个人不是很喜欢在技术上跟人互喷,尤其是不在同一个岗位上的人。一方面本人的性格如此,另一方面,我自身的口水也确实是不行,人生经历了第一次的双11洗礼,在大促的环境下,总算知道了有些东西是否应该规避,这次的大促中,因为读库的延时,导致了主从这块的延时差异几乎持续了6个小时,这个也确实是跟我经验有关系。虽然对方的话语还是有点难听,但自己没有很清晰的对这个主从延时进行剖析,就是自己的问题,在阿里的论坛上看到对只读延时的剖析,觉得写的很好,分享出来,同时在这里做了一下对应的排版,希望遇到这问题的人,可以有所明白,也希望能看到这篇文章的人,能有所收获,IT道路本身就容易受到委屈,受到委屈了没有关系,做好自己的事情先。
原文分享--个人经过排版了一下
只读实例是目前RDS用户实现数据读写分离的一种常见架构,用户只需要将业务中的读请求分担到只读节点上,就可以缓解主库查询压力,同时也可以把一些OLAP的分析查询放到另外的只读节点上,减小复杂统计查询对主库的冲击,RDS只读节点架构图如下:

由于RDS只读节点采用原生的MySQL Binlog复制技术,那么延迟必然会成为他成立之初就会存在的问题。延迟会导致只读节点与主库的数据出现不一致,进而可能造成业务上逻辑的混乱或者数据不正确;另外只读实例延迟同样也会触发binlog堆积,导致只读实例的空间迅速消耗完,这样会导致只读实例被锁定,锁定之后应用则无法完成读操作。
最近也收到了很多用户关于只读实例延迟的问题反馈,下面将会分析RDS只读实例出现延迟的几种常见场景,希望能够帮助用户理解和处理只读节点的延迟,更好地使用只读节点:
一.只读节点规格过小(10%)
二.主库的TPS过高(20%)
三.主库的DDL(alter、drop、repair)(40%)
四.主库大事务(insert..select)(20%)
五.其他(无主键,主机压力)(10%)
数据图:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
只读实例延迟场景一:只读实例规格配置过小导致slave延迟,这类延迟场景的出现往往主节点购买的一个非常大规格的配置,而只读节点却购买了一个最小规格的配置(240M内存/150 IOPS)。
分析:只读节点的数据为了和主节点保持同步,采用了MySQL原生的binlog复制技术,由一个IO线程和一个SQL线程来完成,IO线程负责将主库的binlog拉取到只读节点,SQL线程负责消费这些binlog日志,这两个线程会消耗掉只读节点的IO资源,所以当只读节点IOPS配置不够的时候,则会导致只读节点的数据出现延迟:

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

所以当这样的延迟情况的发生的时候,需要用户升级只读实例的规格(可以参考主库此时的IOPS的消耗情况),防止由于只读实例的规格较小导致了数据延迟。最佳实践:只读实例节点的配置大于或者等于主节点的配置;
这里补充一下:
mysql的主从复制都是单线程的操作,主库对所有DDL和 DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步, 问题来
了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺 序的,成本高很多,还可能可slave上的其他查询产生lock争用,
由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要 执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:
“主库上那个相同的DDL也需要执行10分,为什 么slave会延时?”,答案是master可以并发,Slave_SQL_Running线程却不可以。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
只读实例延迟场景二:主库的TPS(insert,update,delete)过高导致只读节点延迟,这一类的延迟也是非常常见的延迟,由于只读节点与主库的同步采用的是单线程同步,而主库的压力是并发多线程写入,这样势必会导致只读节点的数据延迟,可以通过观察只读节点的TPS与主节点的TPS性能数据来完成判断:
主库的TPS性能数据:

只读节点的TPS性能数据:

针对这样场景的延迟,开启只读节点的并行复制是解决这一问题的根本方法,但目前RDS线上还没有大规模的使用,所以用户需要排查主库的这些写入压力是否正常,如果正常则需要对业务进行优化或者拆分,保证主库的TPS不会导致slave出现延迟。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
只读实例延迟场景三:主库的DDL(alter、drop、repair、create)导致只读节点延迟,这种延迟是非常常见的延迟, 可以分为两类:
第一类:只读节点与主库的数据同步是串行进行的,如果DDL操作在主库执行时间很长,那么同样在备库也会消耗同样的时间,比如在主库对一张500W的表添加一个字段耗费了10分钟,那么在只读节点上也同样会耗费10分钟,所以只读节点会延迟600S,其他常见操作比如create index,repair table,alter table add column;
范例:只读节点出现延迟

主库备库同样出现延迟:

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

第二类:由于只读节点上会有用户的查询在上面运行,所以如果只读节点上有一个执行时间非常长的的查询正在执行,那么这个查询会堵塞来自主库的DDL,直到查询结束为止,进而导致了只读节点的数据延迟。在只读节点上可以通过执行show processlist命令查看连接的状态处于: Waiting for table metadata lock
为什么要标红这个,因为,这个就是他妈的坑货害的我主从延时这么大的根本原因,而我经验的问题,却没有在当时的情况下,通过processlist查看是否有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延时


针对此类大事务延迟的场景,需要将大事务拆分成为小事务进行,这样只读节点就可以迅速的完成事务的执行,不会造成数据的延迟。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
只读实例延迟场景五:其他只读实例出现延迟的情况比如只读实例的主机IO压力出现异常,或者对无主键的表进行删除(可以参考mysql主键的缺少导致备库hang),RDS目前已经支持对表添加隐士主键,但是对于以前历史创建的表需要进行重建才能支持隐士主键。
综上所述,把目前RDS只读实例出现延迟的场景都进行了分析,可以简单归纳一下,当只读实例出现延迟后,通过
一看只读节点IOPS定位是否存在资源瓶颈 二看只读节点的binlog增长量定位是否存在大事务 三看只读节点的commdml性能指标,对比主节点的commdml定位是否是主库写入压力过高导致 四看只读节点show full processlist,判断是否有Waiting for table metadata lock和alter,repair,create等ddl操作
如果上述四看都还没有发现问题,那么在最后再检查一下只读节点是否存在无主键表的删除或者更新操作,可以通过在只读节点执行:show engine innodb status\G或者show open tables状态为in_use为1的表:
mysql> show open tables;
+————–+———————+——–+————-+
| Database | Table | In_use | Name_locked |
+————–+———————+——–+————-+
| aixuedai_web | sd_repay | 4 | 0 |
| mysql | slow_log | 0 | 0 |
| dw | dw_acc_sd_expectpay | 1 | 0 |
差点忘了摘录地址:
https://bbs.aliyun.com/read/250956.html
文章由阿里的团队所发,论据充分而有条理。
有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断的更多相关文章
- mysql主从延时处理方法
mysql主从延时处理方法 1.今天做数据迁移,4个库总共60G数据左右吧,迁移成功后,发现从库延时在不断的上升,查看从库库表,部分表还没有同步过去 2.网上查询了一些文章,增加一下配置可以解决: # ...
- Mysql 主从延时监控
200 ? "200px" : this.width)!important;} --> 介绍 主从延时在主从环境中是一个非常值得关注的问题,有时候我们可以通过show sla ...
- MySQL主从延时这么长,要怎么优化?
MySQL主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重. 为什么主从延时这么大? 答:MySQL使用单线程重放RelayL ...
- mysql主从延时临时解决办法
主从延时临时解决办法: 主从延迟严重的原因很多,其中有以下原因: 一.由于无主键大表的delete 和update导致. mysql 主从复制时.如果表上没有主键.会导致update和delete操 ...
- 阿里云RDS上的一些概念性记录
刚接触RDS,只能对RDS上的一些特性做一些笔记,方便记忆,以下为RDS上的内容摘录,取自官方文档 1 数据备份 可使用命令行或图形界面进行逻辑数据备份.仅限通过 RDS 管理控制台 或 OPEN A ...
- 免费公测:RDS只读实例
免费公测:RDS只读实例 简要介绍 在对数据库有少量写请求,但有大量的读请求的应用场景下,单个实例可能无法抵抗读取压力, 甚至对主流程业务产生影响.为了实现读取能力的弹性扩展,分担数据库压力,阿里 ...
- C# 8: 可变结构体中的只读实例成员
在之前的文章中我们介绍了 C# 中的 只读结构体(readonly struct)[1] 和与其紧密相关的 in 参数[2]. 今天我们来讨论一下从 C# 8 开始引入的一个特性:可变结构体中的只读实 ...
- PHP学习笔记--文件目录操作(文件上传实例)
文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...
- MySQL主从数据同步延时分析
一.MySQL数据库主从同步延迟 要了解MySQL数据库主从同步延迟原理,我们 ...
随机推荐
- SQL 表变量和临时表
SQL 表变量和临时表 表变量:存储在内存中,作用域是脚本的执行过程中,脚本执行完毕之后就会释放内存,适合短时间内存储数据量小的数据集. 优点:使用灵活,使用完之后立即释放,不占用物理存储空间 缺点: ...
- 2015 Multi-University Training Contest 1 - 1001 OO’s Sequence
OO’s Sequence Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5288 Mean: 给定一个数列,让你求所有区间上满足 ...
- 使用C#开发屏幕保护程序步骤
本文介绍使用C#制作屏幕保护的方法,这个屏幕保护就是仿效视窗系统自带的字幕屏保. 屏幕保护程序的扩展名虽然是"scr",但其实是一个可执行的"exe"文件.但他 ...
- [CLR via C#]10. 属性
一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方 ...
- js获取url传递的参数
获取URL带参数的JAVASCRIPT客户端解决方案 一.正则分析法.(我较喜欢使用正则)function GetQueryString(name) {var reg = new RegExp(“(^ ...
- 重新想象 Windows 8 Store Apps (58) - 微软账号
[源码下载] 重新想象 Windows 8 Store Apps (58) - 微软账号 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 微软账号 获取微软账号的用户 ...
- MySQL联接操作
在MySQL中,联接是一种对表的引用, 多表联接类型: 1.笛卡尔积(交叉联接):在MySQL中为CROSS JOIN或省略JOIN,如: select * from course, teachcou ...
- LGLProgressHUD
不想用第三方的指示器,感觉有点大,自己写了一个简单的活动指示器,目前只有两种效果.效果如图 第一种: 第二种 第二种可以随着提示文字的增多而变长 LGLProgressHUD.h // // LGLP ...
- 【Asphyre引擎】今天终于把精灵demo基本改好了。
doudou源代码 包含Sprite代码(Sprite还没改完,粒子特效有些问题,但是基本上可以用了) Stage1-1.map 不好意思,漏了地图配置.
- NTFS碎片
在Windows操作系统中查看各分区的文件系统: fsutil fsinfo ntfsinfo c: (查看C:盘的文件系统) fsutil fsinfo ntfsinfo d: (查看D:盘的文件系 ...