摘要
本节大概的讲解单机版服务端启动过程
服务端整体架构如下图
图中的SessionTracker,FileTxnSnapLog,FileTxnLog,FileSnap,DataTreem,SessionTracker已经在前面讲解过
单机版server启动概述
单机版服务器的启动其流程图如下
上图的过程可以分为 预启动和 初始化过程。
单机版server启动过程详解
预启动
源码主要参照
org.apache.zookeeper.server.quorum.QuorumPeerMain#main
org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun
1.统一由QuorumPeerMain作为启动类
无论单机或集群,在zkServer.cmd和zkServer.sh中都配置了QuorumPeerMain作为启动入口类。
2. 解析配置文件zoo.cfg
zoo.cfg配置运行时的基本参数,如tickTime、dataDir、clientPort等参数。
3.创建并启动历史文件清理器DatadirCleanupManager
对事务日志和快照数据文件进行定时清理。
源码见org.apache.zookeeper.server.PurgeTxnLog
比较简单,这里就是有个问题
如果日志清理了,server挂了怎么恢复
4.判断当前是集群模式还是单机模式启动。
若是单机模式,则委托给ZooKeeperServerMain进行启动。
5.再次进行配置文件zoo.cfg的解析
6.创建服务器实例ZooKeeperServer。
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开始
包含有
1. 创建服务器统计器ServerStats。
ServerStats是Zookeeper服务器运行时的统计器。
源码在org.apache.zookeeper.server.ZooKeeperServer#ZooKeeperServer()中
2.创建Zookeeper数据管理器FileTxnSnapLog
FileTxnSnapLog是Zookeeper上层服务器和底层数据存储之间的对接层,提供了一系列操作数据文件的接口,如事务日志文件和快照数据文件。Zookeeper根据zoo.cfg文件中解析出的快照数据目录dataDir和事务日志目录dataLogDir来创建FileTxnSnapLog。
3.设置服务器tickTime和会话超时时间限制。
4.创建ServerCnxnFactory。
通过配置系统属性zookeper.serverCnxnFactory来指定使用Zookeeper自己实现的NIO还是使用Netty框架作为Zookeeper服务端网络连接工厂。
上面四部分的源码都在org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig中
5. 初始化ServerCnxnFactory。
Zookeeper会初始化Thread作为ServerCnxnFactory的主线程,然后再初始化NIO服务器。
默认实现在org.apache.zookeeper.server.NIOServerCnxnFactory#configure中
@Override
public 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);
}
6. 启动ServerCnxnFactory主线程
进入Thread的run方法,此时服务端还不能处理客户端请求。
7. 恢复本地数据。
启动时,需要从本地快照数据文件和事务日志文件进行数据恢复。
6和7部分的代码在
org.apache.zookeeper.server.NIOServerCnxnFactory#startup
org.apache.zookeeper.server.ServerCnxnFactory#startup
中
8. 创建并启动会话管理器。
Zookeeper会创建会话管理器SessionTracker进行会话管理。
9. 初始化Zookeeper的请求处理链。
Zookeeper请求处理方式为责任链模式的实现。会有多个请求处理器依次处理一个客户端请求,在服务器启动时,会将这些请求处理器串联成一个请求处理链。
10.注册JMX服务。
Zookeeper会将服务器运行时的一些信息以JMX的方式暴露给外部。
11.注册Zookeeper服务器实例。
将Zookeeper服务器实例注册给ServerCnxnFactory,之后Zookeeper就可以对外提供服务。
8-11步骤在
org.apache.zookeeper.server.ZooKeeperServer#startup中
问题
历史文件清理器DatadirCleanupManager
如果把日志清除了,会不会出现server挂了然后恢复不了的情况
refer
http://www.cnblogs.com/leesf456/p/6105276.html
https://my.oschina.net/pingpangkuangmo/blog/491673
https://my.oschina.net/xianggao/blog/537902