Zookeeper内部原理

1 Zookeeper节点类型
(1)持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在。
(2)持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点添加顺序编号。
(3)临时目录节点
客户端与zookeeper断开连接后,该节点被删除。
(4)临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点添加顺序编号。
说明:创建znode时,设置顺序表示,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
在分布式系统中,顺序号可以被用来为所有的事件进行全局排序,这样客户端就可以通过顺序号推断事件的顺序。
在hadoop HA集群中,通过临时节点znode的存在与否来控制集群中的多个namenode的状态。
2 Zookeeper监听器原理
(1)监听原理
1)首先需要有一个main线程
2)在main线程中创建zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
3)通过connect线程将注册的监听事件发送给zookeeper
4)在zookeeper中将注册的监听事件添加到列表中
5)当zookeeper监听到有数据或路径发生变化是,就会将这个消息发送给listener线程
6)listener线程内部调用process方法
(2)常见的监听
1)监听节点数据的变化
get path [watch]
2) 监听子节点增减的变化
ls path [watch]
3 Zookeeper选举机制
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
以一个简单的例子来说明整个选举的过程。
情形一:
假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的(即zxid均为0)。假设这些服务器依序启动,来看看会发生什么。
(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;
(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的ID比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING
(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;
(5)服务器5启动,同4一样当小弟。

情形二:
假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都不是最新启动的,拥有历史数据,在存放数据量这一点上,是不一样的(即zxid各不不同)。
(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;
(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:
此时服务器1和服务器2先比较xzid,若xzid不同,则xzid小的服务器投票改为xizd大的一方;若xzid相同,此时服务器1发现服务器2的ID比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时没有服务器拥有半数以上的票数,选举无法完成,服务器1,2状态保持LOOKING;
(3)服务器3启动,发起一次选举。服务器3和服务器1,服务器2分别先互相比较xzid,
若zxid不相同,则均投票给zxid大的服务器,此时zxid最大的服务器的票数已经超过半数,当选Leader,更改状态为LEADING,其余服务器更改状态为FOLLOWING;若最大的zxid出现相同的情况,则再比较ID,ID最大者当选leader,更改状态为LEADING,其余服务器更改状态为FOLLOWING;
(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;
(5)服务器5启动,同4一样当小弟。
3 Zookeeper写数据流程
(1)client向zookeeper的server上写数据,发送一个写请求
(2)如果接收请求的server不是leader,就将次请求转发给leader。
(3)leader收到写入数据的请求后,会将写请求广播各个follower,,各个follower会将该写请求写入待写队列,并向leader发送成功消息。
(4)当leader收到半数以上能够写入的反馈消息后,表明该写操作可以执行。leader会向gegefollower发送提交信息,各个follower收到信息后,开始落实队列中的写请求。
(5)写操作完成后,于client连接的server就会通知client数据写成功了,此时,就认为此次写操作成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值