Zookeeper ZAB协议实现源码分析( 五 )


history.lastCommitedZxid:最近被提交的 Proposal zxid history.oldThreshold:被认为已经太旧的已经提交的 Proposal zxid

Zookeeper ZAB协议实现源码分析

文章插图
 
Zookeeper ZAB协议实现源码启动流程知识点:
  1. 工程结构介绍
  2. 启动流程宏观图
  3. 集群启动详细流程
  4. netty 服务工作机制
工程结构介绍项目地址:https://github.com/Apache/zookeeper.git
分支tag :3.6.2
  • zookeeper-recipes: 示例源码
  • zookeeper-client: C语言客户端
  • zookeeper-server:主体源码(包含客户端)
启动宏观流程图
Zookeeper ZAB协议实现源码分析

文章插图
 
源码启动:
  • 服务端: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()  // 防止主进程退出流程说明:
  1. main方法启动
  2. 加载zoo.cfg 配置文件
  3. 解析配置
  4. 创建服务工厂
  5. 创建集群管理线程
  6. 设置数据库文件管理器
  7. 设置数据库
  8. ....设置设置
  9. start启动集群管理线程
  10. 加载数据节点至内存
  11. 启动netty 服务 , 对客户端开放端口
  12. 启动管理员Http服务 , 默认8080端口
  13. 启动选举流程
  14. join 管理线程 , 防止main 进程退出
netty 服务启动流程服务UML类图
Zookeeper ZAB协议实现源码分析

文章插图
 
设置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 类结构
Zookeeper ZAB协议实现源码分析

文章插图
 
执行堆栈:
NettyServerCnxnFactory#NettyServerCnxnFactory  // 初始化netty服务工厂  > NettyUtils.newNioOrEpollEventLoopGroup  // 创建IO线程组  > NettyUtils#newNioOrEpollEventLoopGroup()  // 创建工作线程组  >ServerBootstrap#childHandler(io.netty.channel.ChannelHandler) // 添加管道流>NettyServerCnxnFactory#start    // 绑定端口 , 并启动netty服务


推荐阅读