Java架构师工作8年还没有理解透彻的Leader选举

知识要点:

Leader选举
Leader选举源码解析

Leader选举

一、Leader算法

ZooKeeper选举算法:

AuthFastLeaderElection(过期)

LeaderElection(过期)

FastLeaderElection

FastLeaderElection.totalOrderPredict
在这里插入图片描述

根据算法得到比较顺序:

先比较Epoch(年号)。大的胜出;

再比较Zxid。大的胜出;

最后比较服务器Id(myid)。大的胜出。

在这里插入图片描述

投票步骤:

每个服务器都有一张投票<myid, zxid>,都先投自己;

搜集各个服务器的投票;

比较投票。

Leader选举源码解析

Leader算法涉及到的类

org.apache.zookeeper.server.quorum.QuorumPeer

选举节点类。该类用来设置一个报文套接字并响应当前Leader。

org.apache.zookeeper.server.quorum.QuorumCnxManager

选举通信连接管理类。该类使用TCP实现Leader选举过程中的连接管理。

org.apache.zookeeper.server.quorum.FastLeaderElection

具体选举算法。
Leader选举算法剖析

服务器启动调用QuorumPeer.start()方法,在崩溃恢复过程中要进行Leader选举;

在这里插入图片描述

Leader选举方法startLeaderElection()被调用,在方法中需要确定一个选举算法;
在这里插入图片描述

3.FasterLeaderElection是常用选举算法,而QuorumCnxManager在选举过程中负责管理网络连接。
在这里插入图片描述

QuorumCnxManager类中有几个比较重要的成员:
在这里插入图片描述

ConcurrentHashMap<Long, SendWorker> senderWorkerMap;
为每个服务器都保存一个发送队列,用于发送消息。SendWorker是一个Thread。
ConcurrentHashMap<Long, ArrayBlockingQueue> queueSendMap;
queueSendMap为每个参与投票的服务器保留一个队列。
ConcurrentHashMap<Long, ByteBuffer> lastMessageSent;
lastMessageSent用于保存从其他节点发送的最后一条消息。
ArrayBlockingQueue recvQueue;
所有接收消息的队列。
Notification
接收其他服务器发来的选举投票信息,包括:被选举者的id、zxid、选举周期等信息。
ToSend
发送给其他服务器的选举投票信息,也包含了被选举者的id、zxid、选举周期等信息Messenger.WorkerReceiver
线程类,不断从QuorumCnxManager中获取其他服务器发来的选举消息,并将其转换成一个选票,然后保存到recvqueue中。
Messenger.WorkerSender
线程类,不断地从sendqueue中获取待发送的选票,并把选票交给QuorumCnxManager发送出去。
4.选举启动流程图
QuorumPeer:管理Quorum协议的类。
QuorumCnxManger:完成服务器与服务器之间的网络交互。
QuorumServer:存放服务器选举信息(服务器唯一标识,服务器地址,服务器选举端口)
FastLeaderElection:ZK默认的Leader算法。
Vote:选票类
在这里插入图片描述

5.选举方法lookForLeader()
在这里插入图片描述

总结了一些2020年的面试题,这份面试题的包含的模块分为19个模块,分别是: Java基础、容器、多线程、反射、对象拷贝、JavaWeb异常、网络、设计模式、Spring/SpringMVC、SpringBoot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM。

获取以下资料:关注公众号:【有故事的程序员】,获取学习资料。
记得点个关注+评论哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值