00:00
好,接下来我们看一下这B协议啊,那这个B协议呢,它是借鉴了这个查算法,刚才不说查算法吗?它是有多个体验者啊,会有这种火属的问题。那么这个cab啊,那就想出来,那我不用多个体验者,我只有一个体验者就行了,那所以哎,他就提出来一个像主K,它底层用的就是这个cab协议。它就一个leader,其他的节点呢,都是只有这个leader允许进行一个提案不就可以了吗?好,那我们来看一看这个ZB协议,它又是怎么工作的呢?那首先呢,这个这P协议它有两种模式啊,一个呢叫消息广播,还有一个崩溃恢复。啊,消息广播呀,就是正常情况下这协议的一个工作原理。那么当然还有一些不正常的,比如说万一这个挂了。那么后续又该怎么办?这个就是崩溃恢复相关的一些事情,那么下面来看一下啊,先看一下正常的处理。
01:01
这是客户端leader和对应的没问题吧,好。那这个客户端呢,向这个leader发起了一个写操作,写操作是不是要处罚这个,嗯。呃,这个。Leader对吧?哎,只有leader有对应的这个写权限哈,好往下走说这那这个leader服务器呢,将客户端的请求转化为一个事物题。然后呢,同时每一个这个事物呢,分配一个全局的ID,就是这个ZXID就事ID呗,哎,形成一个事ID。好,那接着往下走,说这个Le服务器啊。为这个,呃,Leader服务器,为每一个这个服务器分配一个单独的队列,然后将需要广播的这个提案依次放到队列当中,并且呢,根据三方策略进行发送,什么意思这样。比如说这个leader啊,它跟这个for通讯的时候。诶,那腾讯说他会把这个提案放到这个Fi包队列,那Fi包队列的特点就是先进先出呗,那这里面会放很多提案来,那先进来的先处理再处理处理。
02:10
OK吧,哎,每一个佛螺都它们之间都有一个配合对立。这还找?那这个follow接收到这个提案之后,他要干什么事呢?接收到之后,哎,他会向这个leader进行一个反馈。哎,告诉他我是否已经写成功,来一个AC应答。应答,那么这个AK应答一旦这个leader。他收到了集群当中过半的这个应答之后,那么他就可以进行下一步操作,比如说你这是三台对吧,123,只要他收到其中一个,他自己还有一个吗?自己还写了一份,只要这两个收到,他立即就可以跟他进行应答了。懂意思吧,嗯,好啊,那这个他收到了之后,这相当于是我第一次体验。
03:01
你说,哎,你能不能答应我呢?大家都能答应他对吧?哎,都活着,相当于是我都活着。那下面这个leader leader向所有的follow进行广播,那马上我要发的是正式的内容。哎,相当于是这个写的操作对吧?啊写的操作,那同时自身完成事务,他自己肯定要完成,然后follow收到这个之后,然后也得提交对应的事务。你看啊,我向这个follow进行一个commit。刚才是先发一个提案,你们都在不在那接下来。你们都应答了之后,那我再发一个。对吧,嗯,再发相关的内容OK。那之后那ZB协议,呃这个主K边呢,采用ZB这个呃协议为核心,就是一个只有一个服务器提交拍就是这个leader。然后呢,确保所有的服务器最终都能够正确的提交。哎,没有人跟他去抢,说多个体验者对吧,这是他的一个改进啊变种。
04:00
那大家发现这里面这个呃呃,体验的过程当中啊,是不是分成两个阶段的一个阶段呢,是。广播事务阶段。广播这个题你需要应答之后呢,我再进行一个commit提交的题,相当于是两阶段一个提交。那大家现在思考一个问题啊,那正常情况下好像没什么问题,但是呢,如果这个leader。出现了问题。比如说宕机了。那怎么办啊?如果leader宕机了,Leader发起一个事物的提案后就宕机了,就说他刚把这个提案发给这个follow,然后他挂了,还有呢follow呢,没有这个没有收到这个钱。对吧,啊,然后leader呢,发到这个,收到半数的这个A应答之后,没有来得及这个提交这个。一个呢,是这个提案没有发送,另一个呢,是这个commit没有发送,这两种情况下这个挂了。
05:03
是这意思吧,啊好,那下来我们往下看啊。那就是进入到这个杯啊,这个崩溃恢复的这种状态。比如说异常情况下他又是怎么工作的,那首先第一个呢,就是假设leader,哎,提出这个提案之后挂了。你说这个提案呢,刚发过去,但是这边还没有我应答呢,我就挂了。再来。再来一个就是,哎,我要发送这个。对吧,哎。那这个但是呢,就是这个在消息发出之前。就挂了啊,没有发这个的时候我挂了。那这怎么办,对吧,都是这种异常情况。那这个协议啊,在底层啊,满足了两个条件,两个条件呢个确保已经提交的这个。哎,比如说这个leader已经发出去的提案,必须最终被所有的佛罗完成,比如只要你发的这个提案,那么这个佛罗就必须得接收堂。
06:07
啊,是这意思,就说已经产生的提案follow必须执行。那再来。确保丢弃的已经被提出的,但是没有被提交的这个提案。被干掉什么意思啊,要丢弃掉这种提案,你说这面,你说这个leader收到了对应的请求,形成了提案刚形成还没有往出发呢,他就挂了,那这种怎么办,那这种题啊。开始负重,直接挂掉。对吧,哎,不要再往出发了啊好,他发其实也发不出去啊,这是这一协议的一个啊特点啊。好,那下面往下看。那这个leader挂了,接下来就涉及到一个新的leader的一个选举啊,对吧啊,你这个里已经不具备这个领导能力了,那就得由这个follow进行选举,成为新的例子。那这个成为新的leader有什么要求呢?
07:02
必须满足这么几个要求啊,新的leader,第一个新选举出来个leader啊,不能包含未提交的,比如说上一个leader发出来的这个提案,他必须得能够收到。能够收到,而且能够处理对吧?哎,所以说这个leader是这样,然后新的leader必须都是已经提交了提案的这个po接的。已经给过来之后,我已经兵应答了,那这种呢,是有条件成为leader了。第二个。新选举的这个leader啊,节点中还有最大的这个事IDID这个很好理解,你就相当于事物,最大的事ID不就相当于是最后的最新的一个操作吗?对吧,最新的。那你如果你这个photo它没有最新的操作,比如说他的事物ID是八,那他的是九,那你选谁呀。那我肯定选这个九的呀,因为他这个是比较新,你这是旧的操作。哎,只有新的操作它成为leader之后,那我以后再同步消息的时候,是不是就不丢步骤。
08:05
哎,避免丢弃掉一些工作啊,这是这块。一大选举,那下面将来。数据的一个恢复。好,那这个新leader产生之后,一旦它产生了leader,它的事物ID是不是最大的,有可能它是九,它是八。那就涉及到一个后续数据的一个同步问题,那怎么同步呢?完成leader选举之后,在正式开始工作之前,Leader服务器会首先确认是日志当中所有的提案是否已经被集群当中过半的服务器。比如说你上一个leader没有完成的任务,那这个新leader来了之后,得把上一个所有的提案得处理完。哎,处理完OK。下一步说,等到photo所有尚未同步的这个事故提案都从这个leader服务器当中同步过,并且应用到内存数据中以后,Leader才会把follow加入到真正的罗列表。
09:05
什么意思呢?也就是说,哎,这个leader当当了之后,他会等待所有的丰收员,把所有的事物提案都处理完了。之后哎,那我才认为你是一个合法的,或者说我才允许进行后续的相关操作,否则的话,我不会给你放到这个列表,那什么意思啊,那以后我要想处理数据的时候,我会调你这个这个节点吗?我会。啊,不会去用你啊是这个意思,就说必须保证每一个服装节点都是最新的,那我再往下走。这是数据恢复啊,这是ZB协议,ZB协议呢,它是主底层的一个,呃,原理。啊,这个很重要哈。
我来说两句