QuorumPeer.start()
在QuorumPeerMain完成了QuorumPeer配置后会直接调用其start()函数启动,在启动的过程中会先进行选举工作,为了对选举的总体过程有个大致了解,先看下总体流程图:
图中涉及到的类作用:
QuorumCnxManager:负责每台服务器之间的底层Leader选举过程中的网络通信,类似于ServerCnxn。
Listener:监听管理器,它内部维护了一系列ListenerHandler,每一个ListenerHandler代表服务器与集群中另一个服务器的连接。
FastLeaderElection:选举算法
Messenger:选举过程中的消息管理器,内部维护两个线程,发送线程WorkerSender,接收线程WorkerReceiver
下面开下start()方法的源码:
QuorumPeer.run()
QuorumPeer本质是一个线程,start()
启动后等待CPU资源,获得后执行run()
方法进行正式选举逻辑。
到这里我们先停一停,等分析完选举的核心类之后再继续分析选举的核心。
ServerState
每个服务器只能处于一种状态,最开始的时候是LOOKING,意味着需要选举,身份未定。
Vote
在选举过程中Vote代表选票的信息,数据结构如下:
在选举过程中服务器会向集群中所有服务器发送自己的选票信息,也会收到来自其他服务器的选票信息,当收到选票后会进行PK,如果自己选票落后于收到的则更新自己的选票,选票PK过程如下:
ToSend
在服务器之间的通信中,ToSend是Vote的载体,数据结构如下:
选举的过程简单介绍到此,下文继续分析其他核心类。