您的位置:首页 > 其它

ZooKeeper 技术内幕:版本

2018-01-10 21:49 309 查看
今天借助ZK实现领导者选举,画时序图过程中发现,准确控制一次选举从开始到结束,非常得困难。甚至准备在ZK额外记录一系列的状态信息来确定选举开始和结束的边界,逻辑复杂且难以100%保证状态一致。

细想一下,是缺少一个唯一标记集群变化的标识。来处理多次变化重叠、单次变化各节点是否完成同步。

发现忽略了ZK带给我们的一个很有用的特性,可以使用ZNode的版本来标记一次集群节点的变化。ZK不仅有节点数据变更的版本信息还有一个父节点版本(感知子节点的增删变化)。



背景

ZK 中,ZNode 都有一个
版本号


版本号,都有哪些?

版本号,如何修改?

版本号,什么作用?

版本号

版本号,都有哪些?

每个 ZNode 都有 3 类版本信息:

version:数据内容,版本

cversion:子节点列表,版本

aversion:ACL 权限,版本



特别说明:

ZK 中
版本
就是
修改次数
:即使修改前后,内容不变,但
版本
仍会
+1
version=0
表示节点创建之后,修改的次数为 0。

cversion
子节点列表:ZNode,其中 cversion 只会感知
子节点列表
变更信息,新增子节点、删除子节点,而不会感知子节点数据内容的变更。

版本号,如何修改?

下述情况,版本号会自动更新:

版本自增:每次变化,版本就加一;

版本号,什么作用?

目标:解决 ZNode 的
并发更新
问题,实现 CAS(Compare And Switch)乐观锁。

补充:乐观锁事务,分为 3 个典型阶段:

数据读取

写入校验

数据写入

参考资料

从Paxos到Zookeeper分布式一致性原理与实践 第7章 7.1.3

ZooKeeper-Distributed Process Coordination 第2章 2.1.4

from: http://ningg.top/zookeeper-lesson-7-zookeeper-version/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息