分享

zk源码阅读22:单机版服务器启动概述

 liang1234_ 2019-03-30

本节大概的讲解单机版服务端启动过程

服务端整体架构如下图


服务端架构

图中的SessionTracker,FileTxnSnapLog,FileTxnLog,FileSnap,DataTreem,SessionTracker已经在前面讲解过

单机版server启动概述

单机版服务器的启动其流程图如下

单机版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中

预启动1-4步骤

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中

预启动步骤6

红框以下的就是下面的初始化步骤

初始化

初始化源码从
org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig开始

包含有

zk server初始化

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中

初始化的1-4步

5. 初始化ServerCnxnFactory。

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);
    }

6. 启动ServerCnxnFactory主线程

进入Thread的run方法,此时服务端还不能处理客户端请求。

7. 恢复本地数据。

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

6和7部分的代码在
org.apache.zookeeper.server.NIOServerCnxnFactory#startup
org.apache.zookeeper.server.ServerCnxnFactory#startup

初始化6-7步

8. 创建并启动会话管理器。

Zookeeper会创建会话管理器SessionTracker进行会话管理。

9. 初始化Zookeeper的请求处理链。

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

10.注册JMX服务。

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

11.注册Zookeeper服务器实例。

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

8-11步骤在
org.apache.zookeeper.server.ZooKeeperServer#startup中

初始化8-11步

问题

历史文件清理器DatadirCleanupManager

如果把日志清除了,会不会出现server挂了然后恢复不了的情况

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多