ZooKeeper(四)ZooKeeper的簡單使用

ZooKeeper的命令行操做

運行 zkCli.sh –server <ip:port> 進入命令行工具,鏈接後使用help能夠查看全部命令:
java

1.使用 ls 命令來查看當前 ZooKeeper 中所包含的內容:node

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

2.建立一個新的 znode ,使用 create /zk myData 。這個命令建立了一個新的 znode 節點「 zk 」以及與它關聯的字符串:git

[zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData「

3.咱們運行 get 命令來確認 znode 是否包含咱們所建立的字符串:github

[zk: 202.115.36.251:2181(CONNECTED) 3] get /zk

監聽這個節點的變化,當另一個客戶端改變/zk時,它會打印下面的apache

[zk: localhost:2181(CONNECTED) 4] get /zk watch
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk

4.下面咱們經過 set 命令來對 zk 所關聯的字符串進行設置:數組

[zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl「

5.下面咱們將剛纔建立的 znode 刪除:ide

[zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk

6.若是znode下面有子節點,用delete是刪除不了的,要用遞歸刪除:rmr函數

[zk: 202.115.36.251:2181(CONNECTED) 5] rmr /zk

實際測試:工具

[root@BC-VM-edce4ac67d304079868c0bb265337bd4 zookeeper-3.4.6]# bin/zkCli.sh -127.0.0.1:2181
Connecting to localhost:2181
2015-06-11 10:55:14,387 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
    ...

[zk: localhost:2181(CONNECTED) 5] help
ZooKeeper -server host:port cmd args
        connect host:port
        get path [watch]
        ls path [watch]
        set path data [version]
        rmr path
        delquota [-n|-b] path
        quit
        printwatches on|off
        create [-s] [-e] path data acl
        stat path [watch]
        close
        ls2 path [watch]
        history
        listquota path
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        setquota -n|-b val path

下面測試一下經常使用的命令:測試

  • create:建立路徑結點。
  • ls:查看路徑下的全部結點。
  • get:得到結點上的值。
  • set:修改結點上的值。
  • delete:刪除結點。
[zk: localhost:2181(CONNECTED) 6] create /zktest mydata
Created /zktest
[zk: localhost:2181(CONNECTED) 12] ls /
[zktest, zookeeper]
[zk: localhost:2181(CONNECTED) 7] ls /zktest
[]
[zk: localhost:2181(CONNECTED) 13] get /zktest
mydata
cZxid = 0x1c
ctime = Thu Jun 11 10:58:06 CST 2015
mZxid = 0x1c
mtime = Thu Jun 11 10:58:06 CST 2015
pZxid = 0x1c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 14] set /zktest junk
cZxid = 0x1c
ctime = Thu Jun 11 10:58:06 CST 2015
mZxid = 0x1f
mtime = Thu Jun 11 10:59:08 CST 2015
pZxid = 0x1c
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 15] delete /zktest
[zk: localhost:2181(CONNECTED) 16] ls /
[zookeeper]

ZooKeeper API的使用

org.apache.zookeeper.Zookeeper是客戶端入口主類,負責創建與server的會話。
它提供了以下幾類主要方法:

功能 描述
create 在本地目錄樹中建立一個節點
delete 刪除一個節點
exists 測試本地是否存在目標節點
get/set data 從目標節點上讀取 / 寫數據
get/set ACL 獲取 / 設置目標節點訪問控制列表信息
get children 檢索一個子節點上的列表
sync 等待要被傳送的數據

增刪改查的demo

package com.lzumetal.zookeeper.helloworld;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;


/**
 * Created by liaosi on 2017/11/18.
 */
public class SimpleZkClient {

    private static final Logger log = LoggerFactory.getLogger(SimpleZkClient.class);

    private static String connectString = "server01:2181,server02:2181,server03:2181";
    private static int timeoutMils = 2000;
    private ZooKeeper zooKeeper;


    @Before
    public void init() throws Exception {
        zooKeeper = new ZooKeeper(connectString, timeoutMils, new Watcher() {

            //收到事件通知後的回調函數(即咱們本身的實際處理邏輯)
            @Override
            public void process(WatchedEvent event) {
                log.info(event.getPath() + "---->" + event.getType());
            }
        });

    }


    /**
     * 數據的增刪改查
     */

    //建立節點
    @Test
    public void testCreate() throws KeeperException, InterruptedException {
        //參數1:節點的路徑;參數2:節點的數據;參數3:節點的權限;參數4:節點的類型
        zooKeeper.create("/idea", "hello zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        //上傳的數據能夠是任何類型,但都要轉成byte數組
    }

    //獲取子節點
    @Test
    public void getGetChild() throws KeeperException, InterruptedException {

        //true表示註冊了建立zookeeper時的監聽器,也能夠從新註冊一個新的監聽器
        List<String> childrens = zooKeeper.getChildren("/", true);

        for (String children : childrens) {
            log.info(children);
        }

    }

    //判斷節點是否存在
    @Test
    public void testExist() throws KeeperException, InterruptedException {
        Stat exists = zooKeeper.exists("/idea", true);
        System.out.println(exists == null ? "Not exist" : "Exist");
    }

    //獲取節點數據
    @Test
    public void testGetData() throws KeeperException, InterruptedException {
        byte[] data = zooKeeper.getData("/idea", false, null);
        System.out.println(new String(data));
    }

    //刪除節點
    @Test
    public void testDelete() throws KeeperException, InterruptedException {
        //-1表示將全部節點都刪除
        zooKeeper.delete("/idea", -1);
    }
}

相關代碼以上傳至GitHub:https://github.com/liaosilzu2...

相關文章
相關標籤/搜索