ZooKeeper专题(三)——JAVA API

By timebusker on March 31, 2017

常用接口列表

创建ZooKeeper Session
public ZooKeeper(String connectString,
                 int sessionTimeout,
                 Watcher watcher)
          throws IOException

public ZooKeeper(String connectString,
                 int sessionTimeout,
                 Watcher watcher,
                 long sessionId,
                 byte[] sessionPasswd)
          throws IOException
参数列表:
  • connectString:ZK连接地址,包含端口
  • sessionTimeout:ZooKeeper Session失效时间,单位为毫秒
  • Watcher 是个接口,通过这个接口可以收到session建立或者断开的事件,同样地,也能监视ZK数据的变化。当连接成功后,会获得SyncConnected的通知,如果连接断开,则会收到DISCONNECT通知。
Create
public String create(String path,
                     byte[] data,
                     List<ACL> acl,
                     CreateMode createMode)
              throws KeeperException,
                     InterruptedException
  • 创建一个给定的目录节点 path, 并给它设置数据,CreateMode 标识有四种形式的目录节点,分别一下四点。
    • PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
    • PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
    • EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;
    • EPHEMERAL_SEQUENTIAL:临时自动编号节点
exists
public Stat exists(String path,
                   boolean watch)
            throws KeeperException,
                   InterruptedException
  • 判断某个 path 是否存在,并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher,exists方法还有一个重载方法,可以指定特定的 watcher.
public Stat exists(String path,
                   Watcher watcher)
            throws KeeperException,
                   InterruptedException
  • 重载方法,这里给某个目录节点设置特定的 watcher,Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher,从而每个客户端都很快知道它所关注的目录节点的状态发生变化,而做出相应的反应.
delete
public void delete(String path,
                   int version)
            throws InterruptedException,
                   KeeperException
  • 删除 path 对应的目录节点,version 为 -1 可以匹配任何版本,也就删除了这个目录节点所有数据.
getChildren
public List<String> getChildren(String path,
                                boolean watch)
                         throws KeeperException,
                                InterruptedException
  • 获取指定 path 下的所有子目录节点,同样 getChildren方法也有一个重载方法可以设置特定的 watcher 监控子节点的状态
setData
public Stat setData(String path,
                    byte[] data,
                    int version)
             throws KeeperException,
                    InterruptedException
  • 给 path 设置数据,可以指定这个数据的版本号,如果 version 为 -1 怎可以匹配任何版本
getData
public byte[] getData(String path,
                      boolean watch,
                      Stat stat)
               throws KeeperException,
                      InterruptedException
  • 获取这个 path 对应的目录节点存储的数据,数据的版本等信息可以通过 stat 来指定,同时还可以设置是否监控这个目录节点数据的状态
addAuthInfo
public void addAuthInfo(String scheme,
                        byte[] auth)
  • 客户端将自己的授权信息提交给服务器,服务器将根据这个授权信息验证客户端的访问权限。
setACL
public Stat setACL(String path,
                   List<ACL> acl,
                   int version)
            throws KeeperException,
                   InterruptedException
  • 给某个目录节点重新设置访问权限,需要注意的是 Zookeeper 中的目录节点权限不具有传递性,父目录节点的权限不能传递给子目录节点。
  • 目录节点 ACL 由两部分组成:perms 和 id。Perms 有 ALL、READ、WRITE、CREATE、DELETE、ADMIN 几种权限,而 id 标识了访问目录节点的身份列表,默认情况下有以下两种:ANYONE_ID_UNSAFE = new Id(“world”, “anyone”) 和 AUTH_IDS = new Id(“auth”, “”) 分别表示任何人都可以访问和创建者拥有访问权限。
getACL
public List<ACL> getACL(String path,
                        Stat stat)
                 throws KeeperException,
                        InterruptedException
  • 获取某个目录节点的访问权限列表

异步接口列表

ZK的操作都提供了异步操作版本,有了异步版本后,可以消除部分while循环了。比如create的异步操作:

	void create(String path, byte[] data,
	        List<ACL> acl,
	        CreateMode createMode,
	        AsyncCallback.StringCallback cb,
	        Object ctx)

前四个参数和同步操作相同,多了个callback和用于上下文传递的ctx。其中Callback有多种类型,比如StringCallback和DataCallback。 StringCallback有个接口方法:
` public void processResult(int rc, String path, Object ctx, String name);` rc为返回的状态码,通过状态码可以判断操作是否成功。ctx即用于传递的上下文对象。

Master-Worker实例

同步操作版本的master 异步操作版本的master