今天,我将和你谈谈如何分析动物园管理员原则。可能很多人不太了解。为了让大家更好的了解,边肖为大家总结了以下内容。希望你能从这篇文章中有所收获。
00-1010 1.领导):负责发起和决定投票以及更新系统状态。
2.学习者):包括跟随者和观察者。
3.跟随者):用于接受客户端的请求并将结果返回给客户端,并在选择所有者的过程中参与投票。
4.观察者):可以接受客户端连接并将写请求转发给领导者,但是观察者不参与投票过程,只同步领导者的状态。观察者的目的是扩展系统,提高阅读速度。
5.客户端):请求启动器。
一、zookeeper的角色
Zookeeper的核心是原子广播,保证了Server之间的同步。实现这种机制的协议称为Zab协议。Zab协议有两种模式,分别是回复模式(主选择)和广播模式(同步)。当服务启动或领导者崩溃时,Zab进入恢复模式。当领导者当选且大多数服务器已完成与领导者的状态同步时,恢复模式结束。状态同步确保领导者和服务器具有相同的系统状态。
为了保证交易的顺序一致性,zookeeper使用递增的交易id号(zxid)来标识交易。所有建议在提出时都加上了zxid。在实现中,zxid是64位数字,其高32位是用于识别领导者关系是否已经改变的时期。每次选出一个领袖,都会有一个新的纪元,表明当前属于哪个领袖的统治时期。低32位用于向上计数。
每个服务器工作过程中有三种状态:
查找:当前服务器不知道谁是领导者,正在搜索。
领先:当前服务器是选定的领先。
以下:领导已当选,当前服务器与其同步。
假设有一个Zookeeper集群,由5台服务器组成,它们的id从1到5不等,都是新启动的,也就是没有历史数据,就存储的数据量来说是一样的。让我们假设这些服务器按顺序启动,看看会发生什么,如图所示。
1.服务器1启动。此时,它只有一台服务器启动,它发出的消息没有响应,所以它的选举状态总是“在看”。
2.服务器2启动,并且它与开始时启动的服务器1通信,以交换它自己的选举结果。因为它们都没有历史数据,所以id值较大的服务器2获胜,但是由于不超过一半的服务器同意投票给它(在这个例子中,超过一半的服务器是3),服务器1和2仍然保持LOOKING。
3.服务器3启动。根据前面的理论分析,服务器3成为服务器1、2和3中的领导者。与上面不同的是,三个服务器在这个时候选举了它,所以它成为了这次选举的领导者。
4.服务器4启动。根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的。但是,由于一半以上的服务器已经选了服务器3,所以只能接受弟弟的生活。
5.服务器5启动,就像4一样,做弟弟。
二、选举机制
[ZK :127 . 0 . 0 . 1:2181(CONNECTED)2]get/20181112
你好#数据
Czxid=0x4#创建节点的事务zxid
CTI me=monnov 1215:31336017 CST 2018 #创建时间
mZxid=0x4nbsp
; #最后一次更新的事务zxid
mtime = Mon Nov 12 15:31:17 CST 2018 #最后一次更新时间
pZxid = 0x4 #最后一次更新子节点zxid
cversion = 0 #子节点变化号,znode子节点修改次数
dataVersion = 0 #数据变化版本号
aclVersion = 0 #访问控制列表的变化号
ephemeralOwner = 0x0 #如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
dataLength = 5 #数据长度
numChildren = 0 #子节点数量
四、节点类型
Znode有两种类型,短暂的(ephemeral)和 持久的(persistent)。
-
Znode的类型在创建时确定并且之后不能修改。
-
短暂Znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点。
-
持久Znode不依赖于客户端会话,只有当客户端明确要删除该持有化Znode时才会删除。
-
Znode有四种形式的目录节点
-
PERSISITENT
-
EPHEMERAL
-
PERSISITENT_SEQUENTIAL
-
EPHEMERAL_SEQUENTIAL
五、写数据流程
-
1. Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。
-
2. 如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server,比如Server1和Server2,各个Server写成功后就会通知Leader。
-
3. 当Leader收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader会告诉Server1数据写成功了。
-
4. Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。
六、观察(watcher)
-
Watcher 在 Zookeeper 是一个核心功能,Watcher可以监控目录节点的数据变化以及子目录的变化,一单这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所关注的状态发生变化,而做出相应的反应。
-
可以设置观察的操作:exists、getChildren、getData
-
可以出发观察的操作:create、delete、setData
监听原理详解:
-
1. 首先要有一个main()线程
-
2. 在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。
-
3. 通过connect线程将注册的监听事件发送给Zookeeper。
-
4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
-
5. Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
-
6. listener线程内部调用了process()方法。
看完上述内容,你们对怎么解析zookeeper 原理有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/86837.html