Zookeeper 简介
Zookeeper 基本概念
-
集群角色
- Leader
- Follower
- Observer(不参与 Leader 选举过程,不参与写操作的过半成功策略 ⇒ 可以在不影响写性能的情况下提升集群性能)
-
会话(Session)
- 一个客户端连接是指客户端和服务端之间的一个 TCP 长连接
-
数据节点(ZNode)
-
数据模型(ZNode Tree)中的数据单元,由一系列使用
/
进行分割的路径表示,是 Zookeeper 中最小的数据单元。 -
ZNode 的类型
- 持久节点(Persistent): 节点创建后会一直存在服务器,直到删除操作主动清除
- 持久顺序节点(Persistent_Sequential): 有顺序的持久节点,实质是创建节点时,会在节点名后加一个数字后缀,来表示其顺序
- 临时节点(Ephemeral): 生命周期与客户端会话绑定在一起,客户端会话结束,节点会被删除。临时节点不能创建子节点
- 临时顺序节点(Ephemeral_Sequential): 有顺序的临时节点
-
节点状态信息
-
cZxid: Create ZXID,表示节点被创建时的事务 ID
-
ctime: Create Time,表示节点创建时间
-
mZxid: Modified ZXID, 表示节点最后一次被修改时的事务ID
-
mtime: Modified Time, 表示节点最后一次被修改的时间
-
pZxid: 表示该节点的子节点列表最后一次被修改时的事务ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新
-
cversion: 当前子节点的版本
-
dataVersion: 当前节点内容版本
-
aclVersion: 当前节点的 ACL 版本
-
ephemeralOwner: 创建该临时节点时的会话 sessionID,如果是持久节点值为0
-
numChildren: 直系子节点数
-
-
-
事件监听器(Watcher)
- Zookeeper 允许用户在指定节点上注册一些 Watcher,并在一些特定事件触发的时候,Zookeeper 服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper 实现分布式协调服务的重要特性。
- 工作流程:客户端在向 Zookeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中。当 Zookeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。
-
ACL(Access Control Lists)
从三个方面来理解 ACL 机制:权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用
scheme:id:permission
来标识一个有效的 ACL 信息-
权限模式(Scheme)确定权限验证过程中使用的检验策略,有以下四种模式:
- **IP:**按 IP 地址粒度来进行权限控制
- **Digest:**使用
username:password
形式的权限来进行权限控制,当使用此模式,zookeeper 会先后对其进行 SHA-1 加密和 BASE64 编码 - **World:**数据节点的访问权限对所有用户开放,可看作一种特殊的 Digest 模式
- **Super:**超级用户可对任意 zookeeper 上的数据节点进行任何操作
-
授权对象(ID):权限赋予的用户或一个指定实体,不同权限模式下,授权对象不同
-
权限(Permission),Zookeeper 其定义了五种权限:
- CREATE: 创建子节点的权限
- READ: 获取节点数据和子节点列表的权限
- WRITE: 更新节点数据的权限
- DELETE: 删除子节点的权限
- ADMIN: 设置节点 ACL 的权限
-
Zookeeper 命令行操作
-
连接服务器
#连接本地服务器 zkCli.sh #连接指定服务器 zkCli.sh -server ip:port
-
创建节点
# -s -e分布指定节点特性,顺序或临时节点,不指定创建持久节点;acl 用来进行权限控制 create [-s][-e] path data acl
-
读取节点
# 列出指定节点下所有直系子节点, ls path # 获取指定节点的数据内容和属性信息 get path
-
更新节点
# 更新指定节点的数据内容 set path data [version]
-
删除节点
# 删除指定节点, 若删除的节点存在子节点,那么无法删除该节点,必须先删除子节点 delete path [version]
Zookeeper API 操作
-
原生API
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version> </dependency>
核心类:ZooKeeper
-
ZkClient(Github开源):在原生 API 之上进行包装,更易用,在内部实现了诸如 Session 超时重连、Watcher 反复注册等功能
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.2</version> </dependency>
核心类:ZkClient
-
Curator 客户端(Netflix开源):易用,解决许多细节开发工作,提供 Fluent 的编程风格支持
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
使用 CuratorFrameworkFactory 工厂类来创建客户端(newClient() / builder()), client.start()开启会话