Zookeeper 应用入门

Zookeeper 应用入门

Zookeeper 是一个开源的分布式协调服务,由雅虎公司创建,由于最初雅虎公司的内部研究小组的项目大多以动物的名字命名,所以后来就以 Zookeeper(动物管理员)来命名了,而就是由 Zookeeper 来负责这些分布式组件环境的协调工作,为了解决分布式环境下数据一致性的问题。

一:数据节点 Znode

Zookeeper 中存储数据内容这个数据节点就叫做 Znode,他是一个树形结构,比如/a/b/c ,又分为持久节点、临时节点、顺序节点三大类。

  • 持久节点:只要被创建,除非主动移除,否则都应该一直保存在 Zookeeper 中
  • 临时节点:他的生命周期和客户端 Session 会话一样,会话失效,那么临时节点就会被移除,而且不能有子节点
  • 顺序节点:子节点的名称还具有有序性
    • 临时顺序节点
    • 持久顺序节点

节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过get命令可以获得状态信息的详细内容
Zookeeper 应用入门_第1张图片
每个数据节点都有三类版本信息,对数据节点任何更新操作都会引起版本号的变化,,version属性就是用来实现乐观锁机制的“写入校验”,保证分布式数据的原子性。
在这里插入图片描述

二 :watcher机制

提供了分布式数据的发布/订阅功能,zookeeper允许客户端向服务端注册一个watcher监听,当服务端的一些指定事件触发了watcher,那么服务端就会向客户端发送一个事件通知。

  • get [-s] [-w] path:监听指定path节点的修改和删除事件。同样该事件也是一次性触发

  • ls [-s] [-w] [-R] path : 监控指定path的子节点的添加和删除事件。

  • stat [-w] path:作用和get完全相同。

  • addWatch [-m mode] path
    addWatch的作用是针对指定节点添加事件监听,支持两种模式

    • PERSISTENT,持久化订阅,针对当前节点的修改和删除事件,以及当前节点的子节点的删除和新增事件
    • PERSISTENT_RECURSIVE,持久化递归订阅,在PERSISTENT的基础上,增加了子节点修改的事件触发,以及子节点的子节点的数据变化都会触发相关事件(满足递归订阅特性)

watcher主要流程:

  • 客户端向服务端注册 Wather 监听;
  • 保存 Wather 对象到客户端本地的 WatherManager 中;
  • 服务端 Wather 事件触发后,客户端收到服务端通知,从 WatherManager 中取出对应 Wather 对象执行回调逻辑。

特点:

  • 一次性的,就是说一旦触发了一次事件监听,Zookeeper 就会将它从存储中移除后续的事件都不会响应
  • 轻量,Wather 通知的单位是 WathedEvent,只包含通知状态、事件类型和节点路径,不包含具体的事件内容,具体内容需要客户端主动去重新获取数据
  • 客户端串行,客户端的 Wather 回调处理是串行同步的过程,不要因为一个 Wather 的逻辑阻塞整个客户端

当然我们可以通过重复订阅来解决

三:Session会话机制

会话自然就是指 Zookeeper 客户端和服务端之间的通信,他们使用 TCP 长连接的方式保持通信,通常,肯定会有心跳检测的机制,同时他可以接受来自服务器的 Watch 事件通知

四:权限控制 ACL

Zookeeper 使用 ACL 来进行权限的控制,ACL权限控制,使用: scheme:id:perm 来标识。

  • Scheme(权限模式),标识授权策略
  • ID(授权对象)
  • Permission:授予的权限

4.1、Scheme权限模式

所谓权限模式,就是使用什么样的方式来进行授权:

  • world:默认方式,相当于全部都能访问。
  • auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
  • digest:即用户名:密码这种方式认证,这也是业务系统中最常用的。
  • ip:通过ip地址来做权限控制,比如 ip:192.168.1.1 表示权限控制都是针对这个ip地址的。也可以针对网段 ip:192.168.1.1/24。

4.2、ID授权对象
指权限赋予的用户或一个指定的实体,不同的权限模式下,授权对象不同
Zookeeper 应用入门_第2张图片

Id ipId1 = new Id("ip", "192.168.190.1");
Id ANYONE_ID_UNSAFE = new Id("world", "anyone");

Permission权限类型包含以下 5 种:

  • CREATE,创建子节点权限
  • DELETE,删除子节点权限
  • READ,获取节点数据和子节点列表权限
  • WRITE,更新节点权限
  • ADMIN,设置节点 ACL 权限

ACL相关的命令如下:

getAcl getAcl <path> 读取ACL权限
setAcl setAcl <path> <acl> 设置ACL权限
addauth addauth <scheme> <auth> 添加认证用户

五:基于Java操作Zookeeper-Curator

  • zookeeper 原生API
  • zkClient -> Zookeeper API 的封装
  • Apache Curator -> Zookeeper API 的封装

是Apache 对Zookeeper API 的封装,java开发优先使用Curator来操作。

六:应用场景

  • 命名服务 Name Service,依赖 Zookeeper 可以生成全局唯一的节点 ID,来对分布式系统中的资源进行管理。
  • 分布式协调,这是 Zookeeper 的核心使用了。利用 Wather 的监听机制,一个系统的某个节点状态发生改变,另外系统可以得到通知。
  • Master 选举,利用 Zookeeper 节点的全局唯一性,同时只有一个客户端能够创建成功的特点,可以作为 Master 选举使用,创建成功的则作为 Master。
  • 分布式锁,利用 Zookeeper 创建临时顺序节点的特性。
  • 集群管理,分布式集群中状态的监控和管理,使用 Zookeeper 来存储。

你可能感兴趣的:(个人开发,java,zookeeper)