Zookeeper类
Zookeeper Java 代码主要使用 org.apache.zookeeper.Zookeeper 这个类使用 Zookeeper 服务。
ZooKeeper(connectString, sessionTimeout, watcher)
connectString :使用逗号分隔的列表,每个ZooKeeper节点是一个host:port对,host是机器名或者
IP地址,port是ZooKeeper节点对客户端提供服务的端口号。客户端会任意选取connectString中的
一个节点建立连接。
sessionTimeout : session timeout 时间。
watcher : 用于接收到来自ZooKeeper集群的事件。
Zookeeper主要方法
- create(path, data, flags): 创建一个给定路径的 znode , 并在 znode 保存 data[]的数据,flags指定 znode 的类型。
- delete (path, version) :如果给定 path 上的 znode 的版本和给定的version匹配,删除 znode。
- exists(path, watch) :判断给定 path 上的 znode 是否存在,并在 znode 设置一个watch。
- getData(path, watch) :返回给定 path 上的 znode 数据,并在 znode 设置一个watch。
- setData(path, data, version) :如果给定 path 上的 znode 的版本和给定的 version匹配,设置 znode 数据。
方法说明
- 所有读取 znode 数据的 API 都可以设置一个 watch 用来监控 znode 的变化。
- 所有更新 znode 数据的API都有两个版本:无条件更新版本和条件更新版本。如果version为-1 ,更新为无条件更新。否则只有给定的version和 znode 当前的 version一样,才会进行更新,这样的更新是条件更新。
- 所有的方法都有同步和异步两个版本。同步版本的方法发送请求给 ZooKeeper 并等待服务器的响应。异步版本把请求放入客户端的请求队列,然后马上返回。异步版本通过 callback 来接受来自服务端的响应。
数据读取API示例
有以下三个获取 znode 数据的方法:
- byte[] getData(String path, boolean watch, Stat stat) 同步方法。如果 watch 为 true , 该 znode 的状态变化会发送给构建 ZooKeeper 是指定的watcher。
- void getData(String path, boolean watch, DataCallback cb, Object ctx) 异步方法。 cb 是一个 callback , 用来接收服务端的响应。 ctx 是提供给 cb 的 context。watch 参数的含义和方法1相同。
- void getData(String path, Watcher watcher, DataCallback cb, Object ctx)异步方法。 watcher 用来接收该 znode 的状态变化。
数据写入API示例
- Stat setData(String path, byte[] data, int version) 同步版本。如果version是-1,做无条件更新。如果version是非负整数,做条件更新。
- void setData(String path, byte[] data, int version, StatCallback cb, Object ctx) 异步版本。
watch机制
watch提供一个让客户端获取最新数据的机制。如果没有watch机制,客户端需要不断的轮询ZooKeeper来查看是否有数据更新,这在分布式环境中是非常耗时的。客户端可以在读取数据的时候设置一个watcher,这样在数据更新时,客户端就会收到通知。
条件更新
设想用znode /c实现一个counter,使用set命令来实现自增1操作。条件更新场景:
- 客户端1把/c更新到版本1,实现/c的自增1。
- 客户端2把/c更新到版本2 ,实现/c的自增1。
- 客户端1不知道/c已经被客户端2更新过了,还用过时的版本1是去更新/c,更新失败。如果客户端1使用的是无条件更新,/c就会更新为2 ,没有实现自增1。 使用条件更新可以避免对数据基于过期的数据进行数据更新操作。