00:00
好,接下来呢,我们讲一下leader和follower状态源码的一个同步哈,呃,为什么讲它呢?我们稍微回顾一下,上节课我们是把这个对应的选举源码已经看完了,对吧?啊,选举出对应的leader和follow,那你有了leader和follow,那接下来。那么我最开始节点的状态是不是looking呢?还记得吗?是,那我就要将这个looking状态更改为follower或者是leader。是这样一个处理吧,好,那我们来看一下啊,哎,如果是的话呢,我们要跟要调用的是点一会开源码就能看到,如果是follow状态的话,它会调用follow.follow leader啊对应的方法。啊,那这里面要注意一下,说follow,这里面注意啥呢?说follower啊,要让这个leader知道自己的状态。什么意思呢?比如说新选举出来的leader。和之间,他们要进行相互通讯的。我这个我要告诉前我的分都是状。
01:08
比如说啊,我这个po是一,这sid呢是五啊,Sid呢是二啊,那我这边的这个epo呢是1z sid呢是。可以吧,哎,我这ID呢,ID53。假如说啊这样,嗯这样吧,我这个是六六月好一点。那我这个是六的话是ID是六,那现在我说佛罗里告诉他,我当前是152。告诉他之后,那我这个力由于它是六,我是不是得把我这个最新的状态数同步给这个弗罗。对吧?哎,我让这个leader和follow的数据是得达到一致,这就是我们选举完之后要进行状态同步。要做的一些事情。让尽可能的所有节点里面的数据是一致的。OK吧,这是我们的原则。那再往下说,当leader得知状态之后,就确定了需要以何种方式进行对数据的一个同步。
02:07
啊,这三种方式啊,一会儿再解释这三种方式,那下面然后执行同步源码,当leader接收到超过半数的应答之后,那进入到正常状态。比如说哎,这leader呢,已经获取到半数的对他的一个认可了,超过半数那就可以开始正常工作。对吧,那刚才提到的这三种同步策略是什么意思呢?那比如说这个Di,那相当于leader和follow的状态是一致的。那我不就没有必要再更新数据了,好,那下面这个串说follow的j sid啊,比这个leader的大,比如说我这边呢是六,那它呢是五。那么我就需要将follow这里面的一个事物回滚。我退回到五,因为一切呢以leader看齐,Leader的事物是啥样的,那就按照它来走,那还有一种状态,说leader的这个ID啊,比这个分大啊,假如说它是七,那我这边是六的话,那我是不是把这边得更新为对应的T呀?
03:07
哎,是这个意思啊,好说,如果并没有任何数据,直接使用在方式进行同步,那直接把数据呢,全部序列化到这个follow follow里面,如果没有数据的话,那直接把leader所有的数据拷贝给。其实这块同步的原则就是尽可能的让leader和follow的数据达到一致。就OK了。那下面来看一下它底层是怎么同步的呢?稍微了解一下原理啊。那个启动多个,你有几个follow,我就会启动几个Le handle。OK吧,那假如说这里面我有三个副好。那现在我要做的事情就是我这是一个leader,这是三个。我是要把我leader的状态同步分发给丁的follow,那好,那我们就以这个follow为例,哎,看它怎么同步的。
04:07
那首先要做的事情,记住首先要做的是你这个follow啊,得先跟这个leader进行通讯,先把你自己的serve ID哎,你ID和对应的SID发送给对应的这个老大。对吧,哎,这样后续我才知道我如何来进行同步啊,OK,好发过去之后。那么这个leader啊,他会给这个发一个新的。为啥要发这个ID呢?那大家还记得这个ID的含义吗?它是不是这个朝代的编号啊,那有新的leader之后,是不是就得有对应的新的。对吧,哎,是这个意思啊,所以说要把这个发给对应的leader,然后发给这个follow以后呢,他在发送数据的时候,这个都得按照我这个leader进行一个编写啊。那这边一旦收到对应的这个新的之后,你是不是得给这个leader应拿说老大我已经收到了你对应的发给的。
05:08
这一发,哎,发过去看看哪。发过去之后,那下面这个leader是不是要开始对这个进行同步了,那同步的话就三种方式。哎,如果说他俩完全相同,那就D。那还有那下面呢,这是有一个呃,串串什么意思呢?是follow比这个leader快啊,那你这边呢是五,这边是六,那他要自己退回一个版本。哎,是这意思啊,那还有一种方式呢,就是这个啊代相当于把leader所有的数据直接全部同步过来。啊,先过来啊,好吧。往下找啊,这是。待同步的体验数据,先提案,然后再确认。之后呢,这个leader就已经确认好了啊,把新的leader给到对方,说你认不认可,那对方呢,哎要对他进行一个确认,说哎,我认你这个病的老大,那认完之后,哎,更新相关的一个。
06:02
操作啊,等待这个leader收到过半数的这个请求之后,那么他就成为真正的老大。啊,就这意思啊,相当于是选举完新的老大之后,那老大和佛之间要进行一个数据同步。好,那下面我们来看一下啊,它在底层到底怎么进行同步的。通过方法的形式。那这个代码呢,不太好看啊,它有这个leader和follow,而且他俩呢频繁的进行数据交互。啊,那我们来先来看一下人脸啊,往下走,那在这个leader端他要做什么事情呢?他要做这么多事情。哎,首先创建一个handler这个,然后在这里面就等待接收你这方对我的一个注等待对吧,哎把这个县城呢开起来。开起来之后,那这个leader,这个follow干什么事呢?他要做的事情得先找老大。说我得找这个集群里面谁是leader啊,对吧?哎,谁是找到这个leader之后,我是不是得跟他进来进行建立连接,把我自己的三个值。
07:08
是我发到给对方了对吧,哎,一个呢,是这个啊,Serve ID serve ID以及po对吧,一份是ID啊。啊,那他这边也准备好了,这边也准备好了,准备好之后,那接下来这边呢,是得开启准备接收对应的拍,那谁给他发呢?那当然是follow给他发呀。里面有一个S向这个进行一个注册。哎,注射相关信息,那其实呢,就是red packet就是流啊,IO流往这边写啊,所有的red packet都是写数据啊写数据。那你这边一写对方是不是一个监听机制啊,哎,监听,那我就能够接收到对应的数据。接收到数据之后,那才下来,它会根据你传过来的相关的三个值啊,服务器IDID和ID,创建新的ID。
08:03
那因为改朝换代了嘛,产生新的leader之后,那我就要创建自己的啊,创建自己的。创建完自己的之后,他要干什么事,他将这个新创建的这个发给对方,告诉他以后呢,我们这个朝代编号就是这个。那发给对方,那对方就得有对应的接收,对吧,那你看这个是red package是往出发,那read的话就读呗,哎,读到你对方新发送过来的新的。那发过来之后。那接下来他就再往这边来进行写,说告诉老大我已经收到了你对应的新的D,好确认完毕之后,那接下来,那接下来leader干什么事啊,哎,Leader要干这本事儿。他要判断我要跟这个follower到底怎么进行同步。他判断一下啊,例的数据如果一样,那是不就不同步了。
09:00
对吧,哎,如果说我大于你那怎么办?把我的数据往你这同步,如果你大于他的话,我要求你自己要回退进行一个回滚是吧,来降低对应的是外地。好,那这边呢,就收到对方的一个请求。啊请求,哎,这边呢,是先发的提案啊,还记得这个底层通讯原理吗?哎,是先发提案,然后接下来是我发对应的这个啊commit要求啊好。那这块呢,收到对应的这个提案要求之后,那是不是给对方进行一个应答呀,啊说我接受啊。同意你相关的一个请求,那接下来他收到对应的这个同意请求之后。那是不是下一步才是真正的去更新对应的数据啊,这叫两阶段提交。啊OK啊,这原码稍微复杂一点啊,我们把它接出来。听一下。哎,后续呢,我们就照这个图啊,给大家去讲解一下对应的源码。
我来说两句