zookeeper服务端

来源:互联网 发布:大型网络动作竞技游戏 编辑:程序博客网 时间:2024/05/29 19:31

Zookeeper服务器的启动过程,大致可以分为以下五个步骤

1.配置文件解析。

2.初始化数据管理器。

3.初始化网络IO管理器。

4.数据恢复。

5.对外服务。

单机版服务器启动


1.预启动

1.1 统一由QuorumPeeroMain作为启动类。无论单机或集群,在zkServer.cmd和zkServer.sh中都配置了QuorumPeerMain作为启动入口类。

1.2 解析配置文件zoo.cfg。zoo.cfg配置运行时的基本参数,如tickTime、dataDir、clientPort等参数。

1.3 创建并启动历史文件清理器DatadirCleanupManager。对事务日志和快照文件进行定时清理。

1.4 判断当前是集群模式还是单机模式。若是单机模式,则委托给ZookeeperServerMain进程启动。

1.5 再次进行配置文件zoo.cfg的解析。

1.6 创建服务器实例ZooKeeperServer。Zookeeper服务器首先会进行服务器实例的创建,然后对该服务器实例进行初始化,包括连接器、内存数据库、请求处理器等组件的初始化。

2.初始化

2.1 创建服务器统计器ServerStats。

2.2 创建Zookeeper数据管理器FileTxnSnapLog,FileTxnSnapLog是Zookeeper上层服务器和底层数据存储之间的对接层,提供了一系列操作数据文件的接口,如事务日志文件和快照数据文件。Zookeeper根据zoo.cfg文件中解析出的快照数据目录dataDir和事务日志目录dataLogDir来创建FileTxnSnapLog。

2.3 设置服务器tickTime和会话超时时暗限制。

2.4 创建ServerCnxnFactory。通过配置系统属性zookeeper.serverCnxnFactory来指定使用Zookeeper自己实现的NIO还是使用Netty框架作为Zookeeper服务端网络连接工厂。

2.5 初始化ServerCnxnFactory。Zookeeper会初始化Thread作为ServerCnxnFactory的主线程,然后再初始化NIO服务器。

2.6 启动ServerCnxnFactory主线程。进入Thread的run方法,此时服务端还不能处理客户端请求。

2.7 恢复本地数据。启动时,需要从本地快照数据文件和事务日志文件进行数据恢复。

2.8 创建并启动会话管理器。Zookeeper会创建会话管理器SessionTracker进行会话管理。

2.9 初始化Zookeeper的请求处理链。Zookeeper请求处理方式为责任链模式的实现。会有多个请求处理器依次处理一个客户请求,在服务器启动时,会将这些请求处理器串联成一个请求处理链。

2.10 注册JMX服务。Zookeeper会将服务器运行时的一些信息以JMX的方式暴露给外部。

2.11 注册Zookeeper服务器实例。将Zookeeper服务器实例注册给ServerCnxnFactory,之后Zookeeper就可以对外供服务。

集群服务器启动



1.预启动
1.1  统一由QuorumPeerMain作为启动类
1.2 解析配置文件zoo.cfg
1.3 创建并启动历史文件清理器DatadirCleanupFactory.
1.4 判断当前是集群模式还是单机模式的启动。在集群模式下,在zoo.cfg文件中配置了多个服务器地址,可以选择集群启动。
2.初始化
2.1创建ServerCnxnFactory
2.2 初始化ServerCnxnFactory
2.3 创建Zookeeper数据管理器FileTxnSnapLog
2.4 创建QuorumPeer实例。Quorum是集群模式下持有的对象,是Zookeeper服务器实例(ZooKeeperServer)的托管者,QuorumPeer代表了集群中的一台机器,在运行期间,QuorumPeer会不断检测当前服务器实例的运行状态,同时根据情况发起leader选举。
2.5 创建内存数据库ZKDatabase。ZKDatabase负责管理Zookeeper的所有会知记录以及DataTree和事务日志的存储。
2.6 初始化QuorumPeer。将核心组件如FileTxnSnapLog ServerCnxnFactory ZKDatabase注册到QuorumPeer中,同时配置QuorumPeer的参数,如服务器列表地址、Leader选举算法和会话超时时间限制等。
2.7 恢复本地数据
2.8 启动ServerCnxnFactory主线程。
3.Leader选举
3.1初始化Leader选举。集群模式特有,Zookeeper首先会根据自身的服务器ID(SID)、最新的ZXID(lastLoggedZxid)和当前的服务器epoch(currenEpoch)来生成一个初始化投票,在初始化过程中,每个服务器都会给自己投票。然后,根据zoo.cfg的配置,创建相应Leader选举算法实现,Zookeeper提供三种默认算法(LeaderElection, AuthFastLeaderElection, FastLeaderElection),可通过zoo.cfg中的electionAlg属性来指定,但现只支持FastLeaderElection选举算法。在初始化阶段,Zookeeper会创建Leader选举所需的网络IO层QuorumCnxManager,同时启动对Leader选举端口的监听,等待集群中其他服务器创建连接。
3.2注册JMX服务
3.3 检测当前服务器状态。运行期间,QuorumPeer会不断检测当前服务器状态。在正常情况下,Zookeeper服务器的状态在Looking, leading, following, observing之间进行切换。在启动阶段,quorumpeer的初始状态是looking,因此开始进行leader选举。
3.4 leader选举。通过投票确定leader,其余机器称为follower和observer。
4. leader和follower启动期交互过程
4.1 创建leader服务器和follower服务器。完成leader选举后,每个服务器会根据自己服务器的角色创建相应的服务器实例,并进入各自角色的主流程。
4.2 leader服务器启动follower接收器learnerCnxAcceptor。运行期间,leader服务器需要和所有其余的服务器(统称为learner)保持连接以确集群的机器存活情况,LearnerCnxAcceptor负责接收所有非leader服务器的连接请求。
4.3 leader服务器开始和leader建立连接。所有learner会找到leader服务器,并与其建立连接。
4.4Leader服务器创建LearnerHandler。Leader接收到来自其他机器连接创建请求后,会创建一个Learnerhandler实例,每个learnerHandler实例都对应一个Leader与Learner服务器之间的连接,其负责leader和Learner服务器之间几乎所有的消息通信和数据同步。
4.5 向leader注册。learner完成和leader的连接后,会向leader进行注册,即将learner服务器的基本信息,发送给leader服务器。
4.6leader解析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了。
4.7 发送leader状态。计算出新的epoch后,leader会将该信息以一个leaderinfo消息的形式发送给learner,并等待learner的响应。
4.8 learner发送ack消息。learner接收到leaderinfo后,会解析出epoch和zxid,然后向leader反馈一个ackepoch响应。
4.9 数据同步。leader收到learner的ackepoch后,即可进行数据同步。
4.10 启动leader和learner服务,当有过半learner已完成数据同步,那么leader和learner服务实例就可以启动了。
5.leader和follower启动
5.1 创建启动会话管理器。
5.2 初始化zookeeper请求处理链,集群模式的每个处理器也会在启动阶段串联请求处理链。
5.3 注册JMX服务。
原创粉丝点击