Zookeeper服务器启动流程

服务端整体架构图

在这里插入图片描述
Zookeeper服务器启动流程大致可以分为以下五个步骤

  1. 配置文件解析
  2. 初始化数据管理器
  3. 初始化网络I/O管理器
  4. 数据恢复
  5. 对外服务
单机版服务器启动流程

在这里插入图片描述
上图的过程可以分为预启动和初始化

  • 预启动
  1. 统一由QuorumPeerMain作为启动类。无论单机或集群,在zkServer.cmd和zkServer.sh 中都配置了QuorumPeerMain作为启动入口类。
  2. 解析配置文件zoo.cfg。zoo.cfg配置运行时的基本参数,如tickTime、dataDir、 clientPort等参数。
  3. 创建并启动历􏼛文件清理器DatadirCleanupManager。对事务日志和快照数据文件进行定 时清理。
  4. 判断当前是集群模式还是单机模式启动。若是单机模式,则委托给ZooKeeperServerMain进 行启动。
  5. 再次进行配置文件zoo.cfg的解析。
  6. 创建服务器实例ZooKeeperServer。Zookeeper服务器首先会进行服务器实例的创建,然后 对该服务器实例进行初始化,包括连接器、内存数据库、请求处理器等组件的初始化。
  • 初始化
  1. 创建服务器统计器ServerStats。ServerStats是Zookeeper服务器运行时的统计器。
  2. 创建Zookeeper数据管理器FileTxnSnapLog。FileTxnSnapLog是Zookeeper上层服务 器和底层数据存储之间的对接层,提供了一系列操作数据文件的接口,如事务日志文件和快照数据文件。 Zookeeper根据zoo.cfg文件中解析出的快照数据目录dataDir和事务日志目录dataLogDir来创建 FileTxnSnapLog。
  3. 设置服务器tickTime和会话超时时间限制。
  4. 创建ServerCnxnFactory。通过配置系统属性zookeper.serverCnxnFactory来指定使 用Zookeeper自己实现的NIO还是使用Netty框架作为Zookeeper服务端网络连接工厂。
  5. 初始化ServerCnxnFactory。Zookeeper会初始化Thread作为ServerCnxnFactory的主 线程,然后再初始化NIO服务器。
  6. 启动ServerCnxnFactory主线程。进入Thread的run方法,此时服务端还不能处理客户端 请求。
  7. 恢复本地数据。启动时,需要从本地快照数据文件和事务日志文件进行数据恢复。
  8. 创建并启动会话管理器。Zookeeper会创建会话管理器SessionTracker进行会话管理。
  9. 初始化Zookeeper的请求处理链。Zookeeper请求处理方式为责任链模式的实现。会有多个 请求处理器依次处理一个客户端请求,在服务器启动时,会将这些请求处理器串联成一个请求处理链。
  10. 注册JMX服务。Zookeeper会将服务器运行时的一些信息以JMX的方式暴􏼜给外部。
  11. 注册Zookeeper服务器实例。将Zookeeper服务器实例注册给ServerCnxnFactory,之 后Zookeeper就可以对外提供服务。
集群服务启动流程

在这里插入图片描述
上图可以分为预启动、初始化、Leader选举、Leader预Follower启动器交互、Leader与Follower启动

  • 预启动
  1. 统一由QuorumPeerMain作为启动类。
  2. 解析配置文件zoo.cfg。
  3. 创建并启动历􏼛文件清理器DatadirCleanupFactory。
  4. 判断当前是集群模式还是单机模式的启动。在集群模式中,在zoo.cfg文件中配置了多个服务器 地址,可以选择集群启动。
  • 初始化
  1. 创建ServerCnxnFactory。
  2. 初始化ServerCnxnFactory。
  3. 创建Zookeeper数据管理器FileTxnSnapLog。
  4. 创建QuorumPeer实例。Quorum是集群模式下特有的对象,是Zookeeper服务器实例 (ZooKeeperServer)的托管者,QuorumPeer代表了集群中的一台机器,在运行期间, QuorumPeer会不断检测当前服务器实例的运行状态,同时根据情况发起Leader选举。
  5. 创建内存数据库ZKDatabase。ZKDatabase负责管理ZooKeeper的所有会话记录以及 DataTree和事务日志的存储。
  6. 初始化QuorumPeer。将核心组件如FileTxnSnapLog、ServerCnxnFactory、ZKDatabase 注册到QuorumPeer中,同时配置QuorumPeer的参数,如服务器列表地址、Leader选举算法和会话 超时时间限制等。
  7. 恢复本地数据。
  8. 启动ServerCnxnFactory主线程
  • Leader选举
  1. 初始化Leader选举。

集群模式特有,Zookeeper首先会根据自身的服务器ID(SID)、最新的 ZXID(lastLoggedZxid)和当前的服务器epoch(currentEpoch)来生成一个初始化投票,在 初始化过程中,每个服务器都会给自己投票。然后,根据zoo.cfg的配置,创建相应Leader选举算法 实现,Zookeeper提供了三种默认算法(LeaderElection、AuthFastLeaderElection、 FastLeaderElection),可通过zoo.cfg中的electionAlg属性来指定,但现只支持 FastLeaderElection选举算法。在初始化阶段,Zookeeper会创建Leader选举所需的网络I/O层 QuorumCnxManager,同时启动对Leader选举端口的监听,等待集群中其他服务器创建连接。

  1. 注册JMX服务。
  2. 检测

运行期间,QuorumPeer会不断检测当前服务器状态。在正常情况下,Zookeeper服务器的状态 在LOOKING、LEADING、FOLLOWING/OBSERVING之间进行切换。在启动阶段,QuorumPeer的初始 状态是LOOKING,因此开始进行Leader选举。

  1. Leader选举

ZooKeeper的Leader选举过程,简单地讲,就是一个集群中所有的机器相互之间进行一系列投 票,选举产生最合适的机器成为Leader,同时其余机器成为Follower或是Observer的集群机器⻆ 色初始化过程。关于Leader选举算法,简而言之,就是集群中哪个机器处理的数据越新(通常我们根 据每个服务器处理过的最大ZXID来比较确定其数据是否更新),其越有可能成为Leader。当然,如 果集群中的所有机器处理的ZXID一致的话,那么SID最大的服务器成为Leader,其余机器称为 Follower和Observer

  • Leader预Follower启动器交互
    到这里为止,zookeeper已经完成了Leader选举,并且集群中每个服务器都已经确定了自己的角色,通常情况下就分为leader和Follower两种角色。下面我们来对leader和Follower在启动期间的交互进行介绍,其大致交互流程如图所示
    在这里插入图片描述
  1. 创建Leader服务器和Follower服务器。完成Leader选举后,每个服务器会根据自己服务器的角色创建相对应的服务器实例,并进入各自角色的主流程
  2. Leader服务器启动Follower接收器LearnerCnxAcceptor。运行期间,Leader服务器需要和所有其余的服务器(统称为Learner)保持连接以确认集群的机器存活情况,LearnerCnxAcceptor负责接收所有非Learner服务器的连接请求。
  3. Learner服务器开始和Leader服务器建立连接。所有Learner会找到Leader服务,并与其建立连接
  4. Leader服务器创建LearnerHandler。Leader接收到来自其他机器连接创建请求后,会创建一个LearnerHandler实例,每个LearnerHandler实例都对应一个Leader与Learner服务器之间的连接,其负责Leader与Learner服务器之间几乎所有的消息通信和数据同步
  5. 向Leader注册。Learner完成和Leader的连接后,回向Leader进行注册,即将Learner服务器的基本信息(LearnerInfo),包括SID和ZXID,发送给Leader服务器。
  6. Leader解析Learner信息,计算新的epoch。 Leader接收到Learner服务器基本信息后,会解析出该Learner的SID和ZXID,然后根据ZXID解析出对应的epoch_of_learner,并和当前Leader服务器的epoch_of_leader进行比较,如果该Learner的epoch_of_learner更大,则更新Leader的epoch_of_leader = epoch_of_learner + 1。然后LearnHandler进行等待,知道过半的Learner已经向Leader进行了注册,同时更新了epoch_of_leader,Leader就可以确定当前集群的epoch了。
  7. 发送Leader状态。计算出新的epoch后,Leader会将该信息以一个LEADERINFO消息的形式发送给Learner,并等待Learner的回应。
  8. Learner发送ACK消息。 Learner接收到LEADERINFO后,会解析出epoch和ZXID,然后向Leader反馈一个ACKEPOCH响应。
  9. 数据同步。Leader接收到Learner的ACKEPOCH后,即可进行数据同步。
  10. 启动Leader和Learner服务器。当有过半Learner已经完成了数据同步,那么Leader和Learner服务器实例就可以启动了。
  • Leader与Follower启动
  1. 创建启动会话管理器
  2. 初始化zookeeper请求处理链,集群模式的每个处理器也会在启动阶段串联请求处理链
  3. 注册JMX服务

至此,集群版的zookeeper服务器启动完毕

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值