3 ZooKeeper序列化和网络通信协议详解

序列化机制 zookeeper. jute 包 0:23:00 0:33:00

4个类 (Record InputArchive OutputArchive Index)

持久化机制 zookeeper.server.persistence 包 0:33:00 ~ 0:46:00

zookeeper本身是一个 leader, follower 对等架构(内部选举 leader)
每个节点上都保存了整个系统的所有数据
每个节点上的都把数据放在磁盘一份,放在内存一份

5个类 ( Txnlog SnapShot FileSnap FileTxnlog FileTxnSnaplog )

网络通信框架和 监听机制 apache.zookeeper.server 包 0:46:00 ~ 0:57 :00

2个类 (ClientCnxn ServerCnxn)

image

监听机制 (Watcher Watcher Manager WatchedEvent(KeeperState EventType ) )

image

Watcher,接口类型,其定义了process方法,需子类实现。
Event,接口类型,Watcher的内部类,无任何方法。
KeeperState,枚举类型,Event的内部类,表示Zookeeper所处的状态。
EventType,枚举类型,Event的内部类,表示Zookeeper中发生的事件类型。
WatchedEvent,表示对ZooKeeper上发生变化后的反馈,包含了KeeperState和EventType。
ClientWatchManager,接口类型,表示客户端的Watcher管理者,其定义了materialized方法,需子类实现。
ZKWatchManager,Zookeeper的内部类,继承ClientWatchManager。
MyWatcher,ZooKeeperMain的内部类,继承Watcher。
ServerCnxn,接口类型,继承Watcher,表示客户端与服务端的一个连接。
WatchManager,管理Watcher。

4 源码分析

4.1 服务启动 0:59 :00 ~ 2:50:00

入口:\apache\zookeeper\server\quorum\QuorumPeerMain

main 方法——》

QuorumPeer类的 start()

4大步骤:

4.1.1 装载数据 0:59 :00 ~ 1:57:00
/**
* 刚启动的时候,需要加载数据库, 从磁盘中的 数据快照文件 和 comitted logs 中恢复
* 涉及到的核心类是 ZKDatabase,并借助于 FileTxnSnapLog 工具类将 snap 和 transaction log
* 反序列化到内存中,最终构建出内存数据结构 DataTree。
* 总结:从事务日志目录dataLogDir和数据快照目录dataDir中恢复出DataTree数据
* 涉及到的核心类是ZKDatabase,并借助于FileTxnSnapLog工具类将snap和transaction log反序列化到内存中,最终构建出内存数据结构DataTree
*/loadDataBase();

返回最大事务 zxid

4.1.2 准备通信连接 1:57:00 ~ 2:07:00
/**
* 服务连接:开启对客户端的连接端口,启动ServerCnxnFactory主线程
* ServerCnxnFactory的作用:构建reactor模型的EventLoop,Selector每隔1秒执行一次select方法来处理IO请求,
* 并分发到对应的代表该客户端的ServerCnxn中并利用doIO进行处理
* NIOServerCnxnFactory 负责 创建 ServerCnxn 负责和客户端进行数据读写通信的
* 调用这句代码的时候,跳转到 new ZooKeeperThread(this).start()
* this = cnxnFactory
* 跳转到自己的 run 方法
*/cnxnFactory.start();    // 卡住了
4.1.3 选举 2:07:00 ~ 2:24:00

利用最大事务 zxid

/**

  • 开始选举, 这儿并不是真正的选举,而是只是初始化选举需要的各种组件
    */

startLeaderElection();

/**

  • TODO_MA 到此为止,一定要记得:
  • 1、FastLeaderElection 的 WorkerReceiver 和 WorkerSender 都启动好了。
  • 2、QuorumCnxManager 的 Listen监听 也启动好了,等待有其他 Server 的链接的话,就会创建成对的 RecvWorker 和 SendWorker
    /
    /
    *
  • 线程启动 跳转到 run() 方法。
  • 记得,上面的代码执行完了之后,会跳转到 run() 方法。 因为 QuorumPeer 是一个线程!
  • 启动QuorumPeer线程,在该线程中进行服务器状态的检查
    */

super.start();

#### 4.5 启动过程图
![image.png](https://upload-images.jianshu.io/upload_images/11332520-92696c2b1a54d718.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)#### 选举机制

http://www.taodudu.cc/news/show-3857955.html

相关文章:

  • 软考之系统架构设计师
  • 用matplotlib.pyplot实现正态分布函数的图像绘制
  • 转载-高斯函数-正态分布函数
  • python 经验函数分布图 正态分布函数曲线拟合
  • 正态分布函数概率运算dnorm/pnrom/qnrom/rnorm
  • R的正态分布函数
  • 【无标题】matlab正态分布函数积分
  • python正态分布函数_如何在Python中计算正态分布函数和gamma累积分布函数的逆函数?,scipy,python,中正,伽马,反函数...
  • 用c语言编写正态分布函数,C / C ++中的累积正态分布函数
  • mysql 正态分布函数_C++ normal_distribution高斯正态分布函数用法详解
  • 正态分布函数
  • 关于什么是大研发的一点思考
  • python画出热力图,热力图数值,修改字体,字体大小等
  • 老鼠爱大me
  • c语言编程题狗熊掰棒子,狗熊掰棒子:掰一棒扔一棒
  • 最大连续子序列和问题
  • 北京邮电大学计算机学院复试成绩,北京邮电大学出考研复试结果,初试389分被刷,复试成绩差距大!...
  • spring大文件分块上传原理解析2
  • 学习C++的笔记(算法与数据结构要求(2)(我不是黑瞎子掰棒子
  • poj2226 Muddy Fields 填充棒子(二分匹配)
  • 程序员大牛养成之路
  • 狗熊掰棒子及井底之蛙
  • 乐于助人是精力旺盛的体现
  • 棒子老虎鸡
  • 上大学与不上大学的区别
  • 让服务器系统瘫痪,简单的方法 让棒子的服务器瘫痪 圣战的进来!
  • 搜索例题讲解--小木棍
  • 干货!鲁棒彩票现象:藏在随机初始化神经网络中的鲁棒子网络
  • 注入棒子国某网站
  • 棒子国考察报告

架构师3- zk源码分析相关推荐

  1. P8架构师:看源码是Java高级程序员的必经之路

    今天笔者在这里给大家介绍一下程序员的内功,内功修炼的内容就与之前文章中的技术内容大致相似,但是,那些技术不是说你想学就能学会的,如果你只是写了几年的业务代码,不对源码加以分析,那么你永远只是停留在码农 ...

  2. 首发,看了这份美团架构师的spring源码笔记后,才发现原来学习的思路都错了

    前言 Spring让我们可以更快,更轻松,更安全地进行Java编程.Spring对速度,简单性和生产率的关注使其成为世界上最受欢迎的Java框架. 像阿里巴巴,亚马逊,微软等在内的所有科技巨头对Spr ...

  3. java bean参数清空_Java互联网架构-Spring IOC底层源码分析

    欢迎关注头条号:java小马哥 周一至周日早九点半!下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 spring ioc是spring的核心之一,也是spring体系的基础,那 ...

  4. Flume 1.7 源码分析(二)整体架构

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  5. Flume 1.7 源码分析(五)从Channel获取数据写入Sink

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  6. Flume 1.7 源码分析(四)从Source写数据到Channel

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  7. Flume 1.7 源码分析(三)程序入口

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  8. Flume 1.7 源码分析(一)源码编译

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 1 说明 Flume是Cloudera提供的一个高可用的,高可靠的, ...

  9. apache dubbo 源码分析系列汇总

    Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...

  10. 终于拿到了阿里P8架构师分享的JCF和JUC源码分析与实现笔记java岗

    时代的一粒尘,落在每个人身上,就是一座山". 时代更迭变换,我们好像都知道今天与昨天不同,又好像肉眼看不出哪里不同. 但其实它就正在以各种各样的方式体现在每一个普通人身上. 疫情爆发三个月的 ...

最新文章

  1. timesten 修改最大连接数
  2. 不会用Photoshop抠图?Mask R-CNN助你一键“除”人
  3. 50岁,他希望自己还可以写代码
  4. r语言和metawin_Windows下使用Rtools编译R语言包
  5. PHP+MySql+jQuery实现的“顶”和“踩”投票功能
  6. 源码分析参考:Pipelines
  7. POJ 3107 - Godfather
  8. bootstrapr表格父子框_JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)...
  9. php中数组的指针函数参数传递参数,循环语句、函数的参数及作用域、数组键值及指针操作函数(8月23日作业)...
  10. 初学WCF,一个简单的示例(增删改查,实体类)
  11. 深度学习 和 技术开锁
  12. 将坐标系统保存为一个文件.prj
  13. vue中获取本地内网ip
  14. 配置“终端服务器授权”激活许可证服务器(转)
  15. 2.3 构建C语言入职教程
  16. excel怎么调用c语言程序设计,知识:Excel使用C语言进行读写,代码简单易懂
  17. 360度全景标定方法_全景摄像机标定方法综述
  18. 计算机中分页符号是什么,电脑word文档中分页符如何插入
  19. 接口开发及技术负责人的职责随笔
  20. Oracle数据库账号被锁了怎么解锁

热门文章

  1. 视频:三亚行-乘风破浪会有时
  2. 十.控制文件指针移动,文本的修改
  3. 2021年马边高考成绩查询,2021年马边中考分数线查询
  4. STM32F103ZET6新建标准库的工程
  5. 淘晶驰 usart hmi( 串口屏)介绍
  6. 如何禁止瓦次普将你的账号信息与脸书共享?
  7. “脸书版微信”即将出炉!腾讯脸书,前浪后浪一起浪?
  8. Tomcat 在 IDEAJ 编辑器中乱码问题
  9. 虚拟机安装Ubuntu网络无法连接,右上角网络图标不见
  10. vue中的input使用e.target.value赋值的问题