zookeeper原理分析

1、ZNode

通常来说,为了提高效率 ZNode 是被存放在内存中的。ZNode 的数据模型是一棵树(ZNode Tree)。
好像我们从上图中看到的一样,树中的每个节点都可以存放数据,并且每个节点下面都可以存放叶子节点。
ZooKeeper 客户端通过 “/” 作为访问路径,访问数据。例如可以通过路径 “/RootNode/C” 来访问 C 变量。

1.1 访问 Znode 命令
在这里插入图片描述

1.2 ZNode类型

  • 持久节点(PERSISTENT),该数据节点被创建后,就一直存在于 ZooKeeper 服务器上,除非删除操作(delete)清除该节点。

  • 临时节点(EPHEMERAL),该数据节点的生命周期会和客户端(Client)会话(Session)绑定在一起。如果客户端(Client)会话丢失了,那么节点就自动清除掉。

  • 顺序节点(SEQUENTIAL),ZNode 节点被分配唯一个单调递增的整数。例如多个客户端在服务器 /tasks 上申请节点时,根据客户端申请的先后顺序,将数字追加到 /tasks/task 后面。

2、Watcher

ZooKeeper 客户端(Client)会在指定的节点(/RootNote/C)上注册一个 Watcher,ZNode 上的 C 被更新的时候,服务端就会通知 ClientA 和 ClientB。

在这里插入图片描述

①客户端注册 Watcher

ZooKeeper 客户端创建 Watcher 的实例对象:
同时这个 Watcher 会保存在客户端本地,一直作为和服务端会话的 Watcher。
客户端可以通过 getData,getChildren 和 exist 方法来向服务端注册 Watcher。
同时需要注意的是在客户端发送 Watcher 到服务端注册的时候,会将这个要发送的 Watcher 在本地的 ZKWatchManager 中保存。

②服务端处理 Watcher

服务端收到客户端的请求以后,交给 FinalRequestProcessor 处理,这个进程会去 ZNode 中获取对应的数据,同时会把 Watch 加入到 WatchManager 中。

③客户端回调 Watcher

客户端在响应客户端 Watcher 注册以后,会发送 WathcerEvent 事件。作为客户端有对应的回调函数接受这个消息。

版本

在分布式系统中,会出现这么一种情况:在 ClientD 对 C 进行写入操作的时候,又有一个 ClientE 也对 C 进行写入操作。这两个 Client 会去竞争 C 资源,通常这种情况需要对 C 进行加锁操作。

在这里插入图片描述

因此引入 ZNode 版本(Version)概念。版本是用来保证分布式数据原子性操作的。

ZNode 的版本(Version乐观锁)信息保存在 ZNode 的 Stat 对象中。有如下三种:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值