ZooKeeper进阶原理

1. 节点类型

  1. 持久节点
    Persistent Znode:创建后始终存在,除非被删除.
  2. 临时节点
    Ephemeral Znode:临时节点,客户端与ZooKeeper服务断开连接后,节点消失.
  3. 序列节点
    Sequence Znode:Znode被创建时会在名称后被赋予一个序号值,序列值由是全局维护的.
    作用:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样一来,客户端就可以通过顺序号来判断事件执行的顺序.
    上面的节点进行组合,最终可以生产4种类型的节点
    (1)持久化节点:
    除非被删除,否则始终存在
    (2)持久化序列节点:
    带有序号的持久化节点
    (3)临时节点:
    客户端与ZooKeeper服务断开连接后,节点消失.
    (4)临时序列节点:
    带有序号的临时节点
    而即使当序列节点被删除后,被使用过的序列号,依然不会自动释放.

2. Stat结构体

(1)czxid:创建节点的事务zxid
每次修改节点状态都会受到一个zxidc表示create)形式的时间戳,也就是ZooKeeper事务ID.
zxid是ZooKeeper中所有修改的总的次序,每次修改都有唯一的zxid,如果zxid1的值小于zxid2的值,那么zxid1一定在zxid2之前被执行.
(2)ctime:被创建的毫秒数,从1970年1月1日开始.
(3)mzxid:m代表modify,最后更新的zxid
(4)mtime:最后更新的毫秒数,从1970年1月1日开始.
(5)pZxid:该节点或该节点的子节点(与孙节点无关)最后更新的zxid.
(6)cversion:znode的变化号,新建是0,以后每次更新+1.
(7)dataVersion:znode数据变化号,当调用set方法改变znode值时,版本号+1.
(8)aclVersion:znode访问控制列表的变化号.
(9)ephemeralOwner:如果是临时节点,这个值是拥有者的sessionID,如果不是临时节点则是0.
(10)dataLength:数据长度
(11)numChildren:子节点数量

3. 监听原理

在这里插入图片描述
(1)首先要有一个main()线程
(2)在main()线程中创建ZooKeeper客户端,就会创建2个线程,一个负责连接通信(connect),一个负责监听(listener)
(3)通过connect线程,注册的监听事件会被发送给ZooKeeper
(4)ZooKeeper会将注册的监听事件添加到注册监听器列表中.
(5)一旦ZooKeeper监听到路径或者数据有所变化时,就会将整个消息发给listener线程
(6)listener线程会调用process()方法
常见的监听:

  1. 监听节点数据的变化
get path [watch]
  1. 监听子节点增减的变化
ls path [watch]

4. 选举机制

  1. 半数机制:集群中半数以上的机器存活,集群可用.所以ZooKeeper适合奇数台的集群.
  2. ZooKeeper虽然没有像HDFS一样,指定Master和Slave,这样的主从关系,但是ZooKeeper工作时,会有一个Leader,其他节点为Follower,这个Leader是由内部选举机制产生的.
    在这里插入图片描述
    假设,上面的Server1~Server5都是以此新启动的,上面并没有任何数据.会发生下面一系列状况:
    (1)Server1启动,进行Leader选举,给自己投了1票,此时,Server1只有1票,没有达到半数以上(3票),不能当选为Leader,进入LOOKING状态.
    (2)Server2启动,也给自己投了1票.发现Server1是LOOKING状态,这时会交换选票信息,此时Server1发现,虽然zxid相同,但Server2的myid比自己大,于是改选Server2为Leader,此时Server2得到2票,依然没有达到半数以上,Server1与Server2都进入LOOKING状态.
    (3)Server3启动,也给自己投了1票.发现Server1和Server2都是LOOKING状态,于是,他们三个开始交换选票信息,最后发现,zxid都相同,但是Server3的myid最大,于是Server1和Server2都改选Server3为Leader,这时Server3得到3票,超过半数,此时它当选为Leader状态变为LEADING,Server1和Server2成为Follower,状态变为FOLLOWING.
    (4)Server4启动,先投自己1票再说,然后发现Server1~Server3不在LOOKING状态,所以它们不会再改变选择结果,那么Server4少数服从多数,也改选Server3,自己变成Follower,状态改为FOLLOWING.
    (5)Server5同Server4一样,成为了Follower,状态为FOLLOWING.

5. 写数据流程

在这里插入图片描述
(1)client连接到Server1,向其发起写请求.
(2)Server1不是Leader,所以会将接收到的写请求转发给Leader
(3)Leader接受到写请求后,将请求广播(broadcast)给包集群中的所有Server
(4)当集群中的Server接收到Leader广播的请求后,在待写列表中添加此任务.并返回成功状态给Leader
(5)Leader接收到半数以上所返回的成功状态则认为任务成功被集群接收,此时下达提交命令.
(6)集群开始将待写列表中的那个任务进行提交,待提交成功结束后,返回给Leader成功状态.
(7)Leader接收到半数以上成功的回复时,判定写操作成功,将结果通知给Server1.
(8)Server1接收到来自Leader的通知后,再对发起写请求的Client返回操作结果信息.

发布了62 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Leonardy/article/details/104054052