00:00
好,那么咱们接着来看下一个问题啊,前面的话呢,我们讲到说数据库的调优对吧,那么数据库调优当中呢,我们就提到了一种策略呢,就是说成本比较高的啊,就是使用MYSQ集群,我们使用的这种读写分离对吧,那么读写分离的一个前提呢,就是我们主从的一个复制。那么主从复制啊,它呢,其中就会遇到哎,数据的同步问题,数据呢,一旦同步呢,我们就需要面对的就是一致性的问题。对吧,我们就需要呢,解决这个一致性的问题,好,那这呢,就是我们这一节呢,要给大家去讲的这个点,好,那么这个主从同步的话呢,我们有对应的这个要求啊,比如说读库和写库的这个数据啊,必须得是最终一致的啊,这个呢没什么可商量的,对吧?然后呢,第二个呢,就是写数据的话呢,我们必须呢,是要写到这个写库当中,然后呢,写库呢,通过这个blog呢,再分发到不同的一个读库,或者叫从库当中实现这个数据的一个同步,对吧。嗯,OK,然后这里边儿我们不能说你整多个血库是吧,这个是一个点。然后的话呢,我们这个读数据啊,说必须呢,是要到这个读库当中去读的啊,读写分离嘛,但这个读库的话呢,我们倒不一定呢,就是确定的这几台机器啊,因为呢,它有可能会出现这个角色的转换啊叭,如说主从的一个切换呀,主备的个切换呀,对吧?就是我们原来的这个读库呢,有可能下一刻呢,也会充当这个血库啊,这就这样一个场景,但是你充当血库以后的话呢,那你就是写库了啊,就是你这台机器呢,就不叫读库了啊,名字上做了一个转换是吧?所以说这句话呢,它也不一定错啊,是不一定呢,就是确定了这台机器啊,这个大家注意一下,好,那么我们来看一下啊,咱们现在要做的事儿呢,就是这个读库跟血库的一个分离是吧,如果你要都从这个主库上呢,去读和写的话呢,那我们就不会存在这个一致性的问题了啊这个大家都很清楚了,那我们,呃,既然呢要分离了啊,那怎么办呢?诶我们说呢,这个一致性啊,咱们从弱到强啊,这样呢去做个划分,为什么又从弱到强呢,就跟我们讲隔离性一样啊,诶隔离性的话呢,你越好,这种并发性呢,是不是就越差呀,那我们的一致性越好的话呢,这种并发性呢,是不是就也会越差,效率就会越低啊。
01:58
对吧,诶,任何事物都是有利有弊的啊,首先呢,我们来看第一种方案啊,叫异步的一个复制,那么这种方案呢,其实也就是我们理解的一种默认的场景。
02:07
啊,一种默认的场景啊,就是我们这个主库的话呢,诶相当于他这块呢,去执行具体这个事务,诶执行完以后呢,他就提交了,他一提交他自己这块呢,完事了,然后紧跟着他就告诉客户端说我这提交完了啊也给你提示说我这个呃操作已经结束了,呃你你下边要干什么啊,用户呢,可能就要查询了是吧?诶那么这个你注意我们这时候呢,你这块呢,接着返回给客户端,这是一个线程做的事儿,在我们提交这块的时候呢,我们是不是呃就要把这个呃相应的这个数据呢,就同步到我们这个重库上了啊我们这个slave这个上边啊,然后这个slave这块呢,是不是有他自己的线程,它去一顿执行,保证我们这个跟主库上这个数据呢是一致的,它都得是执行一遍是吧,诶这呢,就我们说的这个执行完的时候呢,它这个时间节点呢叫T3,你这个时间节呢叫T1啊,那么在这个区间之内的话呢,用户呢,如果要是去读的话呢,就不一致的,诶所以这种异步的操作啊,这不是他跑着这个也跑着叫异步嘛,然后呢,中间这个差值呢,哎,就出现了这种一致性的问题,所以这个呢是比较差的。
03:05
对吧,这个是比较差的啊,然后呢,这里边呢,还举了一个场景是什么呢?就是我们这块呢,提交了啊,这就另外一个问题啊,这个提交了以后呢,我们这块呢,是不是重复这块去呃,去执行这个相系列的一系列这个操作,然后呢,这时候我们这个主库呢,突然挂掉了,他挂掉以后呢,我们这时候呢,其中的一个啊,咱就比如叫备库吧哈,这个备库呢,立马呢就升级了,它就变成一个master变成血库了,但是呢,我们刚才这个事物呢,没有写成功。啊,没有写成功啊,那导致呢,我们现在,呃,原来的事物提交了,然后现在我们读的时候呢,是读的我们从库里边这个数据,哎,又不一致了是吧?哎,这也是一个问题啊。好,嗯,这个呢说到这儿,然后呢,这里边的话呢,可能有同学呢,会这个这个发这个弹幕啊,会说说老师,嗯,你这里边是不是画错了。啊,为什么呢?是不是应该把这俩交换一下啊,我们commit应该是在这个blog的前面啊,说以前不是提到过,说这个我们先提交这个事物之后呢,我们再去写入的这个blog嘛。
04:00
诶是这意思吧,诶这个注意哈,我这块呢,其实也没有写错啊,也没有写错啊,为什么这么讲呢?诶大家还记不记得我们前面讲这个blog的时候呢,还提到那个redolog是吧?诶然后呢,我们说提到他俩的时候呢,要保证这一致性,咱们提到了是不是两阶段提交啊,然后呢,就是我们一个事物呢过来了是吧,从上往下去走,先有个呃,Re度的一个叫prepare的一个阶段,然后的话呢,我们再去呃,Prepare一个阶段执行,执行完以后的话呢,我们再去执行这个诶blog的一个写入的这样一个阶段,然后再有一个relog的一个叫commit一个阶段是吧,那如果说我们去写入到这个blog以后。写入到这冰榔以后,哎,我们这个呢,执行这个commit阶段相于就是提交这个事物,那如果说你要是没有写入到这个B榔里边呢,我们这个事物呢,还得相当于做个回滚延外之呢,你这个锐度呢,也不要去做啊read度呢,不就是保证我们持久性,就相当于这个事到底做没做是吧?哎这样的一个过程吧,哎你要re度里边没有去支持的话呢,哎我们说呢叫是不是right head。呃,这个这个logging啊,咱们前面呃呃就是快logging,就我们是不是叫日志写写入优先这样的一个原则是吧,如果你日志里边都没有写入的话呢,我们呃整个呢,也不会去写到那个磁盘上,相当些事物就白做了哈,呃,你要没有写入这个blog的话呢,我们这个锐度呢,呃相当于都得是做这个回滚,从这个角度上来讲的话呢,我们得先确保你写入到re道啊这个blog了,然后呢我们再去提交。
05:16
啊,所以说这没问题啊。好,这呢是我们说最弱的一种这个一致性的场景啊,比较好理解,然后呢,接下来就会提到一个叫方法二叫半同步复制,诶同学说老师怎么不叫同步复制呢,同步复制那还说啥呢,同步了,那那肯定就串行化了,那肯定是能够保证它是一个一致的。啊,但是你并发性也太差了,对吧,那跟我们读一个这个这个master有啥区别呢?哎,所以我们叫什么半同步的一个复制是吧?呃,那怎么叫半同步的一个复制呢?嗯,大家你看哈,咱们前边这个时候,或者我们直接就上这个图了啊咱们前边的时候呢,讲这个异步的时候呢,是不是直接呢,你这个呢,给到我们这个master,诶直接呢写b logg,然后呢,这个直接呢就反馈客户端了,然后呢,你下边呢这块呢,你去写入的事儿,写入到重复的事儿,这我们称为呢叫做异步的过程嘛。
06:00
哎,说这个一致性比较差是吧?呃,那现在怎么办呢?这叫半同步哈。我们呢,可能这个存库啊比较多点点点,哎存库比较多,然后你这个呃用户呢,提交啊这样的一个事物之后呢,我们写入这个blog,这个时候呢,先注意先不要着急返回你你怎么着呢,你等一等啊,我们呢把这个呢,通过网络的方式呢,传输给我们从库啊从库这块呢,是不是一顿执行啊,哎我们这块呢,存库呢还比较多啊,假设有N个啊,我们呢先保证它能有一个存库呢,是写入这样的呃事件了啊相当于事物呢也提交了,相当于我们这个T3呢,就这个时间点呢就发生了。啊,他可能有很多的这个重库都要去做,但是我这块儿呢,我只选那个,呃,执行时间最快的那个,相当我们只要保证有一个重库呢,事务提交了,然后呢,我就发送给你一个啊这个信息说成功了是吧,然后这时候呢,我们再去告诉这个客户端说呢,诶我这个当前事务就结束了,你后边你愿意干啥再来。啊,这个时候的话呢,是不是我们就一定程度上能够保证这个数据的一致性了。
07:02
啊,当然有同学会说朱老师你这个一致性保证呢,是不是只保证了说你写入成功这个这个的这些东还没写入成功的啊,事实上呢,也是这么回事儿,所以呢,我们说呢,比上一个呢,是不是要好一些是吧,那要想更好那怎么办呀,那你更好的话呢,最好的情况下呢,是不是所有的存库呢,是不是都写完呀?诶那这里边呢,我们可以怎么办呀?哎说5.5的时候呢,咱们说只能至少能够保证一个啊,至少能保证一个呢,是写入成功的啊在这写的哈,然后5.7的时候呢,我们就做了一个优化啊,我们有一个参数啊,这个参数你看巨长是吧。说这个false level count啊,Wait for count啊,这个参数的这个值呢,默认是一,如果呢,我们写的不是一,咱们写成啊,你要有N个从库,我就写成是N这个值了啊,那就相当于是你所有的从库呢,都做了一个事物,提交之后呢,再返回给我们这个啊通过主库呢返回客户端说呢来提交成功。啊,那这时候呢,肯定这个呃主从的这个一个呃复制的效果是那同呃一致性的问题呢,是最好的是吧,但是这个呢,相应的我们这个性能呢,是不是就会受到影响呀。
08:02
没问题是吧,啊,这个注意一下啊。啊嗯,这种呢,是我们说的一种方式,嗯,但是就说我们说这种方式呢,因为咱们也不可能说把这个N呢,把这个参数呢,就设置成真正我们具备这个重复的这个数量,你肯定是要低于这个数量的哈,但是呢,只要你低的话呢,你就会存在这种不一致性的这种情况啊,那如果说我们对于数据一致性要求比较高的这种场景啊,金融领域啊等等,那我们就觉得差点意思是吧,那有没有更好的方案呢?诶这里就提到一个叫组复制啊这样的一个哎算法啊,这个组复制的这个技术呢,简称叫MG2。啊,它呢是呃,推出的一种新的这个数据的一种复制技术啊,基于我们这个叫啊PI这样的一个协议,这个派的话呢,这个协议里边呢,其实涉及到叫OS的一个算法啊,这个算法话呢,还是非常牛的啊,这个作者呢,在九零年就提出来了,然后一三年呢,还获得这个图灵奖了,而且呢,这个派这个算法的话呢,在分布式啊一致性算法当中啊,作为分布式一致性算法呢,被广泛应用啊,主Q文里边就用到它了啊。
09:02
那么这个里边是怎么工作的呢?哎,简单来说一下啊,就对于我们这个纯毒的这些事物的话呢,就不需要啊这个组嘛啊,就不需要这个组内的一个统一了。直接呢commit就可以了,如果呢,你要是这种读写的这种事物呢,我们有一个组的概念,在这个组里边呢,我们至少有过半的啊,这个事物呢,就提交了。啊哎,过半这个事物呢,他认为呢是可以提交的,那我们就提交啊,不像原来的话呢,我们是一个说了算的是吧?诶那你一个说了算呢,你觉得差点意思,你说让这个重库呢,都哎都都同步了以后呢,再说了算,这个呢,并发性又差了。啊,这个效率呢,又比较低了,现在的话呢,我们对于读写事物呢,诶这里边儿呢,我们分摊到不同的这种读写的事物当中,然后呢,通过相应的这种一致性的协议,保证他们的一个原子的消息和全局的一个有序消息,啊就是保证这个组内的这个数据呢,首先是一致的,然后的话呢,我们只要呢,达到一半以上的人去同意提交,我们就提交。啊,这是一个泛泛的这样一个思路啊,大家理解一下啊,如果有兴趣的话呢,你再去深入的去研究一下这个组复制的一个算法是怎么样实施的啊,在5.7以后呢,出现的啊就可以了。
10:05
行,那么关于我们说的这个主从延迟和这个一致性的问题啊,咱们就给大家呢,说到这儿啊,然后呢,这个讲解完以后呢,咱们这一章呢,其实也就接近这个尾声了。啊,进行这个尾声了啊呃,那么我们讲到了这个主从的复制啊,基于这个主动复制的话呢,我们接着可以再去做的呢,就是这个叫呃读写的一个分离是吧,然后我们可以使用这种集群的方式啊,配置多台这种从机,然后呢,也有这种相应的这个备机啊等等,我们可以呢,使用这种中间键的方式呢去实现,那你也可以呢,自己来实现啊,自己实现的好处呢,就是比较自主了,根据你自己业务的需求呢去做是吧,像这种大公司的话呢,大型互联网公司都可以考虑呢,自己去做。啊,当然了,这个自己做的话呢,它的好处是什么呢?就是减少这个中间件层啊,然后减少这个性能的损耗啊,你自己做的话呢,这个对你的业务呢,就额度比较高一点,性能呢会好一些啊,但是呢,你这个相应呢,就需要花入花这个成本了,要么呢,你就是采用这种中间件啊,中间件的话呢,好处就是功能比较强大,使用比较简单啊,你包括呢,像咱们国内的一些这个厂商呢,也开发了相应的一些数据库中间件啊,开源出来呢去使用。
11:10
那这块呢,关于这个这个这个中间键的话呢,就不在这儿去讲了啊,咱们呢前边呢也跟大家说到了啊,诶你要想去学习的话呢,是不是可以在这个B站上呢,去搜咱们讲的这个叫麦cat这样的一套视频。啊是吧,大家可以呢去进行一个学习。啊OK啊行,那这个呢,我就哎不去说这个事儿了,呃,然后的话呢,大家再注意一下,就是咱们这一章的内容啊,其实啊,还有其他的点可以去拓展,只不过呢,就是咱们整个这套视频的这个内容的话呢,也不可能展的面面俱到啊,把大家那十年的这个麦斯的功略呢,全都给它怼到这里边儿,那也不现实啊,诶所以这里边呢,我们后续有哪些问题呢?哎,我们没有讲到的,咱们先抛出来啊。我们呢,去解决了一个叫数据一致性的问题啊,这个呢是没问题了,还有一个点呢,我们没有去谈呢,什么呀,就是我们这个主机跟这个背机是吧,诶它呢实现这个数据库切换啊,这个呢,在实际当中呢,是需要我们这个DV呢来也需要呢去完成的这样的一些情况啊,就是我们现在呢,呃,假设呢是一个叫易主啊,这个咱叫易从也行啊,这个从的话呢,实际上它主机要挂了,他就有能力的顶上来,相在我们叫易主一倍吧。
12:14
一开始的时候呢,我们只有呢一主一倍是吧,然后呢,这个客户端的话呢,是从我们这个主机上呢去这个读写数据的啊,然后呢,读的话呢,是从这块呢去读的,对吧?那么我们这块呢,是不是可以考虑会有一个这样的一个切换的一个行为啊,那切换的话呢,主要呢,就把这个客户端这个请求呢,就发送给我们这个备机啊,他来充当我们这个写库就可以了,然后他来充当这个读是吧?啊那你要是这种啊一主一被,还有这多从的这种场景呢,是不是还涉及到这个从音呢,也得做相应的一些切换啊,是不是就得从我们这个嗯,新的这个主机上呢去读数据了。啊,这呢,就需要你中间啊,要考虑这样的一些问题啊好,那么还有什么点呢,就是说我们这个切换行为啊,在实际的生产环境当中啊,我们要分成呢,叫主动切换和这个被动切换两种场景。
13:01
这个主动切换的话呢,诶,你就相当于是我们这个主动运维的一个情况,比如说呢,软件的升级呀,或者我们主库的这个机器啊,本身我们就要下线了是吧,我们就要主动的去做这样的一些切换啊,也有这种被动切换的场景啊,你比如说我们这个主库呢,这个机器的这个掉线了是吧,或者我们这个主库呢,出现这个故障了,这时候你要被动的去做这样的一个切换是吧?那么在这么多场景当中呢,我们得有能力呢去判断什么呀,就是我们这个主库呢,刚才说了,说这个出问题了啊,你得能够去判断他到底有没有出问题。啊,到底有没有出问题,然后如何呢去衡量好,那么有这样的一套这个标准啊和一套这个实施的方案啊,那判断它出问题以后呢,我们就做这样的切换,那切换的时候呢,我们说也会出现这种数据不一致性的问题啊,比如我们现在写的数据呢,已经是到这儿了啊突然切换完的话呢,我们就就读到这儿了,中间在这块呢,传输的传输到一半,那这时候怎么办是吧,然后你转到这以后呢,紧接着啊这块呢,就停下来了,然后呢,呃,数据呢,再往这里边儿呢去写了。
14:00
呃,中间呢,传输的时候呢,怎么去处理中间这些没有写完的数据,以及呢,又新来这个数据啊,以及呢,又需要同步到他这的问题啊,这呢都是事儿是吧?诶那么这些问题的话呢,是DV呢必须要考虑的点,这些点的话呢,涉及到的内容呢也不少,咱们就不在这套视频当中去讲解了。
我来说两句