加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

很遗憾,没有一篇文章能讲清楚ZooKeeper

发布时间:2019-12-24 21:46:06 所属栏目:Windows 来源:站长网
导读:副标题#e# 【51CTO.com原创稿件】互联网时代是信息爆发的时代,信息的高并发催生了分布式系统的广泛应用。 图片来自 Pexels 作为分布式系统解决方案的 ZooKeeper,被广泛应用于多个分布式场景。例如:数据发布/订阅,负载均衡,命名服务,集群管理等等。 因
副标题[/!--empirenews.page--]

【51CTO.com原创稿件】互联网时代是信息爆发的时代,信息的高并发催生了分布式系统的广泛应用。

很遗憾,没有一篇文章能讲清楚ZooKeeper

图片来自 Pexels

作为分布式系统解决方案的 ZooKeeper,被广泛应用于多个分布式场景。例如:数据发布/订阅,负载均衡,命名服务,集群管理等等。

因此,ZooKeeper 在分布式系统中扮演着重要的角色,今天通过一个简单的例子来看看它的实现原理。

从一个简单的例子开始

在分布式系统中经常会遇到这种情况,多个应用读取同一个配置。例如:A,B 两个应用都会读取配置 C 中的内容,一旦 C 中的内容出现变化,会通知 A 和 B。

一般的做法是在 A,B 中按照时钟频率询问 C 的变化,或者使用观察者模式来监听 C 的变化,发现变化以后再更新 A 和 B。那么 ZooKeeper 如何协调这种场景?

ZooKeeper 会建立一个 ZooKeeper 服务器,暂且称为 ZServer,用它来存放 C 的值。为 A,B 两个应用分别生成两个客户端,称作 ClientA 和 ClientB。

这两个客户端连接到 ZooKeeper 的服务器,并获取其中存放的 C。保存 C 值的地方在 ZooKeeper 服务端(Server)中称为 ZNode。

很遗憾,没有一篇文章能讲清楚ZooKeeper

ClientA 和 ClientB 通过 ZooKeeper Server 获取 C 的值

ZNode

通过上面的例子,客户端 ClientA 和 ClientB 需要读取 C 的内容。这个 C 就作为树的叶子节点存放在 ZooKeeper 的 ZNode 中。

通常来说,为了提高效率 ZNode 是被存放在内存中的。ZNode 的数据模型是一棵树(ZNode Tree)。

好像我们从上图中看到的一样,树中的每个节点都可以存放数据,并且每个节点下面都可以存放叶子节点。

ZooKeeper 客户端通过 “/” 作为访问路径,访问数据。例如可以通过路径 “/RootNode/C” 来访问 C 变量。

为了方便客户端调用,ZooKeeper 会暴露一些命令:

很遗憾,没有一篇文章能讲清楚ZooKeeper

访问 Znode 命令

作为存储媒介来说,ZNode分为持久节点和临时节点:

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

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

如果把临时节点看成资源的话,当客户端和服务端产生会话并生成临时节点,一旦客户端与服务器中断联系,节点资源会被从 ZNode 中删除。

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

如果有三个客户端申请节点资源,那么在 /tasks 下面建立三个顺序节点,分别是 /tasks/task1,/tasks/task2,/tasks/task3。

顺序节点,在处理分布式事务的时候非常有帮助,当多个客户端(Client)协作工作的时候,会按照一定的顺序执行。

如果将上面的两类节点和顺序节点进行组合的话,就有四种节点类型,分别是持久节点,持久顺序节点,临时节点,临时顺序节点。

Watcher

上面说了 ZooKeeper 用来存放数据的 ZNode,并且把 C 的值存储在里面。如果 C 被更新了,两个客户端(ClientA、ClientB)如何获得通知呢?

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

通过三步来实现:

客户端注册 Watcher

服务端处理 Watcher

客户端回调 Watcher

很遗憾,没有一篇文章能讲清楚ZooKeeper

Watcher 注册,处理,回调

①客户端注册 Watcher

ZooKeeper 客户端创建 Watcher 的实例对象:

很遗憾,没有一篇文章能讲清楚ZooKeeper

同时这个 Watcher 会保存在客户端本地,一直作为和服务端会话的 Watcher。

很遗憾,没有一篇文章能讲清楚ZooKeeper

客户端可以通过 getData,getChildren 和 exist 方法来向服务端注册 Watcher。

很遗憾,没有一篇文章能讲清楚ZooKeeper

客户端注册 Watcher 简图

同时需要注意的是在客户端发送 Watcher 到服务端注册的时候,会将这个要发送的 Watcher 在本地的 ZKWatchManager 中保存。

这样做的好处,就是当获得服务端的注册成功的信息以后,就不用将 Watcher 的具体内容回传给客户端了。

客户端只用在接到服务端响应以后,从本地的 ZKWatchManager 中获取 Watch 的信息进行处理即可。

②服务端处理 Watcher

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

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!