天天看點

Zookeeper學習筆記——2 Shell和Java API的使用

ZooKeeper的使用一般都接觸不到,因為平時工作甚少直接使用ZK。但是通過手動操作一下ZK,還是能對其中的門道了解各一二。

shell 常用指令

help 檢視所有支援的指令

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

ls 檢視路徑下的所有節點

[zk: localhost:2181(CONNECTED) 1] ls /
[zk-book2, zk-book1, zk-book, zookeeper]
      

create 建立節點

建立臨時節點:

[zk: localhost:2181(CONNECTED) 3] create /xingoo 123
Created /xingoo
[zk: localhost:2181(CONNECTED) 4] create -e /xingoo-e 123
Created /xingoo-e
[zk: localhost:2181(CONNECTED) 6] ls /
[zk-book2, zk-book1, zk-book, xingoo, zookeeper, xingoo-e]
[zk: localhost:2181(CONNECTED) 8] quit
Quitting...
[zk: localhost:2181(CONNECTED) 0] ls /
[zk-book2, zk-book1, zk-book, xingoo, zookeeper]
      

建立順序節點:

[zk: localhost:2181(CONNECTED) 2] create -s /xingoo-s 1
Created /xingoo-s0000000018
[zk: localhost:2181(CONNECTED) 3] create -s /xingoo-s 1
Created /xingoo-s0000000019
[zk: localhost:2181(CONNECTED) 4] create -s /xingoo-s 1
Created /xingoo-s0000000020
[zk: localhost:2181(CONNECTED) 5] create -s /xingoo-s 1
Created /xingoo-s0000000021
[zk: localhost:2181(CONNECTED) 7] ls /
[zk-book2, zk-book1, zk-book, xingoo-s0000000018, zookeeper, xingoo, xingoo-s0000000020, xingoo-s0000000021, xingoo-s0000000019]
      

delete 删除節點

[zk: localhost:2181(CONNECTED) 10] ls /
[zk-book2, zk-book1, zk-book, xingoo-s0000000018, zookeeper, xingoo, xingoo-s0000000020, xingoo-s0000000021, xingoo-s0000000019]
[zk: localhost:2181(CONNECTED) 11] delete /xingoo-s*
Node does not exist: /xingoo-s*
[zk: localhost:2181(CONNECTED) 12] delete /xingoo-s0000000020
[zk: localhost:2181(CONNECTED) 13] ls /
[zk-book2, zk-book1, zk-book, xingoo-s0000000018, zookeeper, xingoo, xingoo-s0000000021, xingoo-s0000000019]
[zk: localhost:2181(CONNECTED) 14] 
      

get 查詢節點

[zk: localhost:2181(CONNECTED) 14] get /xingoo
123
cZxid = 0x5d
ctime = Mon Apr 09 17:21:50 CST 2018
mZxid = 0x5d
mtime = Mon Apr 09 17:21:50 CST 2018
pZxid = 0x5d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
      

Java API使用

完整的代碼,可以參考《從PAXOS到ZOOKEEPER》,或者我的代碼樣例:

連接配接ZooKeeper

public class ZooKeeper_Contructor_Usage implements Watcher {

    /**
     * 調用await()阻塞,當減到0時,恢複
     * http://www.importnew.com/15731.html
     */
    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

    public static void main(String[] args) throws IOException {
        ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181",5000,new ZooKeeper_Contructor_Usage());
        System.out.println(zookeeper.getState());
        try{
            connectedSemaphore.await();
        }catch (Exception e){
            System.out.println("zk session established");
        }
    }

    @Override
    public void process(WatchedEvent watchedEvent) {
        System.out.println("recieve watched event:"+watchedEvent);
        if(Event.KeeperState.SyncConnected == watchedEvent.getState()){
            connectedSemaphore.countDown();
        }
    }
}
      

基于CountDownLatch做線程阻塞,ZooKeeper的構造方法中有幾個重要的參數:

  • url,是連接配接位址,如果是多個位址拼接,可以做輪訓;url後面還可以跟root目錄
  • timeout,連接配接逾時時間;如果連接配接斷開,ZooKeeper會自動重連
  • watcher,預設的監控類

create 建立代碼

String path1 = zooKeeper.create("/zk-test-ephemeral-",
                "".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL);
      

exist 判斷是否存在

zooKeeper.exists(path, true);
      

getData 查詢資料

zooKeeper.getData(watchedEvent.getPath(),true,stat)
      

setData 更新資料

這裡的版本号用作CAS,後面會詳細介紹

zooKeeper.setData(path, "123".getBytes(), -1);
      

getChildren 查詢所有子節點

zooKeeper.getChildren(watchedEvent.getPath(),true)
      

注意,ZooKeeper用戶端裡面所有的watcher都是一次性的,如果想要監控每次事件,需要在watcher裡面再次注冊。