Mysql主从复制的延迟问题原理分析

首先上原理图(ps:图片从其他地方借鉴):
在这里插入图片描述
搭建主从的好处就不多说了。
从问题出发:
1.mysql主从/集群搭建如何保持数据的一致性?
答:市面上所有的集群或主从都是通过网络通信来沟通或保持数据一致性的。(redis,MQ等),包括咱们的分布式系统,springCloud各组件之间也是通过网络通信来支持的。
2.mysql主从是如何通信的?备份传输的是什么内容呢?
答:首先通信无外乎就是基于socket。通信传输可以借鉴redis的持久化策略,RDB,AOF,快照或者命令。mysql用的是命令行/结果的方式来传输。
3.整个流程是怎么样的呢?
答:原理图解释的很清楚了,Master在执行写入/修改操作时,会把sql记录在binlog文件中,然后通过IO thread 传输给Slave,Slave读取到后写入到Relaylog文件中,最后SQL thread Read并执行SQL。
4.既然主从通过通信就能够解决,那延迟问题是什么呢?怎么发生的?
图解:在这里插入图片描述

答:首先先搞懂顺序写和随机写的概念。然后拆分步骤,Master写binlog很明显是顺序写(顺序写效率大于随机写),因为写入在同一个磁盘块,一直追加就可以了。IO thread 也是顺序读,写入Relaylog步骤也是顺序写。
但在SQL thread中就会出现问题了,如果是单线程操作,会产生如下问题:
(1)主库是多线程的,Relaylog假如一秒写入10条,但SQL thread一秒只能写入一条,那么Relaylog就会产生堆积,主库和从库之间备份的数据会不一致,那么从库如果承担了部分读的业务。就有可能会产生读到的是修改前的数据。
(2)例如:
update table set name=zhangsan where id =1;
update table set name=zhangsan where id =200;
SQL thread 从Relaylog中读到这两条记录也是顺序读,先读1再读2,但在SQL thread在执行SQL更新的写入操作中,并不能保证id=1和id=200的数据存在同一个磁盘块中,如果不是在同一个磁盘块,那么就存在需要重新寻址,多此磁盘IO的过程了。那么就算外界传过来也是单线程操作,SQL thread执行过程也可能会比IO thread慢。也会产生延迟问题。
5.既然单线程解决不了问题,那么SQL thread如果使用多线程呢(MTS)?
多线程可以解决延迟问题,但是又会出现其他的新问题。单线程是可以保证数据顺序执行的。但多线程并不能保证顺序执行。例如:
update table set name=zhangsan where id =1;
update table set name=zhangsan where id =200;
如果第二条在多线程环境下先执行了,第一条后执行。数据就出问题了。
5.还有在多线程环境下咱们的事务该如何去控制呢?如何从根本上解决主从复制的延迟问题呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值