Zookeeper的API
- Zookeeper API的核心
- Zookeeper的API围绕Zookeeper的句柄(handle) 而构建,每个API调用都需要传入这个句柄。这个句柄代表与Zookeeper之间的一个 会话。
- 如果已经建立的一个会话与Zookeeper 服务断开,会话会转移到另一台Zookeeper服务器。会话存活,句柄有效。
- 客户端维护的句柄,对应服务端的会话。
- 句柄关闭,Zookeeper客户端库会告知Zookeeper服务器终止这个会话。
- 服务器发现Zookeeper客户端已经挂掉,会使这个会话无效。
- 原生API
- 构造函数:
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
- connectString:包含主机名和Zookeeper服务器的端口。
- sessionTimeout:以毫秒为单位,表示Zookeeper等待客户端通信的最长时间,之后会声明会话已死亡。
watcher
:用于接收会话事件的一个对象,需自己创建。
- Watcher定义为接口,需要我们自己实现一个类,初始化后传入。客户端使用Watcher接口来监控与Zookeeper之间会话的健康情况。
- Watcher接口在下面新建一个目录来详细说明。
- 示例
public class ZkTest implements Watcher {
private ZooKeeper zooKeeper;
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.getState());//SyncConnected
System.out.println(watchedEvent.getType());//None
}
@Before
public void init() throws IOException {
zooKeeper = new ZooKeeper("127.0.0.1:2181",15*1000,this);
}
@Test
public void testCreate() throws KeeperException, InterruptedException {
zooKeeper.getChildren("/acl20190316",false);
}
}
- 如上示例所示,实现Watcher接口,需要实现其接口
process(WatchedEvent watchedEvent)
,对于接口process,用于接收Zookeepr客户端与服务器之间发生的事件。在创建Zookeepr客户端连接时传入的Watcher实现,会用于监控客户端与服务端之间的连接状态。
- WatchedEvent有三个重要属性
KeeperState keeperState
:表示客户端与服务器之间的连接状态,在创建客户端时传入的Watcher实例,当客户端与服务端之间的连接状态发生改变的时候,会收到消息。该值是一个枚举类型,常用的有:Disconnected
(连接断开),SyncConnected
(连接成功),AuthFailed
(认证失败),Expired
(过期)EventType eventType
:在监听Znode的指定变化时使用。也是一个枚举类型。 None
, NodeCreated
, NodeDeleted
, NodeDataChanged
, NodeChildrenChanged
;String path
:监听Znode时,发生变化的Znode节点路径。
- Zookeeper的客户端操作,主要是增删修改查,同时都分为
同步
操作方法和异步
操作方法。 - 创建方法
- 同步:
String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
- path:表示创建znode的路径。
- data:创建节点的数据。
- acl:创建的节点的访问权限。
- createMode:创建Znode的模式。分为临时,临时有序,临时,持久有序。(可参见前面博客命令行操作)。
- 返回值:为创建节点的真实路径,在
临时,持久
模式下,返回值等于传入参数path。如果是有序节点,会在传入参数path后拼接节点的序号。
- 异步(推荐):
void create(String path, byte[] data, List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)
- 该方法调用后通常在create请求到达服务端之前就会立即返回。
- 与同步方法相比多出两个参数:
StringCallback cb
:是一个接口,创建结果的回调方法,在create请求完成之后,回被调用。
void processResult(int rc, String ptah, Object ctx, String name);
- rc:返回调用结构,与KeeperException的org.apache.zookeeper.KeeperException.Code 编码对应。
- path:我们传给create的path参数值。
- ctx:我们传递给create的上下文参数。
- name:创建的znode节点名称(
全路径
)。
Object ctx
:调用时指定的上下文参数。
- 删除方法
- 同步:
void delete(String path, int version)
- path:节点全路径。
- version:用于指定删除节点的
dataVersion
,如果传入值非 -1
且与当前删除节点的dataVersion不一致,则删除失败,强制删除传入 -1
即可(dataVersion的作用参见前面的博客)。
- 异步:
void delete(String path, int version, VoidCallback cb, Object ctx)
- 与同步相比多出两个参数:
VoidCallback cb
(同步创建节点的异步方法)Object ctx
:调用时指定的上下文参数。
- 修改方法
- 同步:
Stat setData(String path, byte[] data, int version)
- path:表示修改znode的路径。
- data:修改节点的数据。
- version:用于指定修改节点的
dataVersion
,如果传入值非 -1
且与当前修改节点的dataVersion不一致,则修改失败,强制修改传入 -1
即可。 - 返回值Stat:对应信息参见https://blog.youkuaiyun.com/November22/article/details/88593270
- 异步:
setData(String path, byte[] data, int version, StatCallback cb, Object ctx)
- StatCallback cb,对应接口方法:
void processResult(int rc, String path, Object ctx, Stat stat)
;可对比前面的异步方法说明。 - Object ctx:调用时指定的上下文参数。
- 查询方法
节点存在验证
Stat exists(String path, Watcher watcher)
- 其中Watcher watcher参数,表示在验证存在的时候,同时监控这个节点。
Stat exists(String path, boolean watch)
- boolean watch:表示是否使用默认的监听器,即创建客户端时传入的Watcher实例。
void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
void exists(String path, boolean watch, StatCallback cb, Object ctx)
值获取方法
byte[] getData(String path, Watcher watcher, Stat stat)
- Watcher watcher:表示
对节点值变更的监听
。 - Stat stat:为一个新建的Stat对象,在获取path的znode成功后,会将对应的znode的stat信息填充到我们传入的stat对象中。
byte[] getData(String path, boolean watch, Stat stat)
void getData(String path, Watcher watcher, DataCallback cb, Object ctx)
void getData(String path, boolean watch, DataCallback cb, Object ctx)
子节点的查询
- List getChildren(String path, Watcher watcher)
- List getChildren(String path, boolean watch)
- void getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
- void getChildren(String path, boolean watch, ChildrenCallback cb, Object ctx)
- List getChildren(String path, Watcher watcher, Stat stat)
- List getChildren(String path, boolean watch, Stat stat)
- …
- 关于获取子节点的方法,可以对比其他查询的方法,主要关注设置的Watcher watcher,使用用来
监听查询节点的子节点增加和删除的变化
。
监听器
- 简介
- 监听器时Zookeeper提供的对处理变化的重要机制。我们通过对指定的znode节点注册一个通知请求,在发生变化时就会收到一个单次的通知。
- 名词说明
- 事件:表示一个znode节点执行了更新操作。
- 监视点:表示一个与之关联的znode节点和事件类型组成的单次触发器。
- 通知:当一个监视点被一个事件触发,就会产生一个通知,通知注册了监视点的应用客户端收到的事件报告的信息。
- 单次触发,即监视点最多只会被触发一次。
- 客户端设置的每个监视点与会话关联,如果会话过期,等待中的监视点将会被删除。
- 监视点可以跨越不同的服务端的连接而保持。
- 即当一个Zookeeper客户端与一个Zookeeper服务端的连接断开后连接到集合中的另一个服务端,客户端会发送尚未触发的监视点列表,在注册监视点时,服务端将要检查已监视的znode节点在之前注册的监视点是否已发生变化,如果znode节点已经发生变化,一个监视点的事件就会被发送给客户端,否则在新的服务端上注册监视点。
- 单次触发事件丢失问题
- 因为客户端在服务端的znode上设置的监视点,是单次触发的,那么必然会造成,在监视点被触发和设置新的监视点之间的时间,出现事件丢失的情况,但是实际这并不是一个问题,因为在这个时间内,客户端随时可以去获取要监视的znode的状态信息。
- 设置监视点
- Zookeeper的API中的所有读操作:
getData
,getChildren
,exists
,均可以选择在读取的znode节点上设置监视点。 - 使用监视点机制,需要实现Watcher接口类,实现其方法
void process(WatchedEvent var1)
- WatchedEvent数据结构包含一下信息:
KeeperState keeperState
:表示客户端与服务器之间的会话状态,在创建客户端时传入的Watcher实例,当客户端与服务端之间的连接状态发生改变的时候,会收到消息。该值是一个枚举类型,常用的有:Disconnected
(连接断开),SyncConnected
(连接成功),AuthFailed
(认证失败),Expired
(过期)EventType eventType
:事件类型。也是一个枚举类型。None
, NodeCreated
, NodeDeleted
, NodeDataChanged
, NodeChildrenChanged
;String path
:监听Znode时,发生变化的Znode节点路径。
- 其中事件类型:
NodeCreated
, NodeDeleted
, NodeDataChanged
只涉及单个znode节点,NodeChildrenChanged
监视znode节点的子节点。None
表示无事件发生,而是zookeeper的会话状态发生变化。 - 监视点分为:数据监视点,子节点监视点
- NodeCreated:通过exists设置一个监视点。
- NodeDeleted:通过exists或getData调用设置监视点。
- NodeDataChanged:通过exists或getData调用设置监视点。
- NodeChildrenChanged:通过getChildren设置监视点。
- 监视点的一个问题
- 监视点一旦设置就无法移。要移除一个监视点,只有两个方法,一是触发这个监视点,二是使会话被关闭或过期。