关于同步延迟原因与处理的RDS MySQL 只读实例

RDS MySQL只读实例一般来说用于分担主实例的查询(Select)压力,或者用于运行OLAP类型的分析应用,避免复杂统计查询对主实例的性能影响。

RDS MySQL只读实例架构图如下所示:

因为RDS只读实例采用MySQL原生的基于Binlog的复制技术(半异步复制或异步复制),所以延迟必然会成为成立之初就存在的问题。

由于延迟会导致只读实例与主实例的数据出现不一致的情况,进而可能造成业务上逻辑的混乱或者数据不正确。另外延迟也有可能引起Binlog数据堆积,导致只读实例空间被迅速消耗(如果主实例当前正产生大量的binlog数据),这种情况下有可能会使只读实例被锁定。

只读实例产生延迟的原因

1.主实例的TPS(Transaction Per Second)过高

主实例的 TPS (Insert、Update、Delete)过高导致只读节点延迟。如下图所示:

分析:

由于只读节点与主实例同步采用的是单线程同步,而主实例的压力是并发多线程写入,这样在主实例高并发DML TPS 情况下非常容易出现只读实例的数据延迟,可以通过观察只读实例节点的TPS与 主实例的TPS性能数据来完成判断。

主实例的 TPS如下图 :

只读实例的TPS如下图图:

只读实例的延迟如下图:

建议:

排查主实例的写入压力是否正常;如果正常则需要对业务进行优化或者拆分,保证主实例的TPS不会导致只读实例出现延迟。

2. 只读实例规格过小

这类延迟场景经常出现在只读实例规格和主实例规格相差较大,而且只读实例上负载较重,比如只读实例上 IOPS 打满。

分析:

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

比如下面的例子: 只读实例的 IOPS 被查询打满,导致和主实例的数据同步出现延迟。如下图所示:

建议:

对于这样的情况,建议用户升级只读实例规格,避免由于只读实例规格较小导致数据延迟。RDS推荐只读实例的配置大于或者等于主实例的配置。

3. 主实例的大事务

主实例执行一个大事务导致延迟。

分析:

比如在主实例执行一个涉及数据量非常大的 update、delete、insert...select、replace...select 等事务操作,生成大量的binlog数据传送到只读实例。只读实例需要花费与主实例相若的时间来完成该事务,进而导致了只读实例的同步延迟。

比如下面的例子,在主实例上执行一个持续80秒的删除操作,会导致只读实例上出现数据延迟。如下图:

只读实例数据延迟,如下图:

在只读实例出现大事务导致延迟时,通过show slave status \G 命令,可以看到 Seconds_Behind_Master 不断变化,而Exec_Master_Log_Pos 却保持不变,这样可以判断只读实例的SQL线程在执行一个大的事务或者DDL操作。

建议:

建议考虑将大事务拆分为小事务(比如在delete语句中增加where条件子句,限制每次删除的数据量,将一次删除操作拆分为多次数据量较小的删除操作进行),这样只读实例可以迅速的完成事务的执行,不会造成数据的延迟。如下图:

4. 只读实例MyISAM引擎表

只读实例上针对MyISAM引擎表的长时间查询,阻塞来自主实例对该表的数据同步,导致只读实例数据延迟。

分析:

MyISAM 引擎表读写相互冲突,同一时间读写不能并发操作,且仅支持表级锁。因此表上的长时间查询(比如SQL注入)会阻塞SQL线程应用来自主实例的该表数据变化,导致只读实例数据延迟。

主实例: 对 MyISAM 引擎表 large_tab_02插入数据。如下图:

只读实例:存在对表 large_tab_02 的长时间查询,使SQL应用线程等待large_tab_02表级锁,导致数据步发生延迟。如下图:

建议:

如果使用只读实例,建议业务低峰期将主实例上的 MyISAM 引擎表转换为 InnoDB 引擎表(只读实例上会相应进行转换)。

5. 主实例的DDL语句

主实例的DDL(alter、drop、repair、create)导致只读实例延迟。

分析:

只读实例和主实例数据同步是串行进行的,如果DDL操作在主实例执行时间很长,那么同样在只读实例也会消耗同样的时间。比如对一张 500 万行的表添加一个字段耗费了10分钟,那么在只读实例上同样也会耗费10分钟。所以只读实例会延迟600秒。其他常见操作比如 create index、repair table、alter table add column 等。

主实例如图:

只读实例如图:

只读实例上执行的查询或未完成的事务阻塞来自主实例的DDL执行。在只读实例上执行 show processlist 命令查看SQL线程的状态为:waiting for table metadata lock.

只读实例如图:

建议:

对于DDL直接引起的只读实例延迟,建议这些 DDL 在业务低峰期执行。

对于来自主实例的DDL在只读实例上被阻塞的情况,需要 kill 掉只读实例上引起阻塞的会话(通常是运行时间长的查询)来恢复只读实例和主实例的数据同步。

注:对于表原数据锁等待的原因和处理,请参考 RDS MySQL 表上Metadata lock 的产生和处理。

6.其他

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

比如只读实例的主机IO压力出现异常,或者对无主键的表进行删除(RDS目前已经支持对表添加隐式主键,但是对于以前历史创建的表需要进行重建才能支持隐式主键)。

7.综述

综上所述,把目前RDS只读实例出现延迟的场景都进行了分析,可以简单归纳一下:

当只读实例出现延迟后,

一看只读节点IOPS定位是否存在资源瓶颈;

二看只读节点的binlog增长量定位是否存在大事务;

三看只读节点的ComDML性能指标,对比主节点的ComDML定位是否是主库写入压力过高导致;

四看只读节点执行 show slave status \G,判断是否有 Waiting for table metadata lock;同时在主实例控制台 =》SQL明细 中排查下是否有 alter,repair,create等DDL操作;

五看只读节点执行 show slave status \G,判断是否有 Waiting for table level lock; 同时通过 show full processlist; 或者 DMS =》 实例信息 =》 实例会话 检查下是否有长时间对 MyISAM 引擎表的查询。

如果上述五看都还没有发现问题,那么在最后再检查一下只读节点是否存在无主键表的删除或者更新操作,可以通过在只读节点执行: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 |

mysql发生只读的原因_关于同步延迟原因与处理的RDS MySQL 只读实例相关推荐

  1. mysql主从复制延时性问题_MySQL主从同步延迟原因及解决办法

    MySQL主从延迟原因以及解决方案:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作(mysql5.6版本之前),主库对所有DDL和D ...

  2. rds mysql自建从库_在阿里云ECS上自建RDS(MYSQL)的从库

    废话不多说,直接开搞. 1.新购ECS及安装mysql 略过. 按照之前新增从库的套路在导出数据库时尽然卡住了 导出命令 mysqldump -hrm-2zeu9.mysql.rds.aliyuncs ...

  3. C:\Windows\system32>net start MySQL 发生系统错误 1058。 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。

    问题概述 C:\Windows\system32>net start MySQL 发生系统错误 1058. 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动. 解决方法

  4. mysql 主从同步 速度_MySQL主从同步延迟原因及解决办法

    MySQL主从同步延迟原因及解决办法 MySQL主从延迟原因以及解决方案: 谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作(mysq ...

  5. MySQL主从同步延迟原因与解决方案

    一.MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高.Slave的SQL Thr ...

  6. mysql事务手写笔记_兴奋了!阿里技术官手写“MySQL笔记”,传授你年薪百万级干货...

    前言 MySQL重要吗?重要!为什么重要?因为它在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的.My ...

  7. mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?

    MySQL中数据是索引组织表,即表中数据按照主键顺序存放.所以就可以基于索引这种数据结构实现一些高级算法,来提高检索效率. 常见的查找算法 顺序查找:复杂度O(n),在数据量大时,效率很低 二分查找: ...

  8. mysql 索引失效原因_索引失效的原因

    但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全 ...

  9. 对mysql的总结与反思_一次DB故障引起的反思和MySQL Operator选型

    前言 在一次数据库故障后,我们发现业务库会根据业务的等级会划分多个 MySQL 实例,许多业务库会同时属于一个 MySQL 实例,当一个库引发问题后整个实例的状态是不可控的.从而导致这个实例上的所有业 ...

最新文章

  1. window下启动nexus出错Unsupported major.minor version 51
  2. 每日一皮:你偷偷藏私房钱时被老婆发现的样子...
  3. Google C++编程风格指南
  4. linux里c库和gnu c库,Linux下的C的库文件和头文件有什么区别-
  5. 直播报名 | 券商如何精细化运营?
  6. C#反射调用 异常信息:Ambiguous match found.
  7. Lambda项目:迈向多核及超越
  8. 小学计算机三年级课程目录,小学生信息技术课本目录.doc
  9. 面试系列第1篇:常见面试题和面试套路有哪些?
  10. 安卓逆向系列教程(一)Dalvik 指令集
  11. Android 系统(171)---OrmLite数据库框架,Picasso框架,Okio框架,OKHttp框架
  12. DNS 反向解析出错 Error in named configuration: zone centos.vbird/IN: loaded serial 2011080401
  13. 【HDU - 3038】How Many Answers Are Wrong 【带权并查集 - 向量偏移】
  14. Apache Atlas 数据血缘
  15. 豆粕5连跌四月季节性偏弱,铁矿石认购翻倍,甲醇05-09季节性反套2022.3.30
  16. 2020-11-07 Mybatis
  17. UOS 在桌面创建网页快捷方式
  18. 化繁为简——分解复杂的SQL语句
  19. 机器人系统设计与制作:Python语言实现2.4 用LibreCAD生成机器人的二维CAD图
  20. MMX, SSE, SSE2

热门文章

  1. conceptdraw mindmap
  2. 印度程序员 微软_微软Kaizala使印度铁路公司能够将其300万员工与医疗服务联系起来
  3. 【连载】MySQL笔记——是时候拥有自己的数据库啦
  4. 用计算机弹卡路里谱子,听完瘦10斤!卡路里D/F/G调曲谱+伴奏+示范~
  5. 重定向,管道符,黑洞文件
  6. iqoo7和红米k40pro的区别 iqoo7和红米k40pro参数对比哪个好
  7. 实现在科汛CMS会员中心调用指定栏目文章方法【已解决】
  8. HYSBZ - 1502 月下柠檬树【辛普森积分】
  9. 用r语言对优惠券推荐网站数据LDA文本挖掘
  10. pytorch--resnet 精准迁移学习 花朵识别