history.lastCommitedZxid:最近被提交的 Proposal zxid history.oldThreshold:被认为已经太旧的已经提交的 Proposal zxid
文章插图
Zookeeper ZAB协议实现源码启动流程知识点:
- 工程结构介绍
- 启动流程宏观图
- 集群启动详细流程
- netty 服务工作机制
分支tag :3.6.2
- zookeeper-recipes: 示例源码
- zookeeper-client: C语言客户端
- zookeeper-server:主体源码(包含客户端)
文章插图
源码启动:
- 服务端:ZooKeeperServerMain
- 客户端:ZooKeeperMain
为方便阅读 , 以下代码均省略包名集群启动详细流程装载配置:
# zookeeper 启动流程堆栈 >QuorumPeerMain#initializeAndRun //启动工程 >QuorumPeerConfig#parse // 加载config 配置 >QuorumPeerConfig#parseProperties// 解析config配置 >new DatadirCleanupManager // 构造一个数据清器 >DatadirCleanupManager#start // 启动定时任务 清除过期的快照
代码堆栈:>QuorumPeerMain#main //启动main方法 >QuorumPeerConfig#parse // 加载zoo.cfg 文件 >QuorumPeerConfig#parseProperties // 解析配置 >DatadirCleanupManager#start // 启动定时任务清除日志 >QuorumPeerConfig#isDistributed // 判断是否为集群模式 >ServerCnxnFactory#createFactory() // 创建服务默认为NIO , 推荐netty //***创建 初始化集群管理器**/ >QuorumPeerMain#getQuorumPeer >QuorumPeer#setTxnFactory >new FileTxnSnapLog // 数据文件管理器 , 用于检测快照与日志文件 /** 初始化数据库*/ >new ZKDatabase >ZKDatabase#createDataTree //创建数据树 , 所有的节点都会存储在这 // 启动集群:同时启动线程 > QuorumPeer#start // > QuorumPeer#loadDataBase // 从快照文件以及日志文件 加载节点并填充到dataTree中去 > QuorumPeer#startServerCnxnFactory // 启动netty 或java nio 服务 , 对外开放2181 端口 > AdminServer#start// 启动管理服务 , netty http服务 , 默认端口是8080 > QuorumPeer#startLeaderElection // 开始执行选举流程 > quorumPeer.join() // 防止主进程退出
流程说明:- main方法启动
- 加载zoo.cfg 配置文件
- 解析配置
- 创建服务工厂
- 创建集群管理线程
- 设置数据库文件管理器
- 设置数据库
- ....设置设置
- start启动集群管理线程
- 加载数据节点至内存
- 启动netty 服务 , 对客户端开放端口
- 启动管理员Http服务 , 默认8080端口
- 启动选举流程
- join 管理线程 , 防止main 进程退出
文章插图
设置netty启动参数
-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
初始化:关键代码:
#初始化管道流 #channelHandler 是一个内部类是具体的消息处理器 。protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); if (secure) { initSSL(pipeline); } pipeline.addLast("servercnxnfactory", channelHandler);}
channelHandler 类结构文章插图
执行堆栈:
NettyServerCnxnFactory#NettyServerCnxnFactory // 初始化netty服务工厂 > NettyUtils.newNioOrEpollEventLoopGroup // 创建IO线程组 > NettyUtils#newNioOrEpollEventLoopGroup() // 创建工作线程组 >ServerBootstrap#childHandler(io.netty.channel.ChannelHandler) // 添加管道流>NettyServerCnxnFactory#start // 绑定端口 , 并启动netty服务
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 央视|央视网评App用户协议太长:就是不想让用户看明白!
- 浅谈ARP地址解析协议
- 一文领略 HTTP 的前世今生
- 淞沪会战停战协议 淞沪停战协定后上海抗战
- 音视频开发1. 基本概念及媒体协议
- zabbix5.0 配置监控agent, 并通过微信接收报警
- IP 通俗易懂网络协议
- https ssl 请求过程详解
- rtsp协议之dss服务器与vlc服务器比较
- rtsp协议之dss搭建rtsp服务器