知识要点:
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。
获取以下资料:关注公众号:【有故事的程序员】,获取学习资料。
记得点个关注+评论哦~