MySQL实战45讲Day25----备库延迟的原因

一、备库并行复制能力:

1、主备流程图:


??对于主备的并行复制能力,要关注的是图中黑色的两个箭头。一个箭头代表了客户端写入主库,另一箭头代表的是备库上sql_thread执行中转日志(relay log)。如果用箭头的粗细来代表并行度的话,那么第一个箭头要明显粗于第二个箭头。
??在主库上,影响并发度的原因是各种锁。由于InnoDB引擎支持行锁,除了所有并发事务都在更新同一行(热点行)这种极端场景外,它对业务并发度的支持是很友好的。
??日志在备库上的执行,就是图中备库上sql_thread更新数据(DATA)的逻辑。如果是用单线程的话,就会导致备库应用日志不够快,造成主备延迟。在官方的5.6版本之前,MySQL只支持单线程复制,由此在主库并发高、TPS高时就会出现严重的主备延迟问题。

2、多线程复制演进过程:

??coordinator就是原来的sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了worker线程。而work线程的个数,就是由参数slave_parallel_workers决定的。一般把这个值设置为8~16之间最好(32核物理机的情况),毕竟备库还有可能要提供读查询,不能把CPU都吃光了。

<1>、事务能不能按照轮询的方式分发给各个worker,也就是第一个事务分给worker_1,第二个事务发给worker_2呢?

??不行。因为事务被分发给worker以后,不同的worker就独立执行了。但是,由于CPU的调度策略,很可能第二个事务最终比第一个事务先执行。而如果这时候刚好这两个事务更新的是同一行,也就意味着,同一行上的两个事务,在主库和备库上的执行顺序相反,会导致主备不一致的问题。

<2>、同一个事务的多个更新语句,能不能分给不同的worker来执行呢?

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

<3>、coordinator在分发的时候,需要满足以下这两个基本要求:

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

二、各个版本的并行复制策略:

1、MySQL 5.5版本的并行复制策略:

?<1>、按表分发策略:

??(1)、基本思路:

??如果两个事务更新不同的表,它们就可以并行。因为数据是存储在表里的,所以按表分发,可以保证两个worker不会更新同一行。如果有跨表的事务,需要把两张表放在一起考虑的。

??(2)、
按表并行复制程模型

?①、每个worker线程对应一个hash表,用于保存当前正在这个worker的“执行队列”里的事务所涉及的表。hash表的key是“库名.表名”,value是一个数字,表示队列中有多少个事务修改这个表。
?②、在有事务分配给worker时,事务里面涉及的表会被加到对应的hash表中。worker执行完成后,这个表会被从hash表中去掉。
?③、hash_table_1表示,现在worker_1的“待执行事务队列”里,有4个事务涉及到db1.t1表,有1个事务涉及到db2.t2表;hash_table_2表示,现在worker_2中有一个事务会更新到表t3的数据。

??(3)、假设在图中的情况下,coordinator从中转日志中读入一个新事务T,这个事务修改的行涉及到表t1和t3。分配规则为:

?①、由于事务T中涉及修改表t1,而worker_1队列中有事务在修改表t1,事务T和队列中的某个事务要修改同一个表的数据,这种情况事务T和worker_1是冲突的。
?②、按照这个逻辑,顺序判断事务T和每个worker队列的冲突关系,会发现事务T跟worker_2也冲突。
?③、事务T跟多于一个worker冲突,coordinator线程就进入等待。
?④、每个worker继续执行,同时修改hash_table。假设hash_table_2里面涉及到修改表t3的事务先执行完成,就会从hash_table_2中把db1.t3这一项去掉。
?⑤、这样coordinator会发现跟事务T冲突的worker只有worker_1了,因此就把它分配给worker_1。
?⑥、coordinator继续读下一个中转日志,继续分配事务。

??(4)、每个事务在分发的时候,跟所有worker的冲突关系情况:

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

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

?<2>、按行分发策略:

??(1)、基本思路:

??如果两个事务没有更新相同的行,它们在备库上可以并行执行。为每个worker,分配一个hash表。显然,这个模式要求binlog格式必须是row。

??(2)、按行分发的策略有两个问题:

?①、耗费内存。
?②、耗费CPU。

??相比于按表并行分发策略,按行并行策略在决定线程分发的时候,需要消耗更多的计算资源。

?<3>、分发策略的约束条件:

?①、要能够从binlog里面解析出表名、主键值和唯一索引的值。也就是说,主库的binlog格式必须是row;
?②、表必须有主键;
?③、不能有外键。表上如果有外键,级联更新的行不会记录在binlog中,这样冲突检测就不准确。
?④、事务hash表中唯一键key应该是“库名+表名+索引a的名字+a的值”。

2、MySQL 5.6版本的并行复制策略:

?<1>、基本思路:

??支持并行复制,只是支持的粒度是按库并行。用于决定分发策略的hash表里,key就是数据库名。这个策略的并行效果,取决于压力模型。如果在主库上有多个DB,并且各个DB的压力均衡,使用这个策略的效果会很好。

?<2>、相比于按表和按行分发,这个策略有两个优势:

?①、构造hash值的时候很快,只需要库名;而且一个实例上DB数也不会很多,不会出现需要构造100万个项这种情况。
?②、不要求binlog的格式。因为statement格式的binlog也可以很容易拿到库名。

??如果主库上的表都放在同一个DB里面,这个策略就没有效果了;或者如果不同DB的热点不同,比如一个是业务逻辑库,一个是系统配置库,那也起不到并行的效果。

3、MariaDB的并行复制策略:

?<1>、MariaDB的并行复制策略利用的特性:

?①、能够在同一组里提交的事务,一定不会修改同一行;
?②、主库上可以并行执行的事务,备库上也一定是可以并行执行的。

?<2>、MariaDB的实现方法:

?①、在一组里面一起提交的事务,有一个相同的commit_id,下一组就是commit_id+1;
?②、commit_id直接写到binlog里面;
?③、传到备库应用的时候,相同commit_id的事务分发到多个worker执行;
?④、这一组全部执行完成后,coordinator再去取下一批。

?<3>、MariaDB的缺点:

?①、在备库上执行的时候,要等第一组事务完全执行完成后,第二组事务才能开始执行,这样系统的吞吐量就不够。
?②、这个方案很容易被大事务拖后腿。假设第一组事务中trx2是一个超大事务,那么在备库应用的时候,trx1和trx3执行完成后,就只能等trx2完全执行完成,下一组才能开始执行。这段时间,只有一个worker线程在工作,是对资源的浪费。

4、MySQL 5.7的并行复制策略:

?<1>、由参数slave-parallel-type来控制并行复制策略:

?①、配置为DATABASE,表示使用MySQL 5.6版本的按库并行策略;
?②、配置为 LOGICAL_CLOCK,表示的就是类似MariaDB的策略。不过,MySQL 5.7这个策略,针对并行度做了优化。

?<2>、MySQL 5.7并行复制策略的思想:

?①、同时处于prepare状态的事务,在备库执行时是可以并行的;
?②、处于prepare状态的事务,与处于commit状态的事务之间,在备库执行时也是可以并行的。

5、MySQL 5.7.22的并行复制策略:

?<1>、MySQL 5.7.22版本里,MySQL增加了一个新的并行复制策略,基于WRITESET的并行复制。

?<2>、参数binlog-transaction-dependency-tracking,用来控制是否启用这个新策略,参数的可选值有:

?①、COMMIT_ORDER,表示的就是前面介绍的,根据同时进入prepare和commit来判断是否可以并行的策略。
?②、WRITESET,表示的是对于事务涉及更新的每一行,计算出这一行的hash值,组成集合writeset。如果两个事务没有操作相同的行,也就是说它们的writeset没有交集,就可以并行。这个hash值是通过“库名+表名+索引名+值”计算出来的。如果一个表上除了有主键索引外,还有其他唯一索引,那么对于每个唯一索引,insert语句对应的writeset就要多增加一个hash值。
?③、WRITESET_SESSION,是在WRITESET的基础上多了一个约束,即在主库上同一个线程先后执行的两个事务,在备库执行的时候,要保证相同的先后顺序。

?对于“表上没主键”和“外键约束”的场景,WRITESET策略是没法并行的,会暂时退化为单线程模型。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,727评论 0 30
  • 一、binlog 的基础知识 1,binlog 的概念 Server 层的日志系统(归档日志),binlog 中跟...
    勤奋的码农阅读 489评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,269评论 0 9
  • 2019年7月20日 越是善于倾听他人意见的人,与他人关系就越融洽。因为倾听本身就是褒奖对方谈话的一种方式,你能耐...
    红祺阅读 217评论 0 1
  • 材料:圆珠笔 圆珠笔速写女人头像。根据照片进行的写生创作。 上图: 文:朴领
    朴领阅读 641评论 7 9