第四课zookeeper zab协议实现源码分析_第1页
第四课zookeeper zab协议实现源码分析_第2页
第四课zookeeper zab协议实现源码分析_第3页
第四课zookeeper zab协议实现源码分析_第4页
第四课zookeeper zab协议实现源码分析_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程概要:1. 启动流程源码分析2. 快照与事物日志的存储结构一、启动流程知识点:1.工程结构介绍2.启动流程宏观图3.集群启动详细流程4.netty 服务工作机制1.工程结构介绍项目地址:/apache/zookeeper.git分支 tag :3.5.5 zookeeper-recipes: 示例源码 zookeeper-client: C 语言客户端 zookeeper-server:主体源码2.启动宏观流程图: 启动示例演示:服务端:ZooKeeperServerMain客户端:ZooKeeperMain3.集群启动详细流程装载配置:# zookeep

2、er 启动流程堆栈QuorumPeerMain#initializeAndRun /启动工程QuorumPeerConfig#parse / 加载 config 配置QuorumPeerConfig#parseProperties/ 解析 config 配置new DatadirCleanupManager / 构造一个数据清器DatadirCleanupManager#start / 启动定时任务 清除过期的快照代码堆栈 :QuorumPeerMain#main /启动 main 方法QuorumPeerConfig#parse / 加载 zoo.cfg 文件QuorumPeerConfig

3、#parseProperties / 解析配置DatadirCleanupManager#start / 启动定时任务清除日志QuorumPeerConfig#isDistributed / 判断是否为集群模式ServerCnxnFactory#createFactory() / 创建服务默认为 NIO,推荐 netty/*创建 初始化集群管理器*/QuorumPeerMain#getQuorumPeerQuorumPeer#setTxnFactorynew FileTxnSnapLog / 数据文件管理器,用于检测快照与日志文件/* 初始化数据库*/new ZKDatabaseZKDatab

4、ase#createDataTree /创建数据树,所有的节点都会存储在这/ 启动集群:同时启动线程 QuorumPeer#start / QuorumPeer#loadDataBase / 从快照文件以及日志文件 加载节点并填充到dataTree 中去 QuorumPeer#startServerCnxnFactory / 启动 netty 或 java nio 服务,对外开放 2181 端口 Admerver#start/ 启动管理服务,netty http 服务,默认端口是 8080 QuorumPeer#startLeaderElection / 开始执行选举流程 quorumPeer

5、.join() / 防止主进程退出流程说明:1.main 方法启动a.加载 zoo.cfg 配置文件b.解析配置c.创建服务工厂d.创建集群管理线程i.设置数据库文件管理器ii.设置数据库iii.设置设置e.start 启动集群管理线程i.加载数据节点至内存ii.启动 netty 服务,对客户端开放端口iii.启动管理员 Http 服务,默认 8080 端口iv. 启动选举流程f.join 管理线程,防止 main 进程退出4.netty 服务启动流程:服务 UML 类图设置 netty 启动参数-Dzookeeper.serverCnxnFactory=org.apache.zookeepe

6、r.server.NettyServerCnxnFactory初始化:关键代码:#初始化管道流#channelHandler 是一个内部类是具体的消息处理器。protected void initChannel(SocketChannel ch) throws Exception ChannelPipeline pipeline = ch.pipeline();if (secure) initSSL(pipeline);pipeline.addLast(servercnxnfactory, channelHandler);channelHandler 类结构执行堆栈:NettyServerCn

7、xnFactory#NettyServerCnxnFactory/ 初始化 netty 服务工厂 NettyUtils.newNioOrEpollEventLoopGroup / 创建 IO 线程组 NettyUtils#newNioOrEpollEventLoopGroup() / 创建工作线程组ServerBootstrap#childHandler(ty.channel.ChannelHandler) / 添加管道流NettyServerCnxnFactory#start/ 绑定端口,并启动 netty 服务创建连接:每当有客户端新连接进来,就会进入该方法 创建 NettyS

8、erverCnxn 对象。并添加至cnxns 对例执行堆栈CnxnChannelHandler#channelActivenew NettyServerCnxn/ 构建连接器NettyServerCnxnFactory#addCnxn/ 添加至连接器,并根据客户端 IP 进行分组ipMap.get(addr) / 基于 IP 进行分组读取消息:执行堆栈CnxnChannelHandler#channelReadNettyServerCnxn#processMessage / 处理消息NettyServerCnxn#receiveMessage / 接收消息ZooKeeperServer#pro

9、cessPacket /处理消息包org.apache.zookeeper.server.Request / 封装 request 对象org.apache.zookeeper.server.ZooKeeperServer#submitRequest / 提交requestorg.apache.zookeeper.server.RequestProcessor#processRequest / 处理请求二、快照与事务日志存储结构概要:ZK 中所有的数据都是存储在内存中,即 zkDataBase 中。但同时所有对 ZK 数据的变更都会记录到事物日志中,并且当写入到一定的次数就会进行一次快照的生成

10、。已保证数据的备份。其后缀就是 ZXID(唯一事物 ID)。 事物日志:每次增删改,的记录日志都会保存在文件当中 快照日志:存储了在指定时间节点下的所有的数据存储结构:zkDdataBase 是 zk 数据库基类,所有节点都会保存在该类当中,而对 Zk 进行任何的数据变更都会基于该类进行。zk 数据的存储是通过 DataTree 对象进行,其用了一个map 来进行存储。UML 类图:读取快照日志:org.apache.zookeeper.server.SnapshotFormatter读取事物日志:org.apache.zookeeper.server.LogFormatter快照相关配置:快照装载流程:ZooKeeperServer#loadData / 加载数据FileTxnSnapLog#restore / 恢复数据FileSnap#deserialize() / 反序列化数据FileSnap#findNValidSnapshots / 查找有效的快照Util#sortDataDir / 基于后缀排序文件persistence.Util#isValidSnapshot / 验证是否有效快照文件dataLogDir事物日志目录zookeeper.preAllocSiz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论