Zookeeper:一个为分布式应用而设计的分布式协调服务

zookeeper在分布式技术领域是极其常见的一个中间件,也经常与其它的分布式中间件搭配使用:早期版本的karfka使用zookeeper作为集群元数据存储组件;在分布式服务框架spring-cloud/dubbo中可以作为服务注册中心、配置管理中心等;在分布式集群环境下作为分布式锁的解决方案...

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

根据zookeeper官网的介绍,zookeeper是一个用于管理配置信息、命名、提供分布式锁或者集群服务的集中式服务。它是Apache软件基金会下的项目,是一个开源的分布式的、用于分布式应用的高性能协调服务
我们看看Zookeeper到底具有哪些内容和特性用以支持这些服务的实现。

Zookeeper数据结构-树形层次目录

image.png
Zookeeper一切功能特性都是基于它的树形目录数据结构,树中的每个节点称为Znode,每个节点的名称path是一串以/分割的路径。跟文件目录类似,它可以包含子节点,但不同的是每个Znode都可以存储少量的数据。Znode具有不同的节点类型。

1. 节点类型

  • persistent,即持久化节点,除非手动删除,否则将持久化存在。创建命令是 "create /app1/p_1"。
  • ephemeral,它在一次会话生命周期中存在,在会话结束后被删除。创建命令是"create -e /app1/p_1"。
  • persistent_sequential,持久化有序节点。创建命令是"create -s /app1/p_1"。
  • ephemeral_sequential,临时有序节点。创建命令是"create -es /app1/p_1"。

有序节点创建一个有序节点时,以"create -es /app1/p_1"为例,其生成的节点的名称是"/app1/p_1"后面跟上一个10位的序列号,例如"/app1/p_10000000001",序列号由zookeeper采用自增的方式自动生成。

2. 节点数据

Znode可以存储少量数据,通过create {path} {data_value}完成数据初始赋值,通过set {path}{data_value}可以对数据值进行更新。

3. 节点属性

通过ls -s {path}可以查看路径节点相关的属性值。

  • cZxid: 创建节点的Zxid。
  • ctime:CreateTime即节点创建时间。
  • mZxid:最新修改节点的Zxid。
  • mtime:最新修改节点的时间。
  • pZxid:最后更新的子节点的zxid。
  • cversion:子节点的变化版本号,即子节点被修改的次数,-1表示未被修改过。
  • dataVersion: 当前节点的变化号,0表示未被修改过。
  • aclVersion: 访问控制列表的变化号,access control list。
  • ephemeralOwner: 如果是临时节点,表示当前节点的拥有者的sessionId。
  • dataLength:数据长度。
  • numChildren:子节点的数量。

Zxid: Zookeeper事务ID,以0x即十六进制表示,ZooKeeper每次更新操作/事务操作分配一个全局唯一的id。这个ID包含64位,其中低 32位是一个简单的单调递增的计数器,针对客户端每一个事 务请求,计数器加 1;而高 32 位则代表 Leader 周期 epoch 的编号,其设计逻辑与Zookeeper集群Leader选举有关,后面再续。

Zookeeper Watch监听机制

Zookeeper支持Watch的概念,允许客户端在Znode上设置监听。当一个watch被触发时,客户端将受到一个packet被告知Znode发生了变化。

监听类型

  • Zookeeper应用-分布式锁

    Zoo

To be Continued...


newcyw
1 声望0 粉丝