-------------------
下栽の地止:https://www.itwangzi.cn/2536.html
-------------------
基于Zookeeper的布锁实现
Zookeeper简介:Zookeeper提供了一个多级的节点命名空间(节点称为znodes),每个节点都用斜线(/)分隔的路径表示,每个节点都有一个父节点(根节点除外)。
无论客户端连接到哪个服务器,它都会显示相同的视图,这是zookeeper最重要的性能。
Zookeeper的核心是原子广播,保证服务器之间的同步。 实现这种机制的协议称为 Zab 协议。 Zab协议有两种模式,分别是恢复模式(主选举)和广播模式(同步)。 当服务启动或领导者崩溃后,Zab 进入恢复模式。 当领导者被选举出来并且大多数服务器完成与领导者的状态同步时,恢复模式结束。 状态同步确保领导者和服务器具有相同的系统状态。
为了保证事务的顺序一致性,zookeeper使用递增的事务id号(zxid)来标识事务。 在实现中,zxid 是一个 64 位数字。
Zookeeper的分布式锁原理
获取分布式锁的过程:
获取分布式锁时,会在locker节点下创建一个临时的时序节点(locker节点是Zookeeper的指定节点),释放锁时删除临时节点。
客户端调用createNode方法在locker下创建一个临时的顺序节点,然后调用getChildren("locker")获取locker下的所有子节点。 请注意,此时无需设置任何 Watcher。
客户端获取到所有子节点路径后,如果发现自己创建的子节点序号最小,则认为客户端获取到了锁。
如果你发现你创建的节点不是locker所有子节点中最小的,说明你还没有获取到锁。 这时候client需要找到比自己小的节点,然后在上面调用exist()方法,同时为它注册事件listener。
之后,让关注的节点被删除,客户端的Watcher会收到相应的通知。 这个时候再判断自己创建的节点是否是locker的子节点中序号最小的。 如果是,则获取锁。 如果不是,则重复上述步骤,继续获取比自己小的节点,注册监听。
我的解释:
Locker下创建的一个Node_n —> 循环(每次获取Locker下的所有子节点—>根据节点自增数对这些节点进行排序—>判断自己创建的Node_n是否为第一个节点—>如果是,则获取 分布式锁—>如果不是在监听前一个节点Node_n-1,等待它释放分布式锁。
举报/反馈