0
点赞
收藏
分享

微信扫一扫

100302- ZooKeeper详解


一、启动并验证ZooKeeper



1、启动ZooKeeper



[hadoop@cloud05 bin]$ ./zkServer.sh start



[hadoop@cloud06 bin]$ ./zkServer.sh start



[hadoop@cloud07 bin]$ ./zkServer.sh start






2、验证ZooKeeper是否正常启动



[hadoop@cloud05 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower


[hadoop@cloud06 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader







[hadoop@cloud07 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower





二、ZooKeeper基本操作



1、 连接ZooKeeper


[hadoop@cloud05 bin]$ ./zkCli.sh -server 192.168.2.35:2181



2 、创建znode节点


[zk: localhost:2181(CONNECTED) 2] create /zk 2000   
Created /zk



3、获取节点的值


[zk: localhost:2181(CONNECTED) 3] get /zk
2000


4、 对zk节点重新赋值



[zk: localhost:2181(CONNECTED) 4] set /zk 5000


[zk: localhost:2181(CONNECTED) 5] get /zk 500
5000



5、 通过ls命令查看zookeeper包含内容


[zk: localhost:2181(CONNECTED) 6] ls /
[dubbo, configs, wk, zookeeper, clusterstate.json, aliases.json, live_nodes,  zk, overseer, overseer_elect, collections]



6、 删除znode节点



[zk: localhost:2181(CONNECTED) 21] delete /zk

三、通过JAVA API 操作ZooKeeper



org.apache.zookeeper.ZooKeeper类 主要方法列表

方法名称

描述

String create(final String path, byte data[], List acl, CreateMode createMode)

创建一个znode节点,

参数: 路径、 znode内容,ACL(访问控制列表)、 znode创建类型

void delete(final String path, int version)

删除一个znode节点,

参数: 路径、版本号;如果版本号与znode的版本号不一致,将无法删除,是一种乐观加锁机制;如果将版本号设置为-1,不会去检测版本,直接删除;

Stat exists(final String path, Watcher watcher)

判断某个znode节点是否存在

参数: 路径、Watcher(监视器);当这个znode节点被改变时,将会触发当前Watcher

Stat exists(String path, boolean watch)

判断某个znode节点是否存在

参数: 路径、并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher

Stat setData(final String path, byte data[], int version)

设置某个znode上的数据

参数: 路径、数据、版本号;如果为-1,跳过版本检查

byte[] getData(final String path, Watcher watcher, Stat stat)

获取某个znode上的数据

参数: 路径、监视器、数据版本等信息

List getChildren(final String path, Watcher watcher)

获取某个节点下的所有子节点

参数: 路径、监视器;该方法有多个重载


package example;
  

 import java.io.IOException;
  
 import java.util.List;
  

 import org.apache.zookeeper.CreateMode;
  
 import org.apache.zookeeper.KeeperException;
  
 import org.apache.zookeeper.WatchedEvent;
  
 import org.apache.zookeeper.Watcher;
  
 import org.apache.zookeeper.ZooDefs.Ids;
  
 import org.apache.zookeeper.ZooKeeper;
  
 import org.apache.zookeeper.data.Stat;
  
 import org.junit.After;
  
 import org.junit.Before;
  
 import org.junit.Test;
  
 /**
  
 *
  
 * @author shenfl
  
 *
  
 */
  
 public class ZooKeeperTest {
  

      private static final String CONNECT_STR = "192.168.2.35:2181,192.168.2.36:2181";
  
      private static final int SESSION_TIMEOUT = 30000;
  
      private ZooKeeper zooKeeper;
  

      /**
  
      * 连接ZooKeeper
  
      */
  
      @Before
  
      public void connect() {
  
           try {
  
                zooKeeper = new ZooKeeper(CONNECT_STR, SESSION_TIMEOUT,
  
                          new Watcher() {
  
                               @Override
  
                               public void process(WatchedEvent e) {
  
                                    System.out.println(" process : " + e.getType());
  
                               }
  
                          });
  
           } catch (IOException e) {
  
                e.printStackTrace();
  
           }
  
      }
  

      /**
  
      * 关闭ZooKeeper
  
      */
  
      @After
  
      public void close() {
  
           try {
  
                zooKeeper.close();
  
           } catch (InterruptedException e) {
  
                e.printStackTrace();
  
           }
  
      }
  

      /**
  
      * 创建znode
  
      *PERSISTENT               持久化节点
  
          PERSISTENT_SEQUENTIAL     顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1
  
          EPHEMERAL    临时节点, 客户端session超时这类节点就会被自动删除
  
          EPHEMERAL_SEQUENTIAL   临时自动编号节点
  

      */
  
      @Test
  
      public void testCreate() {
  
           String rs = null;
  
           try {
  
                rs = zooKeeper.create("/zk", "data001".getBytes(),
  
                          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  
                System.out.println("rs=>" + rs);
  
           } catch (KeeperException e) {
  
                e.printStackTrace();
  
           } catch (InterruptedException e) {
  
                e.printStackTrace();
  
           }
  
      }
  

      /**
  
      * 设置znode下的数据,-1 表示对所有的版本
  
      */
  
      @Test
  
      public void testSetData() {
  
           try {
  
                // 当zk节点发生变化时需要 触发wacth
  
                Stat stat = zooKeeper.setData("/zk", "data002".getBytes(), -1);
  
                int version = stat.getVersion();
  
                System.out.println("version=" + version);
  
           } catch (KeeperException e) {
  
                e.printStackTrace();
  
           } catch (InterruptedException e) {
  
                e.printStackTrace();
  
           }
  
      }
  

      /**
  
      * 获取ZooKeeper中znode节点
  
      */
  
      @Test
  
      public void testGetData() {
  
           byte[] zkB = null;
  
           String zkData = "";
  
           try {
  
                zkB = zooKeeper.getData("/zk", null, null);
  
                zkData = new String(zkB);
  
                System.out.println("zkData:" + zkData);
  
           } catch (KeeperException e) {
  
                e.printStackTrace();
  
           } catch (InterruptedException e) {
  
                e.printStackTrace();
  
           }
  
      }
  

      /**
  
      * 判断节点是否存在 设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper实例时指定的 watcher
  
      */
  
      @Test
  
      public void testExists() {
  

           try {
  
                Stat stat = zooKeeper.exists("/zk", true);
  
                System.out.println(stat.getVersion());
  
           } catch (KeeperException e) {
  
                e.printStackTrace();
  
           } catch (InterruptedException e) {
  
                e.printStackTrace();
  
           }
  
      }
  

      @Test
  
      public void testChilds() {
  
           try {
  
                if (zooKeeper.exists("/zk/zk01", false) == null) {
  
                     zooKeeper.create("/zk/zk01", "zk01".getBytes(),
  
                               Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  
                }
  
                if (zooKeeper.exists("/zk/zk02", false) == null) {
  
                     zooKeeper.create("/zk/zk02", "zk02".getBytes(),
  
                               Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  
                }
  

                List<String> childens = zooKeeper.getChildren("/zk", true);
  
                for (String node : childens) {
  
                     System.out.println(node);
  
                }
  
           } catch (Exception e) {
  
                e.printStackTrace();
  
           }
  
      }
  
 }









举报

相关推荐

0 条评论