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

摘要

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

服务端整体架构如下图

47cb9e6d309d

服务端架构

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

单机版server启动概述

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

47cb9e6d309d

单机版server启动

上图的过程可以分为预启动和初始化过程。

单机版server启动过程详解

预启动

源码主要参照

org.apache.zookeeper.server.quorum.QuorumPeerMain#main

org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun

47cb9e6d309d

预启动

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中

47cb9e6d309d

预启动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中

47cb9e6d309d

预启动步骤6

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

初始化

初始化源码从

org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig开始

包含有

47cb9e6d309d

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中

47cb9e6d309d

初始化的1-4步

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

47cb9e6d309d

初始化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中

47cb9e6d309d

初始化8-11步

问题

历史文件清理器DatadirCleanupManager

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

refer

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值