读《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之服务器启动

1.    Zookeeper技术内幕 

1.1. 服务器启动

        集群版zookeeper服务器启动流程

1.1.1.  数据加载

1.1.1.1.      加载快照文件

1.1.1.2.      加载事物日志文件

1.1.2.  启动ServerCnxnFactory

        启动过程中,创建一个固定大小的线程池workerPool,开启线程selectorThreads、acceptThread、expirerThread。

1.1.3. 初始Leader选举


        QuorumCnxManager:网络I/O

        ClientCnxn是ZooKeeper客户端中用于处理网络I/O 的一个管理器。在Leader选举的过程中也有类似的角色,那就是QuorumCnxManager——每台服务器启动的时候,都会启动一个QuorumCnxManager,负责各台服务器之间的底层Leader选举过程中的网络通信。

        为了能够进行互相投票,ZooKeeper集群中的所有机器都需要两两建立起网络连接。QuorumCnxManager在启动的时候,会创建一个ServerSocket来监听Leader选举的通信端口(Leader选举的通信端默认是3888)。开启端口监听后,ZooKeepr就能够不断地接收到来自其他服务器的“创建连接”请求,在接收到其他服务器的TCP连接请求时,为了避免两台机器之间重复地创建TCP连接,ZooKeeper设计了一种建立TCP连接的规则:只允许SID大的服务器主动和其他服务器建立连接,否则断开连接。服务器通过对比自己和远程服务器的SID值,来判断是否接受连接请求。如果当前服务器发现自己的SID值更大,那么会断开当前连接,然后自己主动去和远程服务器建立连接。

        一旦建立起连接,就会根据远程服务器的SlD来创建相应的消息发送器SendWorker和消息接收器RecvWorker,并启动他们。

        SendWorker:一个线程,负责将当前服务器的选举消息发送给集群中其他服务器。内部维护了一个SendQueue队列,该队列保存那些待发送的消息。

        RecvWorker:一个线程,负责接收来自群集中其他服务器的的选举消息。内部维护了一个RecvQueue队列,用于存放那些从其他服务器接收到的消息。

        从集群层面看,QuorumPeer代表了Zookeeper集群中的一台机器,在运行期间,QuorumPeer会不断检测当前服务器实例的运行状态,同时根据情况发起Leader选举。

        FastLeaderElection:选举算法,在内部维护了两个队列sendQueue,和recvQueue。

        sendQueue:选票发送队列,用于保存待发送的选票。

        recvQueue:选票接收队列,用于保存接收到的外部投票。

        WorkerReceiver:选票接收器。该接收器会不断地从QuorumCnxManager中获取出其他服务器发来的选举消息,并将其转换成一个选票,然后保存到recvqueue队列中去。在选票的接收过程中,如果发现该外部投票的选举轮次小于当前服务器,那么就直接忽略这个外部投票,同时立即发出自己的内部投票。当然,如果当前服务器并不是LOOKING状态,即已经选举出了 Leader,那么也将忽略这个外部投票,同时将Leader信息以投票的形式发送出去。另外,对于选票接收器,还有一个细节需要注意,如果接收到的消息来自Observer 服务器,那么就忽略该消息,并将自己当前的投票发送出去。

        WorkerSender:选票发送器,会不断地从sendqueue队列中获取待发送的选票,并将其传递到底层QuorumCnxManager中去。

猜你喜欢

转载自blog.csdn.net/lihuayong/article/details/53705861