00:00
好,接下来我们来看一下主kper选举源码的一个解析,那它是一个非常重要的一个功能啊,啊在面试的时候呢,经常会被问到,那下面我们来看一下啊,或者回忆一下主kper对应的一个选举机制。那它是两种情况啊,一种呢,是第一次启动还记得吧,对吧,第一次启动的时候他会怎么投票啊,他启动之后,首先呢,他都是自私的,先把这个票啊投给自己。投给自己之后,他会去判断说自己有没有超过整个集群的半数,那一看没有半数,那怎么办?哎,他就等着呗,录屏状态等待,那接下来第二个服务器启动之后,他仍然是将自己的票投给自己。那投给自己他们都不够怎么办?哎,这个MYID比较小的编号,会把这个投票选给MYID大的对应的服务器这样去,然后接下来他就变成两票,但是两票啊,还没有达到集群的半数,那怎么办?哎,继续looking状态,等待。那SO3启动,SO3启动之后,诶,那他仍然也是先投也自己,然后最后呢,把这个SO1和二的票拿过来凑成了三票,那三票就超过了整个集群的半数,那接下来就可以产生对应的leader和。
01:15
OK吧啊。那拿证之后,那接下来这个follow啊,这个SERVE4启动,启动之后很遗憾,这个集群当中啊,已经有了leader,那他就不能够再当leader了,只能是屈居为后罗。OK,那这个第五台服务器启动之后也是一样的,只能作为。那下面往下啊,下面呢,是三个概念sid啊,4I以及呢,这个每一个leader任期的代号啊,这三个概念名词啊。了解一下行,那下面我们来看一下这个,嗯,非地启动。回忆一下他怎么选举的了,首先呢,哎,分这么几种情况对吧。找找哪找到这。走到这块吧。
02:00
直接走到这儿,集群当中如果不存在力了怎么办?那我这里面举的例子仍然是这个三和五挂掉。那挂掉之后如何来选举出新的leader?那这里面仍然涉及到sid。Z sidd以及呢1PO ID对吧?嗯,任期ID好,那这里面它怎么选呢?首先那就剩下的服务器呢,就只有一二和对应的四了。那124你要填满选票当中要包含这三类信息,E z sid和ID。那你像这个一号服务器,它的我们是一,那么它的这个z sid呢,我们假设它是八对吧?啊八,那后面这个sid它对应的是一,那把这个一填过来。那下一个。它对应的这个二这套服务器,它的PO1ZID那是八,然后sid呢对应的是二。
03:00
啊,最后一个,最后一个呢,是第四号服务器,那第四号服务器它的e po1z sid是不是对应的这个七呀?啊,然后这个sid呢,对应的是这个四。那通过这一系列比较之后,那么他就能够选举出对应的leader,怎么选啊,先比较对应的。发现与都相等,那好,那继续往下比。下一个呢,比这个4ID,那45ID它是八,它是八它是七。那理论上来说,一和二有机会。对吧,那相同之后再比。再比的话,就比下一个SI。那sid的话谁大呀,这个二号福气大,所以说他就生出。啊,这个是啊,非初始化的相关的一个选举操作。那这是我们之前讲的理论,那下面如果在代码里面,它又是怎么执行的呢?那下边给大家看张图啊,这张图呢,相对来说要复杂一些啊,大家认真听。呃,首先来看啊,左侧这块代码。
04:02
你可以认为是主k pro服务器的第一台服务器右侧呢是JK2。可以吧,哎,这是两个节点服务器啊,只不过呢,左侧这个呢,我展开的比较详细一些,哎,在这个JK1当中,我放了两个类。第一个呢是fast leader啊,选举快速选取出老大,那个呢是一个类呢叫啊cn manager。专门用来管理跟其他节点进行通讯的,他是专门来管理选举的。这么两个类。OK吧,那好,那下面开始干活了,那首先呢,在这边他要进行通过选举算法生成对应的选票,那选票里面包含三种信息,一个呢是post ID,还有一个呢是哎,Z sidd。对应的是ID以及呢SI,比如说服务器的IDMYID这三个值构成了对应的选票。那通通过选票算法啊,生成之后,那他就要发送选票。
05:03
对吧,那发送选票呢,他先把这个选票啊,放到这个发送队列里面。哎,我放到这里面,然后。通过我这个类当中的这个worker center。啊,三点通过它往外去发送。听懂吧,哎,它是这样一个结构哈,相当于有一个缓冲。OK,那这样来说,那咱们都说呀,他这个每一个这个主kper都是自私的,他会先把选票投给自己。那投给自己的话,就会放到哎,这个对外通信当中的这个receive队列里面,哎,接收缓冲队列。那投给自己之后,那这个发的这个选举算法里面就得有对应的一个接收器。那就是worker receiver,他把这个选票拿过来,哎,接收回来,接收回来之后,在这里面还有一个接收处理队列。哎,数据,那在这个过程当中,他要干一件什么事呢?他要干一件事,判断当前选票是否。
06:06
都是头是几?啊,而且呢,投自己的选票有没有超过整个集群的半数。那很显然,现在我只启动了一个主KPER1。那是不是选票不够啊,啊,没有达到半数,那什么,那他继续通过它生成选票,发送选票往出发,那这次他要发给谁呢?他就要往外发了,对吧,把这张选票发给别人。哎,谁的j sidd比我大,那我就发给谁啊往外发行,那下面你这个是JK1,我这个是JK2。那么两个之间要进行通讯的时候,那好,那就是通过这个监听器,要创建监听器进行相关的一个连接,尤其你这边接收数据。对吧,通过这个来进行接收。啊,这样一套流程,那在这个对外通信里面,它有哪些组件呢。它有这么几个组件。哎,这里面是这个,呃,发送的一个缓冲队列,以及呢,对外发送的客户端,还有接收的对应的客户端。
07:07
啊,你看设计的还是非常复杂的哈,好,那下面我这里面把这个选票我要往出发,那我发给谁呢?如果你发给的是SERVE2这台服务器,那它就会专门创建一个SERVE2的队列,如果你发送给的是哎,SERVE3也就CK3,那么他会专门准备一个。队列啊,也就是说每一个节点它都会单独去创建发送队列。哎,放到这里面,放到这里面由谁来往外发呢?由这里面的汤。哎,Sand map里面的sand worker,由他来往外放这些。发送到其他节点,好,那下一步呢,就是接送。哎,接收对应的投票,如果别人的选票发给我的,那我是不是得有一个接收方啊,对吧,你这里面不是监听吗?我再来接收,由他来接收,接收完之后他会把这个选票放到这个receive队列里面。
08:04
哎,然后receive对阵,再给前面这个fast leader啊。这个选举算法。然后呢,在这块呢,进行相关的一个唱票处理,然后把这个选票放在这个处理投票的地方。啊,这个对对。这样一套流程。OK吧?啊,这里面涉及到组件呢,虽然比较多啊,其实呢,它为什么要这么设计呢,大家思考一下,其实就是解耦嘛。一个类呢,是负责专门的选举算法,另一个类呢,是专门对外进行相关通讯。是吧,各干各地啊。那你各干各地,首先呢,就是自己,那你负责选举的,你就要生成选票。那生成选票的话,那我要生成多的选票,我就要缓冲一下,放到这个方程队列。哎,然后往外发。对吧,往外发好。往外发,那就先投知己呗,啊,先投给自己。给自己呢,那你就要接收,接收之后,那你肯定要处理这个选票,看一看有没有超过半数,没有超过半数继续往外发,那这个发送选票为什么他放一个队列。
09:06
因为他要给每一个节点都要发,你看啊,比如说我是JK1。我是JK1,那我是不是要发给JK2 JK3JK4JK5,那所以我要把每一个对阵,每一个节点我都要放一个。啊,发给谁的,所以说这里面是一个发生队列。那往外发的话,那你对外进行一个发送,那你得有对外的相关的接口啊,对吧,一个是发一个收,那发收的过程当中可以创建这个监听器,尤其是这个收的过程当中。对吧,你只要一给我发数,我立刻这边触发监听,然后就可以接收数据。那你这块为什么还有一个。发送队列呢,那是因为你这块你发送的时候对吧,哎,你要发给谁发给他发给他,哎我可以先放在这儿做一个缓冲。对吧,哎,缓冲,然后这个就跟你这个算法就完全解耦了,这就没关系了,然后这边呢,慢慢的一个一个往外发,这边收。
10:01
哎,稍微理解一下哈,那行,那这里面的相关内容呢,我先给他诶。盯出来一张图。OK。对吧,哎,这个呢,往这一放啊,下面我继续往下走,下面呢,这里面我们这个真正的选举算法呢,分两步,一个呢是选举的准备,还有一步呢,是真正的选举的执行,那我们先来看一下他选举之前做了哪些准备工作。打开它。再一个呢,是从原理的角度啊去看的,那接下来呢,就是从这个代码的角度啊去看,那现在这块稍微回忆一下程序的入口,然后初始化and RA。然后呢,这个是主K启动对吧,来启动那个服务,启动服务之后是不是就加载。数据啊,哎,到内存当中,这是我们之前讲的,那接下来就要准备进行选举,那准备选举过程当中,他要创建选票,选票里面有三个参数。
11:01
啊ID,事务ID以及serve ID,然后创建选举实例。那创建过程当中,他就要创建一个他create cn SN manager,他就负责专门对外通讯的。这个接口谁呀,就是这个。他呢是专门跟其他节点负责相关通讯的啊,由他来管理,那在这里面你会发现啊,有这个receive队列对吧?啊有map,还有这个send maper对吧?啊对应的发送相关信息。那再来。下面呢这块呢,他在接收数据的时候,是不是得有一个监听器啊,比说这块啊,得有定的监听,那监听的话就是接收啊,这是一个外循环哎,实时等待对方发送数据。再往后那下面这块呢,是啊准备。哎,是谁呢?是你前面这块,哎,选举算法对应的我要准备哪些工作,那这里面也有对应的receive和send的队列。
12:04
这块。这里面你是不是得准备散的队列和这个接收数据的队列啊,其实就是创建各种队列OK吧。那下面呢,我们来定一张图。那我们就按照这个图呢啊进行往下去执行,看一下啊看一下,那现在我这个程序回到哪了呢?回到这个主题包啊,这个Java里面,这个start上一步我们是走的这个load data上啊,接下来要走的就是选举准备啊选举准备。那行看一下代码。嗯,走到这个位置,然后load database是不是到这啊,到这这开始准备选举的相关操作进来。进来之后看到这里面首先映入眼帘的是不是就new了一个Mo,就选票嘛,那选票里面有卖ID,有last这个j sidd,比如说最新的是D,那是不是当前啊,刚操作完的对吧,是ID,然后呢,这个是current当前的这个。
13:09
对吧,哎,这个每个leader的任期代号这么三个值构成了对应的选票。让它往下走啊,这个选票完了之后往下看,这是通过选举算法。创建的选项。这有一个create创建进来。进来之后往哪看呢?往下面看,走到这个三,这里面有一个创建create cnsn manager,其实就是为了创建这个对应的通讯中。创建这块OK吧,嗯,那好,那看一下。那就进来呗,看他干了什么事,进来之后你会发现啊,他又了一个qua cns manager,通讯管理manager进来。进来之后,他那块儿。熟悉吧,哎,Receive,对比一下。这样对比一下,首先呢,有这个receive queen是不是它呀?哎,接收相关的数据,然后呢,这个是queen sand map,呃,Queen sand map是这个吧,哎,发生队列,然后下面还有一个s worker map work map是它吧,哎,它下面呢,还有对应的这个worker worker啊这是整体的一个大类。
14:17
OK吧,啊是这样的一个过程啊,这个为了跟其他啊节点进行通讯,这个初始化都已经准备好了,相关队列,那回来再回来再回来。就充电对吧。房建。好,下面这块是不是有创建对应的这个listener对吧?哎,把在刚才这里面创建listener反馈给他啊这个listener,那这个listener是干嘛的呢?而且这个listener呢,还启动了。是这样吧,哎,启动这个雷,那行,那我们就进去呗。那listener里面启动,启动的话他要走谁呀?你看这里面叫主keepper什么意思,这个listener其实继承的是一个线程啊。
15:03
那在县城里面必然就启动的话,是不是得有这个run方法呀,对吧?哎,Run方法啊,嗯。下走往下走往下走,走到这个位置,你看这块,只要他不啊不上到不关机的话,就这个客户端就会一直接收对应的相关消息。对吧,哎,这就是相当于是哪一步呢,这步。对吧,哎,启动监听,然后一直等待其他节点给他发相关的数据进行接收。对吧,哎,这也是准备相关的一个操作,那好,那我们再往回走。往回走啊,走到这之后,哎,刚才呢,我们是走了一个它创建通讯终端,然后监听器也已经准备好了,再往下这里面呢,是了一个fast leader elect来,然后进行启动,对吧?来进行启动,那我看这里面又干了什么事呢?
16:02
进来之后,这里有一个嗯,Starter。打开之后,你看这里面干了什么事。他在创建对象的过程当中,是不是创建了这么两个东东。那你看一下。刚才我们进来的是不是这个fast leader?那在这个fast leader lesson里面是不是干了这么一些事,创建啊,可创建这个处理的receive,你看,哎,把这些所有的队列都初始化准备好了,这就是我们选举之前要做的一些准备工作。OK吧,哎,先了解到这儿。
我来说两句