Zookeeper介绍

什么是Zookeeper
Zookeeper是一个高效的分布式协调服务,它暴露了一些公用的服务,比如命名、配置管理、同步控制、群组服务等。我们可以使用Zookeeper来实现比如达成共识、集群管理、leader选举等。
Zookeeper基于ZAB算法(原子消息广播协议)的实现。该框架能够很好地保证分布式环境中的数据的一致性。

顺序一致性:从一个客户端发起的事务请求,最终将严格地按照其发起的顺序被应用到zookeeper中。
原子性:所有事务请求处理的结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有的机器都成功应用了某一个事务,要么就都没有应用。
可靠性:一旦服务器成功第二地应用了某一个事务,并完成了对客户端的响应,那么该事务所引起的服务器状态将会一致保留下来,除非有一个事务对其更改。
单一视图:无论客户端连接的是哪一个zookeeper服务器,所看到的服务器端数据模型都是一致的。
实时性:一旦某个事务被应用成功,那么客户端能够立刻从服务器上获取变更后的新数据。

Zookeeper结构
zookeeper维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统。

 

ZNode:
zookeeper名字空间由节点znode构成,其组织方式类似文件系统,其中各个节点相当于目录和文件,通过路径作为唯一标识。

事务ID:
在传统数据库中事务具有所谓的ACID特性:即原子性、一致性、隔离性、和持久性。
在Zookeeper中,事务是指能够改变Zookeeper服务器状态的操作,称为事务操作或者更新操作。对于每一个事务的请求,Zookeeper都会为其分配一个全局唯一的事务ID(ZXID),通常是一个64位的数字。每一个ZXID对应一次更新操作,Zookeeper根据这些全局唯一的ZXID请求来处理更新请求的全局顺序。

节点类型:
ZooKeeper 节点是有生命周期的,这取决于节点的类型。在 ZooKeeper 中,节点类型可以分为持久节点(PERSISTENT )、临时节点(EPHEMERAL),以及时序节点(SEQUENTIAL ),具体在节点创建过程中,一般是组合使用,可以生成以下 4 种节点类型。

持久节点(PERSISTENT)
所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点,不会因为创建该节点的客户端会话失效而消失。

持久顺序节点(PERSISTENT_SEQUENTIAL)
在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。

临时节点(EPHEMERAL)
和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点,注意是根据Session会话的失效时间来设定的。

临时顺序节点(EPHEMERAL_SEQUENTIAL)
临时顺序节点的特性和临时节点一致,同时是在临时节点的基础上,添加了顺序的特性。

状态信息:
在Zookeeper维护数据节点的同时,每个节点除了存储数据内容之外,还存储了数据节点本身一些状态信息,如图所示:

第一行是当前节点的数据内容,第二行开始就是节点的状态信息,Zookeeper客户端Stat类的数据结构:


ZooKeeper中每个znode的Stat结构体由下述字段构成:

l czxid:创建节点的事务的zxid
l mzxid:对znode最近修改的zxid
l ctime:以距离时间原点(epoch)的毫秒数表示的znode创建时间
l mtime:以距离时间原点(epoch)的毫秒数表示的znode最近修改时间
l version:znode数据的修改次数
l cversion:znode子节点修改次数
l aversion:znode的ACL修改次数
l ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。
l dataLength:znode数据长度。
l numChildren:znode子节点个数。

版本:
用于保证分布式数据原子性操作。Zookeeper会为每个Znode维护一个叫作Stat的数据结构,结构如图:

version是表示对数据节点数据内容的变更次数,强调的是变更次数,因此就算数据内容的值没有发生变化,version的值也会递增。

Zookeeper的版本作用就是类似于乐观锁机制,用于实现乐观锁机制的“写入校验”,

在Zookeeper的内部实现,Zookeeper通过链式的processor来处理业务请求,每个processor负责处理特定的功能。不同的Zookeeper角色的服务器processor链是不一样的,在PrepRequestProcessor请求处理链中,在处理数据更新的时候会去检查版本。

Watcher-数据变更通知:

 

Zookeeper的Watcher机制主要包括客户端线程、客户端WatchManager和Zookeeper服务器三部分。在具体的流程上,客户端向Zookeeper服务器注册Watcher事件监听的同时,会将Watcher对象存储在客户端WatchManager中。当Zookeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatchManager中取出对应的Watcher对象执行回调逻辑。

典型应用场景
zookeeper从设计模式上来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,zookeeper就将负责通知已经在zookeeper上注册的观察者做出相应的反应,从而实现集群中类似Master/slave管理模式。

  • 配置管理
  • 集群管理
  • 发布和订阅
  • 数据库切换
  • 分布式日志的收集
  • 分布式锁、队列管理
  • ......
原文地址:https://www.cnblogs.com/ericz2j/p/11168547.html