当前位置: 首页 > 编程日记 > 正文

有关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

文章由阿里的团队所发,论据充分而有条理。

转载于:https://www.cnblogs.com/olinux/p/6085405.html

相关文章:

后盾网php多少钱_复合排水网价格多少钱

官方电话:【15266936188,0534-2138689】我公司专业生产防渗膜、土工膜、复合土工膜、土工布、隧道防水板、GCL钠基膨润土防水毯、聚酯长丝土工布等土工合成材料,价格合理、提供施工服务。一般情况下它不单独使用,因此在拉伸的过程中通常与成品…

Educational Codeforces Round 45 (Rated for Div. 2) D Graph And Its Complement(图的构造)

题意:构造一个图,使这个图的连通分量有a个,其补图的连通分量有b个,输出邻接矩阵 可以推出当min(a,b)!1时输出no ab1且n2或者n3时也为no 其余只要把一个连通分量里的x个点用x-1条边串起来就好了 哎,最后想到n3也为no,可惜了.. #include <bits/stdc.h> #define ll long…

一文读懂公有链、私有链、联盟链

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链中公有链、私有链、联盟链都是区块链技术的一个细分&#xff0c;而技术仅仅是一种工具&#xff0c;怎么在不同的场景应用好不同的工具才是技…

近20个绚丽实用的jQuery/CSS3侧边栏菜单(转载)

http://developer.51cto.com/art/201510/493530.htm 近20个绚丽实用的jQuery/CSS3侧边栏菜单 jQuery作为一款主流的JavaScript前端开发框架&#xff0c;深受广告开发者的亲睐&#xff0c;同时jQuery有着不计其数的插件&#xff0c;特别是菜单插件更为丰 富&#xff0c;本文将要…

OpenJDK 编译-Linux环境

说明&#xff1a;笔者是在Ubuntu 16.04虚拟机中编译 OpenJDK 8 源码下载 http://download.java.net/openjdk/jdk8/ 推荐直接下载openjdk-8-src-b132-03_mar_2014.zip 环境准备&#xff1a; 安装bootstrap JDK&#xff0c;笔者安装的jdk7&#xff1b; 在环境变量PATH中添加jdk的…

linux 故障注入_阿里巴巴开源故障注入工具_chaosblade

chaosblade是阿里巴巴最近开源的一款故障注入的工具&#xff0c;因为我最近在做公司的虚拟化平台的可靠性测试工具&#xff0c;无意中发现这个工具&#xff0c;个人感觉比较有用&#xff0c;用起来也比较简单&#xff0c;所以拿出来分享一下&#xff0c;期望对大家的工作和学习…

带你了解“比特币黄金”和SegWit2x分叉

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 10月25日&#xff0c;比特币黄金从比特币中分离出来创造出一个基于ASIC挖矿的数字货币。几周之后&#xff0c;比特币公司中一个重要的集团想要根据…

HTML5-用canvas画布rotate字体旋转(中国象棋棋谱)。

一开始我们老师安排我做这个作业&#xff0c;在这个作业我遇到了一个很重大的问题就是&#xff0c;文字旋转这么旋转&#xff0c;我查了很多资料。 1发现绘画正方形&#xff0c;使他正方形中心原点旋转非常容易理解。&#xff08;我相信这个很多人看一下都会懂,&#xff09; 1.…

jQuery的deferred对象详解

阮一峰大神的关于jQuery的deferred对象详解 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html 转载于:https://www.cnblogs.com/qiufang/p/8886412.html

unity3d 切换网络_Unity3d新网络请求方式UnityWebRequest详解

Unity将要逐步放弃www网络请求api&#xff0c;新的api请求方式来临&#xff1a;UnityWebRequestThe&#xff0c;也正是本篇文章要给大家介绍的重点&#xff0c;那就是UnityWebRequestThe的使用详解。旧的 www &#xff1a;https://docs.unity3d.com/ScriptReference/WWW.html新…

PoW工作量证明

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 PoW是Proof of Work的缩写&#xff0c;即工作量证明的意思。在《拜占庭将军问题》中介绍过&#xff0c;比特币系统中引入了“工作量”的概念&#…

zookeeper 集群安装

一、ZooKeeper相关概念简介&#xff1a;ZooKeeper是一个开源的、分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服…

python queue 多进程_python中的Queue与多进程(multiprocessing)

最近接触一个项目&#xff0c;要在多个虚拟机中运行任务&#xff0c;参考别人之前项目的代码&#xff0c;采用了多进程来处理&#xff0c;于是上网查了查python中的多进程一、先说说Queue(队列对象)Queue是python中的标准库&#xff0c;可以直接import 引用&#xff0c;之前学习…

postman测试上传文件

输入url&#xff1a;http://127.0.0.1:8081/uploadfile 选择post方式 选择body 选择form-data&#xff0c;text改为file 输入key&#xff1a;file &#xff0c;value&#xff1a;选择文件 send即可 转载于:https://www.cnblogs.com/shimh/p/6094410.html

区块链资产安全攻略

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 本文从钱包、密码、软件、备份、交易所、习惯几个方面给出一些指引。 钱包 每个钱包在熟练使用之前&#xff0c;请用小额测试。 有条件购买硬件钱…

win10安装docker并结合Idea2018.1部署springboot项目

一、准备工作 1.、工具&#xff1a;win10&#xff0c;idea2018&#xff0c;maven3.5&#xff0c;jdk8 二、win10安装docker 1、win10安装docker&#xff1a;http://www.runoob.com/docker/windows-docker-install.html 2、安装完毕后&#xff0c;点击小鲸鱼&#xff0c;选择set…

在桌面右键菜单,停止工作,并提示“资源管理器停止工作”等情况。

在配置文件中&#xff0c;找到右键管理菜单&#xff0c;然后删除NvCp开头的扩展项有问题&#xff0c;去掉就完事了。转载于:https://www.cnblogs.com/wangfengderizi/p/6094446.html

ue4cmd怎么调用_[UE4,automation]UE4批渲染cmd篇

之前做项目的过程中&#xff0c;有一部分工作是在UE4里制作输出小短片。由于要完成的量比较大&#xff0c;所以研究了一些批渲染的方法。逻辑上跟以前在maya里用batch render差不多&#xff0c;不过UE4这边的设置相对繁琐一点点。本文讲解了在不打开UE4软件的前提下&#xff0c…

区块链将带来怎样的应用?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 在上一篇文章中&#xff0c;咱们聊到了区块链技术正在与大数据、云计算、物联网以及人工智能这些技术链接&#xff0c;随时可能碰撞出技术创新的火…

【Spark】Spark2.x版的新特性

一、API 1. 出现新的上下文接口&#xff1a;SparkSession&#xff0c;统一了SQLContext和HiveContext&#xff0c;并且为SparkSession开发了新的流式调用的configuration API 2. 统一了DataFrame和DataSet。DataFrame相当于DataSet[Row]&#xff0c;以及DataSet的增强聚合API 3…

python基础主要内容_python基础—python的介绍

编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.这是因为计算机不能直接认识并…

Web Serveice服务代理类生成及编译

一、生成代理类 对于web service服务和wcf的webservice服务&#xff0c;我们都可以通过一个代理类来调用。 怎么写那个代理类呢&#xff1f;通过一个工具生成即可&#xff01;&#xff01;微软为我们提供了一个wsdl.exe的Web服务描述语言工具&#xff0c;wsdl.exe从 WSDL 协定文…

生成器/迭代器 和 函数的递归

生成器 一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值&#xff0c;但是yield又不同于return&#xff0c;return的执行意味着程序的结束&#xff0c;调用生成器函数不会得到返回的具体的值&#xff0c;而是得到一个可迭代的对象。每一次获取这个…

CDN -- 集合

weui https://cdnjs.cloudflare.com/ajax/libs/weui/0.4.3/style/weui.min.css 百度静态资源库 http://cdn.code.baidu.com/转载于:https://www.cnblogs.com/xuange306/p/6102407.html

python清华大学出版社第三章课堂作业的答案_Python程序设计清华大学出版社董付国第3章选择与循环题库.ppt...

3.5 综合运用 例2&#xff1a;输出序列中的元素。 a_list[a, b, mpilgrim, z, example] for i,v in enumerate(a_list): print 列表的第, i1, 个元素是&#xff1a;, v 3.5 综合运用 例3&#xff1a;求1~100之间能被7整除&#xff0c;但不能同时被5整除的所有整数 。 for i in …

以太坊私链入门

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载 目录 背景软件安装与配置 2.1. Ubuntu 2.1.1. 安装 geth 2.1.2. 安装 solc 2.2. Windows 2.3. Mac OS 2.4. 编译安装创世区块 3.1. 初始化创世区块 …

数据结构(十)栈的作用--大数的加法运算

一、大数加法的定义 在Java中&#xff0c;整数类型有四种&#xff0c;byte&#xff08;8位&#xff09;、short&#xff08;16位&#xff09;、int&#xff08;32位&#xff09;、long&#xff08;64位&#xff09;。 其中&#xff0c;int类型为32为&#xff0c;也就是说最大的…

分布式技术一周技术动态 2016-11-27

分布式系统实践 1. 大数据时代快速SQL引擎-Impala http://dwz.cn/4G9mvt 摘要: 在Dremel论文发表之后&#xff0c;开源社区涌现出了一批基于MPP架构的SQL-on-Hadoop(HDFS)查询引擎&#xff0c;典型代表有Apache Impala、Presto、Apache Drill、Apache HAWQ等&#xff0c;看上去…

vuerouter3种模式_Vue-router的三种传参方式

第一种传递参数&#xff1a;name传参两步完成name传参并显示在模板中&#xff1b;第一在router/index.js中配置name属性&#xff0c;routes: [{path: /,name: HelloWorld,component: HelloWorld},]第二步在src/App.vue接收{{ $route.name }}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

以太坊的数据结构

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊被描述为为一个交易驱动的状态机&#xff0c;它在某个状态下接受一些输入后&#xff0c;会确定的转移到一个新的状态。具体来说&#xff0c;…