深入了解Zookeeper系列
在第二篇文章中我们简单的了解的zookeeper的一些基本概念,本次对zookeeper的概念进行深入理解,并且对第二篇文章的补充。
1.节点特性
1.1节点类型
持久节点(PERSISTENT)
持久节点是zookeeper中最常见的一种节点类型。所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点。
持久顺序节点(PERSISTENT_SEQUENTIAL)
持久顺序节点的基本特性和持久节点是一致的,额外的特性表现在顺序性上。在zookeeper中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,zookeeper会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。
临时节点(EPHEMERAL)
临时顺序节点(EPHEMERAL_SEQUENTIAL)和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。zookeeper规定在临时节点下面不能创建子节点。
临时顺序节点的基本特性和临时节点也是一致的,同样是在临时节点的基础上,添加了顺序性
2 .版本——保证分布式数据原子性操作
2.1数据节点的版本信息
每个数据节点都有三个版本信息
版本类型 说明 version 当前数据节点数据内容的版本号 cversion 当前数据节点子节点的版本号 aversion 当前数据节点ACL变更版本号 以version为例:创建一个数据节点/zk-book这个节点的version=0(表示这个节点被更改过0次);当对这个节点的内容进行N次更改那么version=N;
2.2分布式中的锁
悲观锁:
又被称作悲观并发控制(Pessimistic Concurrency Control,缩写“PCC),是数据库中一种非常典型且非常严格的并发控制策略。悲观锁具有强烈的独占性和排他特性,能够有效地避免不同事务对同一数据并发更新造成的数据一致性问题。
应用场景:
悲观锁策略适合解决那些对于数据库更新竞争十分激烈的场景,采用简单粗暴的悲观锁机制来解决并发控制问题
乐观锁:
又被称作乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)也是一种常见的并发控制机策略。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。
应用场景:
通常适用于数据并发竞争不大、事务冲突较少的应用场景
2.3zookeeper实现乐观锁
乐观锁分析:
我们可以把一个乐观锁控制的事务分成如下三个阶段:数据读取、写入校验和数据写入,其中写入校验阶段是整个乐观锁控制的关键所在。在写入校验阶段,事务会检查数据在读取阶段后是否有其他事务对数据进行更新,以确保数据更新的一致性。
JDK实现方式:(CAS)
CAS 操作包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。(其中是否符合预期便是乐观锁的“写入校验”阶段)
zookeeper的版本实现
在zookeeper中,version属性正式用来实现乐观锁机制的“写入校验”的。
在zookeeper的javaApi使用过程中如果version为-1表示版本未改动
3.watcher——数据变更的通知
监听机制是 Zookeeper 中非常重要的特性,我们基于 zookeeper 上创建的节点,可以对这些节点绑定监听事件,比如可以监听节点数据变更、节点删除、子节点状态变更等事件,通过这个事件机制,可以基于 zookeeper 实现分布式锁、集群管理等功能
3.1watcher 特性
当数据发生变化的时候, zookeeper 会产生一个 watcher 事件,并且会发送到客户端。但是客户端只会收到一次通知。如果后续这个节点再次发生变化,那么之前设置 watcher 的客户端不会再次收到消息。(watcher 是一次性的操作)。可以通过循环监听去达到永久监听效果
如何注册事件机制 通过这三个操作来绑定事件 :getData、Exists、getChildren
3.2如何触发事件
凡是事务类型的操作,都会触发监听事件。(create /delete /setData)
3.3watcher通知状态与事件类型
3.4事件的实现原理
4.会话
会话(session)是zookeeper中的最重要概念之一,客户端与服务端之间的任何交互操作都与会话息息相关,包括,临时节点的生命周期,和客户端请求的执行顺序以及Watcher通知机制等。
4.1会话状态
- CONNECTING 连接中
- CONNECTED 已连接
- RECONNECTING 重新连接中
- RECONNECTED 已重新连接
- CLOSE 关闭