乐趣区

关于zookeeper:Zookeeper原理

1. 监听机制

1.1 触发器 watch

  • 什么是触发器 watch?

watch 事件是一次性的触发器。Zookeeper 可能在所有的读操作上设置触发器 watch,当 watch 的对象状态发生变化,就会触发此对象上触发器对应的事件。
watch 事件传递到客户端,这个过程是异步执行的。

  • watch 类型

Zookeeper 中触发器的 watch 有两类,data watch 和 child watch。
1)data watch:getData 和 exists 负责设置 datawatch。
2)child watch:getChildren 负责设置 child watch

  • watch 注册和触发详解

通过操作 getData、exists 和 getChildren 的返回值来设置不同的 watch。
getData 和 exists 返回节点的数据信息,getChildren 返回子节点列表

1)在 exists 上 watch,被监督的 Znode 创立、删除、数据更新会触发
2)getData 上的 watch,被监督的 Znode 删除或数据更新时会触发。留神被创立时不会触发,而创立时,Znode 还不存在,Znode 只有存在,getData 的操作才会胜利,也能力触发 watch。
3)getChildren 上的 watch,被监督的 Znode 创立或者删除它的子节点 child,或者 Znode 被删除时会触发。具体是触发的 watch 是什么类型的事件,能够对应上表。

1.2 监听原理

整个监听机制的运行脱离不了三个角色,Client、Client WatcherManage、Zookeeper Server。
1)Client 在向服务器 Zookeeper Server 注册时,WatcherManager 会存储 Wather 对象。
2)当 Zookeeper Server 触发 Watcher 事件后,向 Client 发送告诉。
3)Client 从 WatcherManager 取出对应的 Watcher 对象来执行回调。

2. 半数机制

Zookeeper 集群中只有半数以上机器存活,集群就能失常运行,所以部署时,咱们个别装置奇数个节点,5\7\9\11 等。

3. 选举机制

首先明确一点,Zookeeper 集群没有 master 和 slave 的概念,但有 leader 和 follower 节点之分。
leader 节点只有一个。
以五个节点的示例阐明(这个示例记得是从一个博客看来的,具体是哪个忘了,过后只保留这个内容)

假如有五台服务器组成的 zookeeper 集群,它们 的 serverid 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点 上,都是一样的。假如这些服务器依序启动,来看看会产生什么
1、服务器 1 启动,此时只有它一台服务器启动了,它收回去的报没有任何响应,所以它的 选举状态始终是 LOOKING 状态
2、服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换本人的选举后果,因为 两者都没有历史数据,所以 id 值较大的服务器 2 胜出,然而因为没有达到超过半数以上的服务器都批准选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是持续放弃 LOOKING 状态
3、服务器 3 启动,依据后面的实践剖析,服务器 3 成为服务器 1,2,3 中的老大,而与下面不 同的是,此时有三台服务器(超过半数) 选举了它,所以它成为了这次选举的 leader
4、服务器 4 启动,依据后面的剖析,实践上服务器 4 应该是服务器 1,2,3,4 中最大的,然而 因为后面曾经有半数以上的服务器选举了服务器 3,所以它只能接管当小弟的命了
5、服务器 5 启动,同 4 一样,当小弟

退出移动版