我读zookeeper源码系列1

2023-11-02

一,准备工作

1,zookeeper版本

01、zookeeper-3.4.x 企业最常用,大数据技术组件最常用,基本维持在 3.4.5 3.4.6 3.4.7 这几个版本 
02、zookeeper-3.5.x 
03、zookeeper-3.6.x 
04、zookeeper-3.7.x

源码项目注意:zookeeper-3.4.14.tar.gz,安装包就是源码包,ZooKeeper-3.5 以上,源码 和 安装包就分开了。

整体的原则:不新不旧的稳定版本 + 考虑企业使用版本

最终结论:选择性能得到极大提高,代码封装做的更好的最新稳定版本:ZooKeeper-3.6.3

2,zookeeper的三大基础设施

2.1,序列化

zookeeper不可避免的涉及到数据的网络传输和磁盘持久化,持久化必须先序列化。

大数据领域常用的序列化方案可以分为三种:

  • java自带的序列化机制
  • 自定义的序列化机制,如Hadoop的序列化avro,zookeeper的序列化机制
  • google的protobuf

2.2,持久化

如果zookeeper的数据仅仅存储在内存中,显然是不够安全的,有必要把内存中的数据在磁盘中也保持一份,内存到磁盘的过程称之为持久化。

说的持久化,就必须要了解zookeeper的数据模型结构,要点如下:

  • LSM结构
  • 数据存储在内存NodeTree中
  • 定时快照(全量、增量)持久化到磁盘
  • ZKDataBase,zookeeper内部的数据库

zookeeper首先将数据顺序写入磁盘日志文件,之后写入内存数结构(NodeTree)中,所以需要写日志的功能和维护NodeTree的功能。
内存中的数据会定时快照snapshot,需要写磁盘的功能。

zookeeper提高了两个抽象来完成这些功能:

  • TxnLog,事务性日志的操作接口,负责写入操作日志和内存树
  • SnapShot,快照接口,负责持久化内存数据到磁盘

ZKDataBase将以上功能封装好提供给外部使用。

伪代码展示:

class ZKDataBase{ 
	protected DataTree dataTree; 
	protected FileTxnSnapLog snapLog; 
}

class DataTree{ 

	//根节点 
	private static final String rootZookeeper = "/"; 
	
	// 所有节点的 路径 和 节点抽象的 映射 
	private final NodeHashMap nodes = new NodeHashMapImpl(digestCalculator){ 
		private final ConcurrentHashMap<String, DataNode> nodes; 
	} 
}

public class DataNode implements Record { 
     byte[] data; 
     private Set<String> children = null; 
}

class FileTxnSnapLog{ 
   TxnLog txnLog; 
   SnapShot snapLog; 
}
 
interface TxnLog{ 
	void rollLog() throws IOException; 
	boolean append(TxnHeader hdr, Record r) throws IOException; boolean truncate(long zxid) throws IOException; 
	void commit() throws IOException; 
}
 
interface SnapShot{ 
	long deserialize(DataTree dt, Map<Long, Integer> sessions) throws IOException; 
	void serialize(DataTree dt, Map<Long, Integer> sessions, File name, boolean fsync) throws IOException; 
}

2.3,网络通信

在这里插入图片描述
看起来很复杂,梳理一下思路,zookeeper的通信需求分为三类:

  • 选举,选举服务端和选举客户端的通信,所有节点都有
  • 数据同步,同步服务端和客户端的通信,服务端在leader启动,其他节点启动客户端
  • 读写服务,读写服务端,所有节点都有,非leader节点也可以接受写请求,不过其会将写请求转发到leader

三,三个方面读ZooKeeper的源码

  • 第—点:关于ZooKeeper服务节点启动

1、集群启动脚本分析:zkserver.sh start
2、集群启动的启动类的代码执行分析:QuorumPeerMain.main()
3、冷启动数据恢复,从磁盘恢复数据到内存:zkDatabase. loadDatabase()
4、 选举:startLeaderElection() + Quorumpeer. lookForLeader()
5、 同步:follower. followLeader() + observer. observerLeader()

  • 第二点:ZooKeeper集群正常接受客户端的读写处理

1、 ZooKeeper zk = new ZooKeeper(“bigdata02:2181”, 4000, watcher)
2、zk.create(节点路径,节点数据 )
3、zk.getData(节点路径,…)

  • 第三点:额外补充知识

1、 Session管理
2、 Watcher管理和响应

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我读zookeeper源码系列1 的相关文章

随机推荐

  • pywt 安装学习

    安装 conda install c conda forge pywavelets github地址 里面有demo https github com PyWavelets pywt 这个是学习笔记 https blog csdn net
  • UPC--扑克牌

    题目描述 从一副含有n n 10000 张的扑克牌 显然每张扑克牌都不相同 中 分给m m 100 个人 第i个人得到ai 0 ai 100 张牌 求一共有几种分法 这个数可能非常大 请输出此数模10007后的结果 输入 第一行两个整数 为
  • HDU1874 单源最短路经 dijkstra或者floyd

    include
  • 3、域渗透详解

    在渗透测试过程中 我们经常会遇到以下场景 某处于域中的服务器通过路由做端口映射 对外提供web服务 我们通过web脚本漏洞获得了该主机的system权限 如果甲方有进一步的内网渗透测试需求 以证明企业所面临的巨大风险 这个时候就需要做内网的
  • 模拟IC应届生都这么牛,我想到了崩溃

    再过两个月就到学弟学妹找工作的高峰期了 做为一个2007年的毕业生 能为学弟学妹做的 就是把我去年到今年找工作的经历和经验与他们分享 希望大家都能找到合适的工作 因为本人是模拟ic设计方向的 所以只能介绍些模拟ic设计方面的找工作经验 其实
  • SVM如何避免过拟合

    过拟合 Overfitting 表现为在训练数据上模型的预测很准 在未知数据上预测很差 过拟合主要是因为训练数据中的异常点 这些点严重偏离正常位置 我们知道 决定SVM最优分类超平面的恰恰是那些占少数的支持向量 如果支持向量中碰巧存在异常点
  • pyside6中QcommandLinkButton 控件qss有哪些用法和案例

    QCommandLinkButton 是 Qt GUI 框架中的一个功能按钮类 而 Qt Style Sheets QSS 提供了一种强大的方式来自定义 Qt 控件的外观 以下是 QCommandLinkButton 常用的 QSS 用法
  • 比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东

    雷递网 雷建平 4月1日报道 2022年1月底刚刚过会的比亚迪半导体上市再生波折 于2022年3月31日的审核再度被中止 这不是比亚迪半导体IPO审核第一次被深交所中止 2021年8月8日 因律师北京市天元律师事务所被中国证监会立案调查 比
  • [从零开始学DeepFaceLab-16]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - SAEHD模型训练参数详解与优化

    目录 前言 第1章 SAEHD模型训练参数详解 1 1 SAEHD参数汇总 默认 1 2 参数详解
  • 手把手教你:解决python UnicodeDecodeError: 'gb2312' codec can't decode问题

    问题 UnicodeDecodeError gb2312 codec can t decode bytes in position 2 3 illegal multibyte sequence 原因 python在做将普通字符串转换为uni
  • 【Github Action】使用ssh-deploy上传文件的小坑

    可以使用这个Github Action上传文件到服务器 https github com easingthemes ssh deploy README中描述了使用方法 name Deploy to Staging server uses e
  • FastAPI从入门到实战(13)——常见配置项

    这一部分的内容主要是一些常见的配置 包括路由 静态文件等 还包括一些路径和文档的修饰器 包括简介 标签参数等内容 配置静态文件 from fastapi import FastAPI from fastapi staticfiles imp
  • jvisualvm ssl远程连接JVM

    jvisualvm 远程ssl连接 文章目录 一 没认证的 JMX连接 不安全 二 SSL证书认证的JMX连接 安全 1 进入生成证书的目录 并执行脚本 2 一键生成密钥脚本 3 服务器端运行jar包时 开启ssl连接 4 客户端远程SSL
  • AR小项目的制作过程(一)

    前段时间一直想着初一个教程 怎么用unity去做一个AR小demo 在做之前先科普一下什么是AR AR技术也被称作是 增强现实 主要是一种将虚拟信息与真实世界巧妙融合的技术 现在光返的运用在很多方面 例如多媒体 3D建模 实时跟踪及注册 智
  • 如何在CentOS 8上使用firewalld设置防火墙

    介绍 Introduction firewalld is firewall management software available for many Linux distributions which acts as a fronten
  • JVM内存结构与内存模型

    JVM内存结构 前言 java开发人员不像C C 开发人员那样需要自己来管理内存 每一个对象从出生到死亡都需要由开发人员来管理 对于初级开发人员来说很容易出现内存问题 而java开发人员就很 幸运 了 内存的管理几乎全部交给JVM虚拟机来管
  • php 操作系统之间的一些黑魔法(绕过文件上传a.php/.)

    http wonderkun cc index html p 626 0x00 前言 做了一个CTF题目 遇到了一些有趣的东西 所以写了这篇文章记录了一下 但是我却不明白造成这个问题的原因在哪里 所以不知道给文章起什么标题 就姑且叫这个非常
  • 汇总

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 汇总图像语义分割那些质量最好的数据集与常用benchmark数据集 前言 图像语义分割是计算机视觉最经典的任务之一 早期的图像分割主要有以下几种实现方法 基于像素分布的分
  • 4.3、Flink任务怎样读取Kafka中的数据

    目录 1 添加pom依赖 2 API使用说明 3 这是一个完整的入门案例 4 Kafka消息应该如何解析 4 1 只获取Kafka消息的value部分 4 2 获取完整Kafka消息 key value Metadata 4 3 自定义Ka
  • 我读zookeeper源码系列1

    一 准备工作 1 zookeeper版本 01 zookeeper 3 4 x 企业最常用 大数据技术组件最常用 基本维持在 3 4 5 3 4 6 3 4 7 这几个版本 02 zookeeper 3 5 x 03 zookeeper 3