zookeeper源码 — 一、单机启动
说明: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方法主要做了以下几件事

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

- 先校验文件的合法性
- 配置文件是使用Java的properties形式写的,所以可以通过Properties.load来解析
- 将解析出来的key、value赋值给对应的配置
使用命令行参数
直接在命令指定对应的配置,这种情况只有在单机的时候才会使用,包含以下几个参数
- port,必填,sever监听的端口
- dataDir,必填,数据所在的目录
- tickTime,选填
- maxClientCnxns,选填,最多可处理的客户端连接数
组件启动
zookeeper包含的主要组件有
- FileTxnSnapLog:管理FileTxLog和FileSnap
- ZooKeeperServer:维护一个处理器链表processor chain
- NIOServerCnxnFactory:管理来自客户端的连接
- Jetty,用来通过http管理zk
zookeeper维护了自己的数据结构和物理文件,而且要接收并处理client发送来的网络请求,所以在zookeeper启动的时候,要做好下面的准备工作

- 初始化FileTxnSnapLog,创建了FileTxnLog实例和FIleSnap实例,并保存刚启动时候DataTree的snapshot
- 启动adminServer
- 启动NIOServerCnxnFactory
- 从解析出的配置中配置NIOServerCnxnFactory
- 初始化网络连接管理类:NIOServerCnxnFactory
- 初始化:WorkerService:用来业务处理的线程池
- 线程启动:
SelectorThread(有多个):处理网络请求,write和read
AcceptThread:用来接收连接请求,建立连接,zk也支持使用reactor多线程,accept线程用来建立连接,selector线程用来处理read、write
ConnectionExpirerThread:关闭超时的连接,所有的session都放在org.apache.zookeeper.server.ExpiryQueue#expiryMap里面维护,这个线程不断从里面拿出超时的连接关闭
- 启动ZookeeperServer,主要是用来创建SessionTrackerImpl,这个类是用来管理session的
总结
单机模式部署较为简单,一般在开发、测试环境使用,由于单机环境需要的组件少,启动过程也较为简单,主要是解析传入的参数,然后启动对应的网络组件和请求处理组件,后面紧接着我们看下zk的集群启动流程。
zookeeper源码 — 一、单机启动的更多相关文章
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- Zookeeper源码(启动+选举)
简介 关于Zookeeper,目前普遍的应用场景基本作为服务注册中心,用于服务发现.但这只是Zookeeper的一个的功能,根据Apache的官方概述:"The Apache ZooKeep ...
- Zookeeper 源码分析-启动
Zookeeper 源码分析-启动 博客分类: Zookeeper 本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- Zookeeper 源码(七)请求处理
Zookeeper 源码(七)请求处理 以单机启动为例讲解 Zookeeper 是如何处理请求的.先回顾一下单机时的请求处理链. // 单机包含 3 个请求链:PrepRequestProcessor ...
- Zookeeper 源码(四)Zookeeper 服务端源码
Zookeeper 源码(四)Zookeeper 服务端源码 Zookeeper 服务端的启动入口为 QuorumPeerMain public static void main(String[] a ...
- 【ZooKeeper系列】3.ZooKeeper源码环境搭建
前文阅读: [ZooKeeper系列]1.ZooKeeper单机版.伪集群和集群环境搭建 [ZooKeeper系列]2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了Zo ...
- Zookeeper源码解读
1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- Zookeeper 源码(六)Leader-Follower-Observer
Zookeeper 源码(六)Leader-Follower-Observer 上一节介绍了 Leader 选举的全过程,本节讲解一下 Leader-Follower-Observer 服务器的三种角 ...
随机推荐
- JDK安装:CentOS和Windows环境
Windows上JDK安装 1:下载jdk. 地址在 http://www.oracle.com/index.html >downloads>se>Ja ...
- 用Maven实现一个protobuf的Java例子
注:试验环境在Mac Idea环境下 1. 介绍Protocol Buffers Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化.反序列化,常用于RP ...
- Flask入门之SQLAlchemy数据库连接操作(第15讲)
一.库安装 Flask-SQLAlchemy 2 SQLAlchemy 1.0.8 二.进入venv 三.切换到项目Sample\ 文件夹,进入manager.py 的shell python man ...
- python访问mysql
1,下载mysql-connector-python-2.0.4 pythoin访问mysql需要有客户端,这个就是连接mysql的库 解压后如下图: 双击lib 以windows为例 把mysql ...
- 洛谷 P1272 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- python_集合
>>> import random>>> import time>>> x=list(range(10000))>>> y=se ...
- IntelliJ IDEA maven 构建简单springmvc项目
环境: apache-tomcat-8.5.15 jdk1.8.0_172 IDEA 建立一个maven-webapp项目:Create New Project 后点击next 然后next 可以选择 ...
- Tomcat 调优方案
Tomcat的默认配置,性能并不是最优的,我们可以通过优化tomcat以此来提高网站的并发能力.提高Tomcat的性能可以分为两个方向. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有 ...
- C++之Binary Heap/Max Heap
#include <iostream> #include <time.h> #include <random> using namespace std; //Bin ...
- 【基于url权限管理 shiro(一)】--基础
只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分. 用户认证 1.概 ...