架构师3- zk源码分析
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)
监听机制 (Watcher Watcher Manager WatchedEvent(KeeperState EventType ) )
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源码分析相关推荐
- P8架构师:看源码是Java高级程序员的必经之路
今天笔者在这里给大家介绍一下程序员的内功,内功修炼的内容就与之前文章中的技术内容大致相似,但是,那些技术不是说你想学就能学会的,如果你只是写了几年的业务代码,不对源码加以分析,那么你永远只是停留在码农 ...
- 首发,看了这份美团架构师的spring源码笔记后,才发现原来学习的思路都错了
前言 Spring让我们可以更快,更轻松,更安全地进行Java编程.Spring对速度,简单性和生产率的关注使其成为世界上最受欢迎的Java框架. 像阿里巴巴,亚马逊,微软等在内的所有科技巨头对Spr ...
- java bean参数清空_Java互联网架构-Spring IOC底层源码分析
欢迎关注头条号:java小马哥 周一至周日早九点半!下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 spring ioc是spring的核心之一,也是spring体系的基础,那 ...
- Flume 1.7 源码分析(二)整体架构
Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...
- Flume 1.7 源码分析(五)从Channel获取数据写入Sink
Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...
- Flume 1.7 源码分析(四)从Source写数据到Channel
Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...
- Flume 1.7 源码分析(三)程序入口
Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...
- Flume 1.7 源码分析(一)源码编译
Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 1 说明 Flume是Cloudera提供的一个高可用的,高可靠的, ...
- apache dubbo 源码分析系列汇总
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...
- 终于拿到了阿里P8架构师分享的JCF和JUC源码分析与实现笔记java岗
时代的一粒尘,落在每个人身上,就是一座山". 时代更迭变换,我们好像都知道今天与昨天不同,又好像肉眼看不出哪里不同. 但其实它就正在以各种各样的方式体现在每一个普通人身上. 疫情爆发三个月的 ...
最新文章
- timesten 修改最大连接数
- 不会用Photoshop抠图?Mask R-CNN助你一键“除”人
- 50岁,他希望自己还可以写代码
- r语言和metawin_Windows下使用Rtools编译R语言包
- PHP+MySql+jQuery实现的“顶”和“踩”投票功能
- 源码分析参考:Pipelines
- POJ 3107 - Godfather
- bootstrapr表格父子框_JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)...
- php中数组的指针函数参数传递参数,循环语句、函数的参数及作用域、数组键值及指针操作函数(8月23日作业)...
- 初学WCF,一个简单的示例(增删改查,实体类)
- 深度学习 和 技术开锁
- 将坐标系统保存为一个文件.prj
- vue中获取本地内网ip
- 配置“终端服务器授权”激活许可证服务器(转)
- 2.3 构建C语言入职教程
- excel怎么调用c语言程序设计,知识:Excel使用C语言进行读写,代码简单易懂
- 360度全景标定方法_全景摄像机标定方法综述
- 计算机中分页符号是什么,电脑word文档中分页符如何插入
- 接口开发及技术负责人的职责随笔
- Oracle数据库账号被锁了怎么解锁
热门文章
- 视频:三亚行-乘风破浪会有时
- 十.控制文件指针移动,文本的修改
- 2021年马边高考成绩查询,2021年马边中考分数线查询
- STM32F103ZET6新建标准库的工程
- 淘晶驰 usart hmi( 串口屏)介绍
- 如何禁止瓦次普将你的账号信息与脸书共享?
- “脸书版微信”即将出炉!腾讯脸书,前浪后浪一起浪?
- Tomcat 在 IDEAJ 编辑器中乱码问题
- 虚拟机安装Ubuntu网络无法连接,右上角网络图标不见
- vue中的input使用e.target.value赋值的问题