备库为什么会延迟好几个小时?(上)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 为什么要有多线程复制呢?这是因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库是可能一直追不上主库的。从现象上看就是,备库上seconds_behind_master的值越来越大。在介绍完每个并行复制策略后,我还和你分享了不同策略的优缺点:如果你是DBA,就需要根据不同的业务场景,选择不同的策略;如果是你业务开发人员,也希望你能从中获取灵感用到平时的开发工作中。从这些分析中,你也会发现大事务不仅会影响到主库,也是造成备库复制延迟的主要原因之一。因此,在平时的开发工作中,我建议你尽量减少大事务操作,把大事务拆成小事务。

之前的文章谈到的事故原因,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。


但若备库执行日志的速度持续低于主库生成日志的速度,那该延迟可能小时级别。而且对于一个压力持续较高的主库,备库可能永远都追不上主库节奏了。


这就牵涉本文话题:备库并行复制能力。


主备流程图

image.png

图中两个黑色箭头:


一个代表客户端写入主库

并行度高于下一个

另一个代表备库上sql_thread执行中转日志(relay log)

主库上影响并发度的原因就是锁。由于InnoDB引擎支持行锁,除了所有并发事务都在更新同一行(热点行)这种极端场景,它对业务并发度的支持还是可以的。所以,你在性能测试的时候会发现,并发压测线程32就比单线程时,总体吞吐量高。


而日志在备库执行,即图中备库上sql_thread更新数据(DATA)的逻辑。若用单线程,就会导致备库应用日志不够快,造成主备延迟。


在5.6版本前,MySQL只支持单线程复制,由此在主库并发高、TPS高时就会出现严重主备延迟。

MySQL多线程复制的演进史

所有的多线程复制机制,都是要把图中只有一个线程的sql_thread,拆成多个线程,也就是都符合下面的这个模型:

image.png

coordinator就是原来的sql_thread, 不过它不再直接更新数据,只负责读取中转日志、分发事务。真正更新日志的,变成了worker线程。而work线程的个数,就是由参数slave_parallel_workers决定。推荐设为8~16之间最好(32核物理机),毕竟备库还可能要提供读查询,不能把CPU占完。


事务能否按轮询分发给各worker?

不行。因为,事务被分发给worker后,不同的worker就独立执行了。但由于CPU的调度策略,可能第二个事务比第一个事务先执行。而这时刚好这俩事务更新同一行,即同一行上的两个事务,在主库和备库上的执行顺序相反,导致主备不一致。


同一个事务的多个更新语句,能否分给不同worker执行?

不行。比如一个事务更新了表t1和表t2中的各一行,若这两条更新语句被分到不同worker,虽然最终结果是主备一致,但若表t1执行完成瞬间,备库有个查询,就会看到这个事务“更新了一半的结果”,破坏了事务逻辑的隔离性。


所以,coordinator在分发的时候,需要满足:


不能造成更新覆盖。这就要求更新同一行的两个事务,必须被分发到同一个worker中

同一个事务不能被拆开,必须放到同一个worker中

MySQL 5.5的并行复制策略

官方MySQL 5.5版本不支持并行复制。但是有人写了:按表分发策略和按行分发策略,以帮助理解MySQL官方版本并行复制策略的迭代。

按表分发策略

若两个事务更新不同表,它们就可以并行。因为数据是存储在表里的,所以按表分发,可以保证两个worker不会更新同一行。

当然,若有跨表事务,还是要把两张表放在一起考虑

  • 按表并行复制程模型
  • image.png

每个worker线程对应一个hash表,保存当前正在这个worker的“执行队列”里的事务所涉及的表。hash的

  • key:库名.表名
  • value:数字,队列中有多少个事务修改这个表

在有事务分配给worker时,事务里涉及的表会被加到对应的hash表中。worker执行完成后,这个表会被从hash表中去掉。


上图中的hash_table_1表示,现在worker_1的“待执行事务队列”里,有4个事务涉及到db1.t1表,有1个事务涉及到db2.t2表。


假设图中的情况下,coordinator从中转日志读入一个新事务T,该事务修改的行涉及表t1、t3。


现在用事务T的分配流程,来看一下分配规则:

  1. 由于事务T中涉及修改t1,而worker_1队列中已经有其它事务Tx在修改t1,T和队列中的Tx事务要修改同一个表的数据:T和worker_1冲突
  2. 按此逻辑,顺序判断T和每个worker队列是否冲突,会发现事务T跟worker_2也冲突
  3. T跟多于1个的worker冲突,coordinator线程就进入等待
  4. 每个worker继续执行,同时修改hash_table。假设hash_table_2里面涉及到修改t3的事务执行完成了,就会去掉hash_table_2中的把db1.t3
  5. 这样coordinator会发现跟T冲突的worker只有worker_1(不多于1个了),因此就把它分配给worker_1
  1. coordinator继续读下一个中转日志,继续分配事务

即每个事务在分发时,跟所有worker的冲突关系如下:

  • 和所有worker都不冲突
    coordinator线程就会把这个事务分配给最空闲的woker;
  • 和多于1个的worker冲突
    coordinator线程就进入等待状态,直到和这个事务存在冲突关系的worker只剩下1个
  • 只和一个worker冲突
    coordinator线程就会把这个事务分配给这个存在冲突关系的worker。

按表分发方案在多个表负载均均匀场景里使用很好。但若碰到热点表,比如所有更新事务都会涉及到某个表时,所有事务都会被分配到同一worker,就变成单线程复制。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
消息中间件 SQL API
Flink线上问题汇总篇(2)-时区不一致系统时间少8小时导致数据丢失问题
flink按月度汇总数据,月初时数据部分丢失问题
1576 0
|
SQL 弹性计算 运维
数据库故障致美国超一万航班取消或延迟
在2023年新年的第二周,美国东部时间1月11日上午,6点29分,美国航空监管机构(FAA)发布了一条仅40字的通告,随后不久,很快就宣布停飞全美所有国内航班。通告内容是,FAA正在对NOTAM(Notice to Air Missions)系统进行验证和恢复,在第一条通知之后的50分钟,FAA就宣布停飞所有国内航班。
331 0
数据库故障致美国超一万航班取消或延迟
|
SQL 关系型数据库 MySQL
mysql查询优化实战:查询用时一分半降到三毫秒
项目中的课程预约记录查询功能,线下门店反馈说进入到页面需要等2分钟
mysql查询优化实战:查询用时一分半降到三毫秒
|
关系型数据库 MySQL 数据库
备库为什么会延迟好几个小时?(下)
为什么要有多线程复制呢?这是因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库是可能一直追不上主库的。从现象上看就是,备库上seconds_behind_master的值越来越大。 在介绍完每个并行复制策略后,我还和你分享了不同策略的优缺点: 如果你是DBA,就需要根据不同的业务场景,选择不同的策略; 如果是你业务开发人员,也希望你能从中获取灵感用到平时的开发工作中。 从这些分析中,你也会发现大事务不仅会影响到主库,也是造成备库复制延迟的主要原因之一。因此,在平时的开发工作中,我建议你尽量减少大事务操作,把大事务拆成小事务。
123 0
备库为什么会延迟好几个小时?(下)
|
数据库管理 索引
备库为什么会延迟好几个小时?(中)
为什么要有多线程复制呢?这是因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库是可能一直追不上主库的。从现象上看就是,备库上seconds_behind_master的值越来越大。 在介绍完每个并行复制策略后,我还和你分享了不同策略的优缺点: 如果你是DBA,就需要根据不同的业务场景,选择不同的策略; 如果是你业务开发人员,也希望你能从中获取灵感用到平时的开发工作中。 从这些分析中,你也会发现大事务不仅会影响到主库,也是造成备库复制延迟的主要原因之一。因此,在平时的开发工作中,我建议你尽量减少大事务操作,把大事务拆成小事务。
95 0
版本分支不宜间隔太久
版本分支不宜间隔太久
70 0
|
SQL 容灾 关系型数据库
一次DTS同步延时过高的排错过程
业务场景: 秒级数据同步要求的容灾场景,通过阿里云数据库同步工具DTS实时将阿里云上RDS的数据实时同步至自建MySQL数据库故障现象: DTS同步延时高达2小时,造成主备数据不一致,无法满足业务的容灾需求排查经过: 首先,联系阿里云DTS后台,后台同学反馈,目标数据库RT(响应时间)过高。
1501 0
一次DTS同步延时过高的排错过程
|
监控 API
为什么系统越简单,宕机时间越少?
当新的需求出现时,我们总是倾向于通过其它方式或在现有系统上集成添加新功能。实际上,我们应考虑是否可以通过改变核心系统来满足新的需求。
“我还要再隔离一周,回来就给您做饭吃”
从武汉运输救援物资归来的中通司机何建文,回来后就按规定接受了隔离观察,在隔离期间,一份写给80岁的母亲家书感动了所有人。
“我还要再隔离一周,回来就给您做饭吃”
|
数据库
即使删了全库,保证半小时恢复
近期一篇《就这样把根目录删了!!!》引发了广泛的讨论,《如何防止根目录被删》汇总了7种防删方案。还有同学评论中反馈“不小心把库删了”,如何快速恢复删掉的数据库,是今天要讨论的话题。
790 0