zookeeper源码 — 一、单机启动
2024-10-12 02:59:03
说明: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的集群启动流程。
最新文章
- C#学习笔记---Dispose(),Finalize(),SuppressFinalize
- 浅析敏感词过滤算法(C++)
- exception throw in progress runner thread_VS2015中SVN源代码无说明提交异常
- Scalaz(8)- typeclass:Monoid and Foldable
- 【BZOJ 1178】【APIO 2009】CONVENTION会议中心
- 何为.Net Remoting【转】
- 编译QT时出现lib/libQtGui.so: undefined reference to `ts_read_raw'的解决办法
- 后台动态设置前台标签内容和属性(转自http://www.wzsky.net/html/Program/net/26171.html)
- Codeforces Round #130 (Div. 2) A. Dubstep
- Unity 2D 跑酷道路动起来
- Android清除缓存功能来实现
- 在Ubuntu上安装Docker
- shell快捷键
- 解决android studio引用远程仓库下载慢(JCenter下载慢)
- SpringBoot配置mybatis
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(四) -- 安装bitbucket 5.7.0
- linux ln 命令使用参数详解(ln -s 软链接)
- Spring Security的核心拦截器
- bresenhan算法数学推导
- MaC 修改MySQL密码
热门文章
- Scrapy爬取豆瓣电影top250的电影数据、海报,MySQL存储
- 条件随机场CRF(三) 模型学习与维特比算法解码
- ThreadPoolExcuter源码解析(一)
- spring boot之从零开始开发自己的网站
- Spring Boot实战笔记(三)-- Spring常用配置(Bean的初始化和销毁、Profile)
- PAT1049:Counting Ones
- webpack + vue 在dev和production模式下的小小区别
- matplotlib使用时报错RuntimeError: Python is not installed as a framework(一)
- LeetCode Javascript实现 100. Same Tree 171. Excel Sheet Column Number
- Eureka-服务注册与发现组件