今天借助ZK实现领导者选举,画时序图过程当中发现,准确控制一次选举从开始到结束,很是得困难。甚至准备在ZK额外记录一系列的状态信息来肯定选举开始和结束的边界,逻辑复杂且难以100%保证状态一致。并发
细想一下,是缺乏一个惟一标记集群变化的标识。来处理屡次变化重叠、单次变化各节点是否完成同步。less
发现忽略了ZK带给咱们的一个颇有用的特性,可使用ZNode的版原本标记一次集群节点的变化。ZK不只有节点数据变动的版本信息还有一个父节点版本(感知子节点的增删变化)。分布式
背景
ZK 中,ZNode 都有一个
版本号
,spa
- 版本号,都有哪些?
- 版本号,如何修改?
- 版本号,什么做用?
版本号
版本号,都有哪些?
每一个 ZNode 都有 3 类版本信息:code
- version:数据内容,版本
- cversion:子节点列表,版本
- aversion:ACL 权限,版本
特别说明:事务
- ZK 中
版本
就是修改次数
:即便修改先后,内容不变,但版本
仍会+1
:version=0
表示节点建立以后,修改的次数为 0。cversion
子节点列表:ZNode,其中 cversion 只会感知子节点列表
变动信息,新增子节点、删除子节点,而不会感知子节点数据内容的变动。版本号,如何修改?
下述状况,版本号会自动更新:get
- 版本自增:每次变化,版本就加一;
版本号,什么做用?
目标:解决 ZNode 的
并发更新
问题,实现 CAS(Compare And Switch)乐观锁。同步补充:乐观锁事务,分为 3 个典型阶段:it
- 数据读取
- 写入校验
- 数据写入
参考资料
- 从Paxos到Zookeeper分布式一致性原理与实践 第7章 7.1.3
- ZooKeeper-Distributed Process Coordination 第2章 2.1.4
from: http://ningg.top/zookeeper-lesson-7-zookeeper-version/io