【ZooKeeper】核心功能和工作机制2-ZNode数据模型


zookeeper官网https://zookeeper.apache.org/
标准解释higly reliable distributed coordination
高可靠分布式协调服务
zookeeper能做什么?(What is ZooKeeper)
maintaining configuration information 配置管理
naming 命名服务
providing distributed synchronization 分布式锁
providing group services 组服务 集群管理

ZNode数据模型

ZooKeeper内部提供了一个数据存储系统,ZNode数据模型是一个类FileSystem文件系统.

总结:ZooKeeper的数据模型系统是一个类文件系统结构,每个节点称之为ZNode,具体代码实现类是DataNode,既不是文件夹,也不是文件,但是既具有文件夹的能力,也具有文件的能力。

为什么叫类文件系统

因为正常文件系统中的每个节点要么是directory要么是file,但是ZNode数据模型中的节点,没有区分,只有一个统一的概念,叫做znode,但是既能存储数据,也能挂在子节点。所以既是文件夹,也是文件。

每个节点就是一条数据。
每个Server都拥有完整数据。
节点的抽象叫做DataNode,逻辑概念叫做ZNode
每一个节点都有一个绝对唯一路径

实现一棵树

class DataNode {
	// 存储节点的数据
	private Byte[] data;
	// 可以挂载一堆子节点
	private List<DataNode> children;
	// 当前节点有一个唯一的父节点,根节点除外
	private DataNode parent;
}

ZNode的约束

ZNode的节点存储的最大数据是1M,最好不要超过1kb,ZNode的深度没有约束
每个节点都有相同的数据视图:每个节点都存储了这个ZooKeeper中的所有数据,每个节点的数据状态都和leader保持一致
同步的压力:写入过程至少要超过半数节点写成功才能认为该数据写成功,节点数越多,成功的难度越大
存储的压力:所有数据的规模超过单台服务器的存储能力

ZNode的分类

按照生命周期:临时节点EPHEMERAL和永久节点PERSISTENT
持久类型:显式创建,显式删除,只有当使用显式命令删除节点,该节点才会被删除,否则一直存在
临时类型:跟会话绑定,哪个会话创建的这个节点,如果这个会话断开,则这个会话创建的所有临时节点被系统删除。
每个znode节点必然都是由某一个session创建的,如果当前这个session断开,那么该znode节点会被自动删除。
按是否带有序列编号:带顺序编号,和不带顺序编号
每个节点都各自维护了一个序列编号,当前节点序列编号是由它的父节点维护的,编号是自增序列编号,和MySQL自增主键是一样道理。
带顺序编号:/a000000001,/a000000002
不带顺序编号:/a
create /a “data”
总结,总共四种:
CreateMode.PERSISTENT 持久
CreateMode.PERSISTENT_SEQUENTIAL 持久带顺序编号
CreateMode.EPHEMERAL 临时
CreateMode.EPHEMERAL_SEQUENTIAL 临时带顺序编号

znode小知识

临时节点的下面不能挂载子节点,临时节点只能作为叶子节点,临时节点的生命周期和会话绑定

经典用法:尽量少往ZooKeeper中写数据,写入的数据不要特别大。ZooKeeper只适合存储少量关键数据,比如代表一个集群中真正active leader的信息数据。
为什么不适合写入大量数据:
1.因为ZooKeeper系统内部每个节点都会做数据同步,在执行写请求的时候,事实上就是原子广播。待写入数据越大,原子广播效率越低,成功难度也越大。
2.所有请求,都是严格的顺序执行,ZooKeeper集群某一时刻只能执行一个事务,如果上一个事务执行耗时,则会阻塞后面请求的执行。
3.正因为每个节点都会存储一份完整的ZooKeeper系统数据,所以如果系统数据过大,甚至超过了单个follower的存储能力了,系统服务大受影响甚至崩溃
4.ZooKeeper设计初衷,不是为了给用户提供一个大规模数据存储服务,二是提供一个为了解决一些分布式问题而需要进行一些状态存储的数据模型系统

疑问

元数据写入znode,为什么不写入mysql
mysql是单机系统
zookeeper解决分布式不统一的问题,znode仅仅为了保存状态数据,为了保证状态一致性所有节点都存储了一份,一来可以实现分布式投票,二来保证数据安全

为了确保拿到最新数据,发送sync请求

会话存在节点存在,会话断开节点被删除

zk的临时节点和会话生命周期绑定,代表一个服务状态

client端不需要知道它连接的leader服务器,follower服务器,还是observer服务器,发送请求,回复结果就行

hdfs的高可用架构中为什么没用zookeeper去保存元数据?
因为hdfs的元数据一般是几G几十G,稍微大些几百G,所以hdfs的高可用架构基于zookeeper方案提供了journal系统,该系统工作机制和zookeeper一样,只是专为hdfs产生的

一个会话可以创建多个临时节点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值