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

创建连接:
每当有客户端新连接进来 , 就会进入该方法 创建 NettyServerCnxn对象 。并添加至cnxns队列
执行堆栈
CnxnChannelHandler#channelActive >new NettyServerCnxn        // 构建连接器>NettyServerCnxnFactory#addCnxn     // 添加至连接器 , 并根据客户端IP进行分组 >ipMap.get(addr) // 基于IP进行分组读取消息:
执行堆栈
CnxnChannelHandler#channelRead>NettyServerCnxn#processMessage //  处理消息  >NettyServerCnxn#receiveMessage // 接收消息  >ZooKeeperServer#processPacket //处理消息包   >org.apache.zookeeper.server.Request // 封装request 对象    >org.apache.zookeeper.server.ZooKeeperServer#submitRequest // 提交request       >org.apache.zookeeper.server.RequestProcessor#processRequest // 处理请求快照与事务日志存储结构概要ZK中所有的数据都是存储在内存中 , 即zkDataBase中 。但同时所有对ZK数据的变更都会记录到事务日志中 , 并且当写入到一定的次数就会进行一次快照的生成 。已保证数据的备份 。其后缀就是ZXID(唯一事务ID) 。

  • 事务日志:每次增删改 , 的记录日志都会保存在文件当中
  • 快照日志:存储了在指定时间节点下的所有的数据
存储结构zkDdataBase 是zk数据库基类 , 所有节点都会保存在该类当中 , 而对Zk进行任何的数据变更都会基于该类进行 。zk数据的存储是通过DataTree 对象进行 , 其用了一个map 来进行存储 。
Zookeeper ZAB协议实现源码分析

文章插图
 
UML 类图:
Zookeeper ZAB协议实现源码分析

文章插图
 
读取快照日志:
org.apache.zookeeper.server.SnapshotFormatter读取事务日志:
org.apache.zookeeper.server.LogFormatter快照相关配置 
Zookeeper ZAB协议实现源码分析

文章插图
 
快照装载流程>ZooKeeperServer#loadData // 加载数据>FileTxnSnapLog#restore // 恢复数据>FileSnap#deserialize() // 反序列化数据>FileSnap#findNValidSnapshots // 查找有效的快照  >Util#sortDataDir // 基于后缀排序文件



推荐阅读