说明:zookeeper系列是基于3.6.0版本的

zookeeper一般使用命令工具启动,启动主要就是初始化所有组件,让server可以接收并处理来自client的请求。本文主要结构:

  • main入口
  • 配置解析
  • 组件启动

main入口

我们一般使用命令行工具来部署zk server,zkServer.sh,这个脚本用来启动停止server,通过不同的参数和选项来达到不同的功能。该脚本最后会通过Java执行下面的main方法

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

不管单机还是集群都是使用zkServer.sh这个脚本来启动,只是参数不同,所以main方法入口也是一样的。所以这个入口方法主要是根据不同的入参判断是集群启动还是单机启动。

该main方法主要做了以下几件事

  1. 解析配置,如果传入的是配置文件(参数只有一个),解析配置文件并初始化QuorumPeerConfig
  2. 启动清理文件的线程
  3. 判断是单机还是集群
    1. 集群:只有一个参数,并且配置了多个server
    2. 单机:上面的条件不满足,一般在启动的使用了以下两种配置的一种
      1. 使用的是文件配置,但是没有配置多台server
      2. 命令行配置多个(2-4)参数:port dataDir [tickTime] [maxClientCnxns]

配置解析

配置解析主要有两种情况

  1. 使用配置文件
  2. 使用命令行参数

使用配置文件

使用配置文件的时候是使用QuorumPeerConfig来解析配置的

  1. 先校验文件的合法性
  2. 配置文件是使用Java的properties形式写的,所以可以通过Properties.load来解析
  3. 将解析出来的key、value赋值给对应的配置

使用命令行参数

直接在命令指定对应的配置,这种情况只有在单机的时候才会使用,包含以下几个参数

  • port,必填,sever监听的端口
  • dataDir,必填,数据所在的目录
  • tickTime,选填
  • maxClientCnxns,选填,最多可处理的客户端连接数

组件启动

zookeeper包含的主要组件有

  • FileTxnSnapLog:管理FileTxLog和FileSnap
  • ZooKeeperServer:维护一个处理器链表processor chain
  • NIOServerCnxnFactory:管理来自客户端的连接
  • Jetty,用来通过http管理zk

zookeeper维护了自己的数据结构和物理文件,而且要接收并处理client发送来的网络请求,所以在zookeeper启动的时候,要做好下面的准备工作

  1. 初始化FileTxnSnapLog,创建了FileTxnLog实例和FIleSnap实例,并保存刚启动时候DataTree的snapshot
  2. 启动adminServer
  3. 启动NIOServerCnxnFactory
    1. 从解析出的配置中配置NIOServerCnxnFactory
    2. 初始化网络连接管理类:NIOServerCnxnFactory
      1. 初始化:WorkerService:用来业务处理的线程池
      2. 线程启动:

        SelectorThread(有多个):处理网络请求,write和read

        AcceptThread:用来接收连接请求,建立连接,zk也支持使用reactor多线程,accept线程用来建立连接,selector线程用来处理read、write

        ConnectionExpirerThread:关闭超时的连接,所有的session都放在org.apache.zookeeper.server.ExpiryQueue#expiryMap里面维护,这个线程不断从里面拿出超时的连接关闭
    3. 启动ZookeeperServer,主要是用来创建SessionTrackerImpl,这个类是用来管理session的

总结

单机模式部署较为简单,一般在开发、测试环境使用,由于单机环境需要的组件少,启动过程也较为简单,主要是解析传入的参数,然后启动对应的网络组件和请求处理组件,后面紧接着我们看下zk的集群启动流程。

zookeeper源码 — 一、单机启动的更多相关文章

  1. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  2. Zookeeper源码(启动+选举)

    简介 关于Zookeeper,目前普遍的应用场景基本作为服务注册中心,用于服务发现.但这只是Zookeeper的一个的功能,根据Apache的官方概述:"The Apache ZooKeep ...

  3. Zookeeper 源码分析-启动

    Zookeeper 源码分析-启动 博客分类: Zookeeper   本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. Zookeeper 源码(七)请求处理

    Zookeeper 源码(七)请求处理 以单机启动为例讲解 Zookeeper 是如何处理请求的.先回顾一下单机时的请求处理链. // 单机包含 3 个请求链:PrepRequestProcessor ...

  6. Zookeeper 源码(四)Zookeeper 服务端源码

    Zookeeper 源码(四)Zookeeper 服务端源码 Zookeeper 服务端的启动入口为 QuorumPeerMain public static void main(String[] a ...

  7. 【ZooKeeper系列】3.ZooKeeper源码环境搭建

    前文阅读: [ZooKeeper系列]1.ZooKeeper单机版.伪集群和集群环境搭建 [ZooKeeper系列]2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了Zo ...

  8. Zookeeper源码解读

    1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...

  9. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  10. Zookeeper 源码(六)Leader-Follower-Observer

    Zookeeper 源码(六)Leader-Follower-Observer 上一节介绍了 Leader 选举的全过程,本节讲解一下 Leader-Follower-Observer 服务器的三种角 ...

随机推荐

  1. 安装JDK,配置环境变量

    计算机(右键)-属性-高级系统设置-环境变量1.新建系统变量 : JAVA_HOMEC:\Program Files (x86)\Java\jdk1.6.0_10(你的JDK安装路径)2.在系统变量p ...

  2. Servlet线程

    一,servlet容器如何同时处理多个请求. Servlet采用多线程来处理多个请求同时访问,Servelet容器维护了一个线程池来服务请求.线程池实际上是等待执行代码的一组线程叫做工作者线程(Wor ...

  3. CentOS7搭建LAMP实战

    环境配置从官网下载稳定的源码包解压预编译编译编译安装启动服务 环境配置 # yum install -y vim wget links //安装一下基本工具# systemctl stop firew ...

  4. Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照

    前言 光学中,我们是用辐射度来量化光. 光照按照不同的散射方向分为:漫反射(diffuse)和高光反射(specular).高光反射描述物体是如何反射光线的,漫反射则表示有多少光线会被折射.吸收和散射 ...

  5. java 修饰符的访问权限

    private,public,protected,默认不写(firendly) 1.Class类的访问权限: public:可以供所有的类访问. 默认:默认可以称为friendly但是,java语言中 ...

  6. java内部类(转)

    转自:http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 ...

  7. spring boot sso

    https://hellokoding.com/hello-single-sign-on-sso-with-json-web-token-jwt-spring-boot/ https://github ...

  8. box-shadow 详解及示例

    box-shadow  [bɑks] - [ˈʃædoʊ]   英文示意: box:盒,包厢 shadow:阴影,渐变   定义: box-shadow: none | <shadow> ...

  9. Python实现控制台密码星号输入

    import msvcrt, sys, os print('password: ', end='', flush=True) li = [] while 1: ch = msvcrt.getch() ...

  10. Centos7下安装PHP5.5,5.6,7.0----(转载记录一下)

    由于centOS7 默认的php版本是5.4的,偏低,所以收录了一下怎样安装5.5/5.6/7.0版本 默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的 ...