做网站的都改行做什么了,上海推牛网络科技有限公司,智能网站建设维护软件,手机网站 禁止缩放转载#xff1a;https://www.cnblogs.com/shuaiandjun/p/9383655.html
一、zookeeper集群
配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的#xff0c;每个服务器上的数据是相同的#xff0c;每一个服务器均可以对外提供读和写的服务#xff0c;这点和red…转载https://www.cnblogs.com/shuaiandjun/p/9383655.html
一、zookeeper集群
配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的每个服务器上的数据是相同的每一个服务器均可以对外提供读和写的服务这点和redis是相同的即对客户端来讲每个服务器都是平等的。 这篇主要分析leader的选择机制zookeeper提供了三种方式
LeaderElection AuthFastLeaderElectionFastLeaderElection 最新默认
默认的算法是FastLeaderElection所以这篇主要分析它的选举机制。
二、选举流程简述
目前有5台服务器每台服务器均没有数据它们的编号分别是1,2,3,4,5,按编号依次启动它们的选择举过程如下
服务器1启动给自己投票然后发投票信息由于其它机器还没有启动所以它收不到反馈信息服务器1的状态一直属于Looking(选举状态)。服务器2启动给自己投票同时与之前启动的服务器1交换结果由于服务器2的编号大所以服务器2胜出但此时投票数没有大于半数所以两个服务器的状态依然是LOOKING。服务器3启动给自己投票同时与之前启动的服务器1,2交换信息由于服务器3的编号最大所以服务器3胜出此时投票数正好大于半数所以服务器3成为领导者服务器1,2成为小弟。服务器4启动给自己投票同时与之前启动的服务器1,2,3交换信息尽管服务器4的编号大但之前服务器3已经胜出所以服务器4只能成为小弟。服务器5启动后面的逻辑同服务器4成为小弟。
三、选择机制中的概念
1、Serverid服务器ID
比如有三台服务器编号分别是1,2,3。 编号越大在选择算法中的权重越大。 2、Zxid数据ID
服务器中存放的最大数据ID. 值越大说明数据越新在选举算法中数据越新权重越大。 3、Epoch逻辑时钟
或者叫投票的次数同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加然后与接收到的其它服务器返回的投票信息中的数值相比根据不同的值做出不同的判断。
4、Server状态选举状态
LOOKING竞选状态。FOLLOWING随从状态同步leader状态参与投票。OBSERVING观察状态,同步leader状态不参与投票。LEADING领导者状态。
四、选举消息内容
在投票完成后需要将投票信息发送给集群中的所有服务器它包含如下内容。
服务器ID数据ID逻辑时钟选举状态
五、选举流程图
因为每个服务器都是独立的在启动时均从初始状态开始参与选举下面是简易流程图。 六、选举状态图
描述Leader选择过程中的状态变化这是假设全部实例中均没有数据假设服务器启动顺序分别为A,B,C。 七、判断是否已经胜出
默认是采用投票数大于半数则胜出的逻辑。
八、选举流程详述
一、首先开始选举阶段每个Server读取自身的zxid。
二、发送投票信息 a、首先每个Server第一轮都会投票给自己。 b、投票信息包含 所选举leader的ServeridZxidEpoch。Epoch会随着选举轮数的增加而递增。
三、接收投票信息 1、如果服务器B接收到服务器A的数据服务器A处于选举状态(LOOKING 状态) 1首先判断逻辑时钟值 a如果发送过来的逻辑时钟Epoch大于目前的逻辑时钟。首先更新本逻辑时钟Epoch同时清空本轮逻辑时钟收集到的来自其他server的选举数据。然后判断是否需要更新当前自己的选举leader Serverid。判断规则rules judging保存的zxid最大值和leader Serverid来进行判断的。先看数据zxid,数据zxid大者胜出;其次再判断leader Serverid,leader Serverid大者胜出然后再将自身最新的选举结果(也就是上面提到的三种数据leader ServeridZxidEpoch广播给其他server) b如果发送过来的逻辑时钟Epoch小于目前的逻辑时钟。说明对方server在一个相对较早的Epoch中这里只需要将本机的三种数据leader ServeridZxidEpoch发送过去就行。 c如果发送过来的逻辑时钟Epoch等于目前的逻辑时钟。再根据上述判断规则rules judging来选举leader 然后再将自身最新的选举结果(也就是上面提到的三种数据leader ServeridZxidEpoch广播给其他server)。 2其次判断服务器是不是已经收集到了所有服务器的选举状态若是根据选举结果设置自己的角色(FOLLOWING还是LEADER)退出选举过程就是了。
最后若没有收到没有收集到所有服务器的选举状态也可以判断一下根据以上过程之后最新的选举leader是不是得到了超过半数以上服务器的支持,如果是,那么尝试在200ms内接收一下数据,如果没有新的数据到来,说明大家都已经默认了这个结果,同样也设置角色退出选举过程。 2、 如果所接收服务器A处在其它状态FOLLOWING或者LEADING。 a)逻辑时钟Epoch等于目前的逻辑时钟将该数据保存到recvset。此时Server已经处于LEADING状态说明此时这个server已经投票选出结果。若此时这个接收服务器宣称自己是leader, 那么将判断是不是有半数以上的服务器选举它如果是则设置选举状态退出选举过程。 b) 否则这是一条与当前逻辑时钟不符合的消息那么说明在另一个选举过程中已经有了选举结果于是将该选举结果加入到outofelection集合中再根据outofelection来判断是否可以结束选举,如果可以也是保存逻辑时钟设置选举状态退出选举过程。