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

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

按行分发

要解决热点表并行复制问题,就需要个按行并行复制的方案。

  • 思路
    若俩事务没有更新同一行,它们在备库上可以并行执行。所以该模式要求binlog是row格式。

这时判断一个事务T和worker是否冲突,用的就规则就不是“修改同一个表”,而是“修改同一行”。


按行复制和按表复制的数据结构差不多,都是为每个worker,分配一个hash。

只是按行分发的key是库名+表名+唯一键的值。

但该 唯一键 只有主键id还不够,考虑如下场景,t1除了主键,还有唯一索引a:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a` (`a`)
) ENGINE=InnoDB;
insert into t1 values(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5);

要在主库执行俩事务:

session_1 session_2
update t1 set a=6 where id=1;


update t1 set a=1 where id=2;

这俩事务要更新的行的主键不同,但若它们被分到不同worker,可能session2先执行。这时id=1的行的a的值还是1,就会报唯一键冲突。

所以基于行策略,事务hash表中还需考虑唯一键,即key应该是 库名+表名+索引a的名字+a的值

在t1执行

update t1 
set a=1 
where id=2

在binlog里记录整行的数据修改前各字段值和修改后各字段值。因此,coordinator在解析该语句的binlog时,该事务的hash表就有三项:


key=hash_func(db1+t1+“PRIMARY”+2), value=2

value=2是因为修改前后的行id值不变,出现了两次

key=hash_func(db1+t1+“a”+2), value=1

会影响到这个表a=2的行

key=hash_func(db1+t1+“a”+1), value=1

会影响到这个表a=1的行

相比按表并行分发策略,按行并行策略在决定线程分发时,要消耗更多计算。

这俩方案都有一些约束条件:


要能够从binlog里面解析出表名、主键值和唯一索引值。即主库binlog必须是row

表必须有主键

不能有外键

表若有外键,级联更新的行不会记录在binlog,冲突检测就不准确

还好这些本就是DB生产使用规范。


按行分发策略的并行度更高。不过,若是大事务,按行分发策略有如下问题:


耗费内存

比如一个语句要删除100万行数据,这时候hash表就要记录100万个项

耗费CPU

解析binlog,然后计算hash值,对于大事务,该成本很高


所以,按行分发策略要设置一个阈值,单个事务若超过设置的行数阈值(比如,如果单个事务更新的行数超过10w行),就暂时退化为单线程模式,退化过程的逻辑大概是这样的:

coordinator暂时先hold住这个事务

等待所有worker都执行完成,变成空队列

coordinator直接执行这个事务

恢复并行模式


目录
相关文章
|
消息中间件 SQL API
Flink线上问题汇总篇(2)-时区不一致系统时间少8小时导致数据丢失问题
flink按月度汇总数据,月初时数据部分丢失问题
1701 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL主从:延时从库恢复全解
MySQL主从:延时从库恢复全解
|
6月前
|
前端开发 Shell 开发工具
一个瞬间让你的代码量暴增的脚本
一个瞬间让你的代码量暴增的脚本
|
SQL 弹性计算 运维
数据库故障致美国超一万航班取消或延迟
在2023年新年的第二周,美国东部时间1月11日上午,6点29分,美国航空监管机构(FAA)发布了一条仅40字的通告,随后不久,很快就宣布停飞全美所有国内航班。通告内容是,FAA正在对NOTAM(Notice to Air Missions)系统进行验证和恢复,在第一条通知之后的50分钟,FAA就宣布停飞所有国内航班。
373 0
数据库故障致美国超一万航班取消或延迟
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
120 0
|
消息中间件 关系型数据库 MySQL
数据量激增,导致MySQL主从同步延迟
数据量激增,导致MySQL主从同步延迟
266 0
数据量激增,导致MySQL主从同步延迟
|
存储 关系型数据库 MySQL
备库为什么会延迟好几个小时?(上)
为什么要有多线程复制呢?这是因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库是可能一直追不上主库的。从现象上看就是,备库上seconds_behind_master的值越来越大。 在介绍完每个并行复制策略后,我还和你分享了不同策略的优缺点: 如果你是DBA,就需要根据不同的业务场景,选择不同的策略; 如果是你业务开发人员,也希望你能从中获取灵感用到平时的开发工作中。 从这些分析中,你也会发现大事务不仅会影响到主库,也是造成备库复制延迟的主要原因之一。因此,在平时的开发工作中,我建议你尽量减少大事务操作,把大事务拆成小事务。
147 0
备库为什么会延迟好几个小时?(上)
|
关系型数据库 MySQL 数据库
备库为什么会延迟好几个小时?(下)
为什么要有多线程复制呢?这是因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库是可能一直追不上主库的。从现象上看就是,备库上seconds_behind_master的值越来越大。 在介绍完每个并行复制策略后,我还和你分享了不同策略的优缺点: 如果你是DBA,就需要根据不同的业务场景,选择不同的策略; 如果是你业务开发人员,也希望你能从中获取灵感用到平时的开发工作中。 从这些分析中,你也会发现大事务不仅会影响到主库,也是造成备库复制延迟的主要原因之一。因此,在平时的开发工作中,我建议你尽量减少大事务操作,把大事务拆成小事务。
151 0
备库为什么会延迟好几个小时?(下)
版本分支不宜间隔太久
版本分支不宜间隔太久
90 0
|
SQL 容灾 关系型数据库
一次DTS同步延时过高的排错过程
业务场景: 秒级数据同步要求的容灾场景,通过阿里云数据库同步工具DTS实时将阿里云上RDS的数据实时同步至自建MySQL数据库故障现象: DTS同步延时高达2小时,造成主备数据不一致,无法满足业务的容灾需求排查经过: 首先,联系阿里云DTS后台,后台同学反馈,目标数据库RT(响应时间)过高。
1596 0
一次DTS同步延时过高的排错过程