Zookeeper 集群模式启动
在上一篇我们讲解了集群的选举机制,但是作为一个服务端软件,启动当然是第一步,下面我们就来聊聊集群启动的详细过程。
注:zookeeper支持单机版和集群版,鉴于生产环境肯定都是集群版的,单机的启动这里就不说了,如果有必要,可以留言,我另开一篇文章讲解。
启动入口
通过zkServer.sh启动ZooKeeper时,应用的统一入口为QuorumPeerMain。
此处Quorum的含义是“保证数据冗余和最终一致的机制”,Peer表示集群中的一个平等地位节点。
从代码中可以看出:
QuorumPeerMain会做一个判断,当使用配置文件(args.length == 1)且是集群配置的情况下,启动集群模式QuorumPeer,否则启动单机模式ZooKeeperServer。
这里还启动了DatadirCleanupManager,用于清理早期的版本快照文件。
下面讲解集群模式启动
我们分如下几个步骤讲解
一、指标收集
MetricsProvider是一个可以收集指标、将当前值发送到外部设备的一个组件。数据在server端和client端可以共享
二、创建ServerCnxnFactory实例
ServerCnxnFactory从名字就可以看出其是一个工厂类,负责管理ServerCnxn,ServerCnxn这个类代表了一个客户端与一个server的连接,每个客户端连接过来都会被封装成一个ServerCnxn实例用来维护服务器与客户端之间的Socket通道。
首先要有监听端口,客户端连接才能过来,ServerCnxnFactory.configure()方法的核心就是启动监听端口供客户端连接进来,端口号由配置文件中clientPort属性进行配置,默认是2181
三、初始化QuorumPeer
Quorum在Zookeeper中代表集群中大多数节点的意思,即一半以上节点,Peer是端、节点的意思,Zookeeper集群中一半以上的节点其实就可以代表整个集群的状态,QuorumPeer就是管理维护的整个集群的一个核心类。
这一步主要是创建一个QuorumPeer实例,并进行各种初始化工作,
QuorumPeer.start()是Zookeeper中非常重要的一个方法入口,其代码如下:
start方法实现的业务主要包含四个方面:
1、loadDataBase:涉及到的核心类是ZKDatabase,并借助于FileTxnSnapLog工具类将snap和transaction log反序列化到内存中,最终构建出内存数据结构DataTree
2、startServerCnxnFactory:之前介绍过ServerCnxnFactory作用,ServerCnxnFactory本身也作为一个线程,其run方法实现的大致逻辑是:构建reactor模型的EventLoop,Selector每隔1秒执行一次select方法来处理IO请求,并分发到对应的代表该客户端的ServerCnxn中并利用doIO进行处理。
3、startLeaderElection():这个主要是初始化一些Leader选举工作,所有节点启动的初始状态都是LOOKING,因此这里都会是创建一张投自己为Leader的票
这部分的关键代码在QuorumPeer.createElectionAlgorithm,大致如下:
Leader选举涉及到节点间的网络IO,QuorumCnxManager就是负责集群中各节点的网络IO,QuorumCnxManager包含一个内部类Listener,Listener是一个线程,这里启动Listener线程,主要启动选举监听端口并处理连接进来的Socket;FastLeaderElection就是封装了具体选举算法的实现。
具体的选举逻辑已经在上一篇文章介绍过了,请移步查看。
版权声明: 本文为 InfoQ 作者【tunsuy】的原创文章。
原文链接:【http://xie.infoq.cn/article/2cc4254af31112a1c43641c7a】。文章转载请联系作者。
评论