本节大概的讲解单机版服务端启动过程
服务端整体架构如下图
图中的SessionTracker,FileTxnSnapLog,FileTxnLog,FileSnap,DataTreem,SessionTracker已经在前面讲解过
单机版服务器的启动其流程图如下
源码主要参照
org.apache.zookeeper.server.quorum.QuorumPeerMain#main
org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun
无论单机或集群,在zkServer.cmd和zkServer.sh中都配置了QuorumPeerMain作为启动入口类。
zoo.cfg配置运行时的基本参数,如tickTime、dataDir、clientPort等参数。
对事务日志和快照数据文件进行定时清理。
源码见org.apache.zookeeper.server.PurgeTxnLog
比较简单,这里就是有个问题
如果日志清理了,server挂了怎么恢复
若是单机模式,则委托给ZooKeeperServerMain进行启动。
Zookeeper服务器首先会进行服务器实例的创建,然后对该服务器实例进行初始化
初始化在下面初始化的章节讲解
上面1-4部分,源码在org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun中
5部分在org.apache.zookeeper.server.ZooKeeperServerMain#main中
public static void main(String[] args) { ZooKeeperServerMain main = new ZooKeeperServerMain();try { main.initializeAndRun(args);//单机版启动} ...
6部分在org.apache.zookeeper.server.ZooKeeperServerMain#initializeAndRun中
红框以下的就是下面的初始化步骤
初始化源码从
org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig开始
包含有
ServerStats是Zookeeper服务器运行时的统计器。
源码在org.apache.zookeeper.server.ZooKeeperServer#ZooKeeperServer()中
FileTxnSnapLog是Zookeeper上层服务器和底层数据存储之间的对接层,提供了一系列操作数据文件的接口,如事务日志文件和快照数据文件。Zookeeper根据zoo.cfg文件中解析出的快照数据目录dataDir和事务日志目录dataLogDir来创建FileTxnSnapLog。
通过配置系统属性zookeper.serverCnxnFactory来指定使用Zookeeper自己实现的NIO还是使用Netty框架作为Zookeeper服务端网络连接工厂。
上面四部分的源码都在org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig中
Zookeeper会初始化Thread作为ServerCnxnFactory的主线程,然后再初始化NIO服务器。
默认实现在org.apache.zookeeper.server.NIOServerCnxnFactory#configure中
@Overridepublic void configure(InetSocketAddress addr, int maxcc) throws IOException { configureSaslLogin(); thread = new ZooKeeperThread(this, 'NIOServerCxn.Factory:' addr);//初始化线程thread.setDaemon(true); maxClientCnxns = maxcc;this.ss = ServerSocketChannel.open(); ss.socket().setReuseAddress(true); LOG.info('binding to port ' addr); ss.socket().bind(addr); ss.configureBlocking(false); ss.register(selector, SelectionKey.OP_ACCEPT); }
进入Thread的run方法,此时服务端还不能处理客户端请求。
启动时,需要从本地快照数据文件和事务日志文件进行数据恢复。
6和7部分的代码在
org.apache.zookeeper.server.NIOServerCnxnFactory#startup
org.apache.zookeeper.server.ServerCnxnFactory#startup
中
Zookeeper会创建会话管理器SessionTracker进行会话管理。
Zookeeper请求处理方式为责任链模式的实现。会有多个请求处理器依次处理一个客户端请求,在服务器启动时,会将这些请求处理器串联成一个请求处理链。
Zookeeper会将服务器运行时的一些信息以JMX的方式暴露给外部。
将Zookeeper服务器实例注册给ServerCnxnFactory,之后Zookeeper就可以对外提供服务。
8-11步骤在
org.apache.zookeeper.server.ZooKeeperServer#startup中
如果把日志清除了,会不会出现server挂了然后恢复不了的情况
联系客服