您的位置:首页 > 其它

Zookeeper详解:

2018-01-11 14:54 176 查看

数据模型:

树:

在ZooKeeper中,每一个数据节点都被称为一个ZNode,所有ZNode按层次化结构进行组织,形成一棵树。使用斜杠(/)进行分割的路径表示,可以向这个节点中写入数据,也可以在节点下面创建子节点。

事务ID:

在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID ,用ZXID来表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序。

节点特性:

节点类型:

持久节点(PERSISTENT)、临时节点(EPHEMERAL)和顺序节点(SEQUENTIAL)三大类,具体在节点创建过程中,通过组合使用,可以生成以下四种组合型节点类型:

持久节点

持久节点是ZooKeeper中最常见的一种节点类型。所谓恃久节点,是指该数据节点被创建后,就会一直存在于ZooKeeper服务器上,直到有删除操作来主动清除这个节点。

持久顺序节点

持久节点的基本特性和持久节点是一致的,额外的特性表现在顺序性上。在ZooKeeper中每个父节点都会为它的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序。

临时节点

临时节点的生命周期和客户端的会话绑定在一起,也就是说,如果客户端会话失效,那么这个节点就会被自动清理掉。注意,这里提到的是客户端会活失效,而非TCP连接断开。在Zookeeper中临时节点只能作为叶子节点。

临时顺序节点

在临时节点的基础上,添加了顺序的特性。

状态信息:

第一行是当前数据节点的数据内容,从第二行开始就是节点的状态信息了,这其实就是数据节点的Stat对象的格式化输出。具体属性如下:



版本———呆证分布式数据原子性操作:

概述:

每个数据节点都具有三种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化,下图对这三类版本信息分别进行了说明:



在一个数据节点/zk-test被创建完毕之后,节点的version值是0,表示的含义是”当前节点自从创建之后,被更新过0次”。如果现在对该节点的数据内容进行更新操作,那么随后, version的值就会变成1。同时需要注意的是,在上文中提到的关于version的说明,其表示的是对数据节点数据内容的变更次数,强调的是变更次数,因此即使前后两改变更并没有使得数据内容的值发生变化,version的值依然会变更。

应用:

悲观锁,是数据库中一种非常典型且非常严格的并发控制策略。悲观锁具有强烈的独占和排他特性,能够有效地避免不同事务对同一数据并发更新而造成的数据一致性问题。悲观锁策略适合解决那些对于数据更新竞争十分激烈的场景。

乐观锁,相对于悲观锁而言,乐观锁机制显得更加宽松与友好。它假定多个事务在处理过程中不会彼此影响,因此在事务处理的绝大部分时间里不需要进行加锁处理。在乐观锁机制中,在更新请求提交之前,每个事务都会首先检查当前事务读取数据后,是否有其他事务对该数据进行了修改。如果其他事务有更新的话,那么正在提交的事务就需要回滚。乐观锁通常适合使用在数据并发竞争不大、事务冲突较少的应用场景中。

可以把一个乐观锁控制的事务分成如下三个阶段:数据读取、写入校验和数据写人。在ZooKeeper中,version属性正是用来实现乐观锁机制中的”写入校验”的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: