1.有些部署条件下,备库所在机器的性能要比主库所在的机器性能差
2.备库的压力大。主库提供写能力,备库提供一些读能力。忽略了备库的压力控制,导致备库上的查询耗费了大量的CPU资源,影响了同步速度,造成主备延迟
可以做以下处理:
3.大事务。因为主库上必须等事务执行完才会写入binlog,再传给备库。所以,如果一个主库上的语句执行10分钟,那这个事务很可能会导致从库延迟10分钟
典型的大事务场景:一次性地用delete语句删除太多数据和大表的DDL
双M结构下,从状态1到状态2切换的详细过程如下:

作者:Java编程宇宙 链接:https://zhuanlan.zhihu.com/p/394921571 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个切换流程中是有不可用的时间的。在步骤2之后,主库A和备库B都处于readonly状态,也就是说这时系统处于不可写状态,直到步骤5完成后才能恢复。在这个不可用状态中,比较耗时的是步骤3,可能需要耗费好几秒的时间。也是为什么需要在步骤1先做判断,确保seconds_behind_master的值足够小
系统的不可用时间是由这个数据可靠性优先的策略决定的。
可用性优先策略:如果强行把可靠性优先策略的步骤4、5调整到最开始执行,也就是说不等主备数据同步,直接把连接切到备库B,并且让备库B可以读写,那么系统几乎没有不可用时间。这个切换流程的代价,就是可能出现数据不一致的情况
mysql> CREATE TABLE `t` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(c) values(1),(2),(3);表t定义了一个自增主键id,初始化数据后,主库和备库上都是3行数据。继续在表t上执行两条插入语句的命令,依次是:
insert into t(c) values(4);
insert into t(c) values(5);假设,现在主库上其他的数据表有大量的更新,导致主备延迟达到5秒。在插入一条c=4的语句后,发起了主备切换
下图是可用性优先策略,且binlog_format=mixed时的切换流程和数据结果

最后的结果就是,主库A和备库B上出现了两行不一致的数据
可用性优先策略,设置binlog_format=row

因此row格式在记录binlog的时候,会记录新插入的行的所有字段值,所以最后只会有一行不一致。而且,两边的主备同步的应用线程会报错duplicate key error并停止。也就是说,这种情况下,备库B的(5,4)和主库A的(5,5)这两行数据都不会被对方执行

主备的并行复制能力,要关注的就是上图中黑色的两个箭头。一个代表客户端写入主库,另一个代表备库上sql_thread执行中转日志
在MySQL5.6版本之前,MySQL只支持单线程复制,由此在主库并发高、TPS高时就会出现严重的主备延迟问题
多线程复制机制都是把只有一个线程的sql_thread拆成多个线程,都符合下面这个模型:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。