zookeeper系列之蜕变

ZooKeeper命令行工具


当启动 ZooKeeper 服务成功之后,输入下述命令,连接到 ZooKeeper 服务:

zkCli.sh –server yourip:2181

连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息,并在屏幕输出“ Welcome to ZooKeeper”等信息。

输入 help 之后,屏幕会输出可用的 ZooKeeper 命令,如下图 1 所示:


zookeeper系列之蜕变

ZooKeeper的简单操作

1 )使用 ls 命令来查看当前 ZooKeeper 中所包含的内容:

[zk: 10.77.20.23:2181(CONNECTED) 1] ls /

[zookeeper]

2 )创建一个新的 znode 

使用 create /zk myData 。这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串:

[zk: 10.77.20.23:2181(CONNECTED) 2] create /zk myData

Created /zk

3 )再次使用 ls 命令来查看现在 zookeeper 中所包含的内容:

[zk: 10.77.20.23:2181(CONNECTED) 3] ls /

[zk, zookeeper]

此时看到, zk 节点已经被创建。

4 )下面我们运行 get 命令来确认第二步中所创建的 znode 是否包含我们所创建的字符串:

[zk: 10.77.20.23:2181(CONNECTED) 4] get /zk

myData

Zxid = 0x40000000c

time = Tue Jan 18 18:48:39 CST 2011

Zxid = 0x40000000c

mtime = Tue Jan 18 18:48:39 CST 2011

pZxid = 0x40000000c

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 6

numChildren = 0

5 )下面我们通过 set 命令来对 zk 所关联的字符串进行设置:

[zk: 10.77.20.23:2181(CONNECTED) 5] set /zk shenlan211314

cZxid = 0x40000000c

ctime = Tue Jan 18 18:48:39 CST 2011

mZxid = 0x40000000d

mtime = Tue Jan 18 18:52:11 CST 2011

pZxid = 0x40000000c

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 13

numChildren = 0

6 )下面我们将刚才创建的 znode 删除

[zk: 10.77.20.23:2181(CONNECTED) 6] delete /zk

7 )最后再次使用 ls 命令查看 ZooKeeper 所包含的内容:

[zk: 10.77.20.23:2181(CONNECTED) 7] ls /

[zookeeper]

经过验证, zk 节点已经被删除

ZooKeeper API 简介

ZooKeeper API 共包含 5 个包,分别为:

org.apache.zookeeper 

org.apache.zookeeper.data 

org.apache.zookeeper.server 

org.apache.zookeeper.server.quorum,

org.apache.zookeeper.server.upgrade ,

。其中 org.apache.zookeeper 包含 ZooKeeper 类,它我们编程时最常用的类文件。

这个类是 ZooKeeper 客户端库的主要类文件。如果要使用 ZooKeeper 服务,应用程序首先必须创建一个Zookeeper 实例,这时就需要使用此类。一旦客户端和 ZooKeeper 服务建立起连接, ZooKeeper 系统将会分配给此连接回话一个 ID 值,并且客户端将会周期地向服务器发送心跳来维持会话的连接。只要连接有效,客户端就可以调用 ZooKeeper API 来做相应的处理。

它提供了表 1 所示几类主要方法 , 

   1  ZooKeeper API 描述

功能

描述

create

在本地目录树中创建一个节点

delete

删除一个节点

exists

测试本地是否存在目标节点

get/set data

从目标节点上读取 / 写数据

get/set ACL

获取 / 设置目标节点访问控制列表信息

get children

检索一个子节点上的列表

sync

等待要被传送的数据

 

2)ZooKeeper API 的使用

这里,笔者通过一个例子来简单介绍,如何使用 ZooKeeper API 编写自己的应用程序,见代码清单 1 

代码清单 1  ZooKeeper API 的使用

 import java.io.IOException;

import org.apache.zookeeper.CreateMode;

 import org.apache.zookeeper.KeeperException;

 import org.apache.zookeeper.Watcher;

 import org.apache.zookeeper.ZooDefs.Ids;

 import org.apache.zookeeper.ZooKeeper;

 public class demo {

     // 会话超时时间,设置为与系统默认时间一致

   private static final int SESSION_TIMEOUT=30000;

   

   // 创建 ZooKeeper 实例

    ZooKeeper zk;

   

   // 创建 Watcher 实例

     Watcher wh=new Watcher(){

        public void process(org.apache.zookeeper.WatchedEvent event)

          {

                   System.out.println(event.toString());

           }

    };

    

    // 初始化 ZooKeeper 实例

     private void createZKInstance() throws IOException

    {             

           zk=new ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT,this.wh);一定要注意这里的ip地址

          

     }

   

     private void ZKOperations() throws IOException,InterruptedException,KeeperException

    {

        System.out.println("/n1. 创建 ZooKeeper 节点 (znode  zoo2, 数据: myData2 ,权限:OPEN_ACL_UNSAFE ,节点类型: Persistent");

           zk.create("/zoo2","myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

     

      System.out.println("/n2. 查看是否创建成功: ");

           System.out.println(new String(zk.getData("/zoo2",false,null)));

                          

           System.out.println("/n3. 修改节点数据 ");

          zk.setData("/zoo2", "shenlan211314".getBytes(), -1);

          

            System.out.println("/n4. 查看是否修改成功: ");

           System.out.println(new String(zk.getData("/zoo2", false, null)));

                         

           System.out.println("/n5. 删除节点 ");

         zk.delete("/zoo2", -1);

          

           System.out.println("/n6. 查看节点是否被删除: ");

           System.out.println(" 节点状态: ["+zk.exists("/zoo2", false)+"]");

   }

  

  private void ZKClose() throws  InterruptedException

    {

         zk.close();

  }


   public static void main(String[] args) throws IOException,InterruptedException,KeeperException {

          demo dm=new demo();

        dm.createZKInstance( );

           dm.ZKOperations();

           dm.ZKClose();

     }

}

 

此类包含两个主要的 ZooKeeper 函数,

 createZKInstance ()

ZKOperations ()

createZKInstance ()

函数负责对 ZooKeeper 实例 zk 进行初始化。 ZooKeeper 类有两个构造函数,我们这里使用“ ZooKeeper  String connectString,  int sessionTimeout,  Watcher watcher )”对其进行初始化。因此,我们需要提供初始化所需的,连接字符串信息,会话超时时间,以及一个 watcher 实例。 17 行到23 行代码,是程序所构造的一个 watcher 实例,它能够输出所发生的事件。

ZKOperations ()函数是我们所定义的对节点的一系列操作。它包括:创建 ZooKeeper 节点( 33 行到34 行代码)、查看节点( 36 行到 37 行代码)、修改节点数据( 39 行到 40 行代码)、查看修改后节点数据( 42 行到 43 行代码)、删除节点( 45 行到 46 行代码)、查看节点是否存在( 48 行到 49 行代码)。另外,需要注意的是:在创建节点的时候,需要提供节点的名称、数据、权限以及节点类型。此外,使用 exists函数时,如果节点不存在将返回一个 null 值。关于 ZooKeeper API 的更多详细信息,读者可以查看ZooKeeper  API 文档,如下所示:


















转载于:https://my.oschina.net/sunzy/blog/180893