我读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.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管理和响应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值