ZooKeeper是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個開源的實現(xiàn),是Hadoop和Hbase的重要組件。它是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護、域名服務(wù)、分布式同步、組服務(wù)等。
安裝啟動
安裝:把zk安裝包上傳到/opt目錄下,并切換到/opt目錄下,執(zhí)行以下指令
(資料圖片僅供參考)
#解壓tar-zxvfzookeeper-3.7.0-bin.tar.gz#重命名mvapache-zookeeper-3.7.0-bin/zookeeper#打開zookeeper根目錄cd/opt/zookeeper#創(chuàng)建一個數(shù)據(jù)目錄,備用mkdirdata#打開zk的配置目錄cd/opt/zookeeper/conf#copy配置文件,zk啟動時會加載zoo.cfg文件cpzoo_sample.cfgzoo.cfg#編輯配置文件vimzoo.cfg#修改dataDir參數(shù)為之前創(chuàng)建的數(shù)據(jù)目錄:/opt/zookeeper/data#切換到bin目錄cd/opt/zookeeper/bin#啟動./zkServer.shstart./zkServer.shstatus#查看啟動狀態(tài)./zkServer.shstop#停止./zkServer.shrestart#重啟./zkCli.sh#查看zk客戶端
如下,說明啟動成功:
相關(guān)概念
Zookeeper提供一個多層級的節(jié)點命名空間(節(jié)點稱為znode),每個節(jié)點都用一個以斜杠(/)分隔的路徑表示,而且每個節(jié)點都有父節(jié)點(根節(jié)點除外),非常類似于文件系統(tǒng)。并且每個節(jié)點都是唯一的。
znode節(jié)點有四種類型:
PERSISTENT:永久節(jié)點。客戶端與zookeeper斷開連接后,該節(jié)點依舊存在
EPHEMERAL:臨時節(jié)點。客戶端與zookeeper斷開連接后,該節(jié)點被刪除
PERSISTENT_SEQUENTIAL:永久節(jié)點、序列化。客戶端與zookeeper斷開連接后,該節(jié)點依舊存在,只是Zookeeper給該節(jié)點名稱進行順序編號
EPHEMERAL_SEQUENTIAL:臨時節(jié)點、序列化。客戶端與zookeeper斷開連接后,該節(jié)點被刪除,只是Zookeeper給該節(jié)點名稱進行順序編號
操作節(jié)點
創(chuàng)建這四種節(jié)點:
[zk:localhost:2181(CONNECTED)0]create/aatest#創(chuàng)建持久化節(jié)點Created/aa[zk:localhost:2181(CONNECTED)1]create-s/bbtest#創(chuàng)建持久序列化節(jié)點Created/bb0000000001[zk:localhost:2181(CONNECTED)2]create-e/cctest#創(chuàng)建臨時節(jié)點Created/cc[zk:localhost:2181(CONNECTED)3]create-e-s/ddtest#創(chuàng)建臨時序列化節(jié)點Created/dd0000000003[zk:localhost:2181(CONNECTED)4]ls/#查看某個節(jié)點下的子節(jié)點[aa,bb0000000001,cc,dd0000000003,zookeeper][zk:localhost:2181(CONNECTED)5]stat/#查看某個節(jié)點的狀態(tài)cZxid=0x0ctime=ThuJan0108:00:00CST1970mZxid=0x0mtime=ThuJan0108:00:00CST1970pZxid=0x5cversion=3dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=0numChildren=5[zk:localhost:2181(CONNECTED)6]get/aa#查看某個節(jié)點的內(nèi)容test[zk:localhost:2181(CONNECTED)11]delete/aa#刪除某個節(jié)點[zk:localhost:2181(CONNECTED)7]ls/#再次查看[bb0000000001,cc,dd0000000003,zookeeper]
事件監(jiān)聽
在讀取數(shù)據(jù)時,我們可以同時對節(jié)點設(shè)置事件監(jiān)聽,當節(jié)點數(shù)據(jù)或結(jié)構(gòu)變化時,zookeeper會通知客戶端。當前zookeeper針對節(jié)點的監(jiān)聽有如下四種事件:
節(jié)點創(chuàng)建:stat-w/xx
當/xx節(jié)點創(chuàng)建時:NodeCreated
節(jié)點刪除:stat-w/xx
當/xx節(jié)點刪除時:NodeDeleted
節(jié)點數(shù)據(jù)修改:get-w/xx
當/xx節(jié)點數(shù)據(jù)發(fā)生變化時:NodeDataChanged
子節(jié)點變更:ls-w/xx
當/xx節(jié)點的子節(jié)點創(chuàng)建或者刪除時:NodeChildChanged
java客戶端
ZooKeeper的java客戶端有:原生客戶端、ZkClient、Curator框架(類似于redisson,有很多功能性封裝)。
引入依賴
常用api及其方法
publicclassZkTest{publicstaticvoidmain(String[]args)throwsKeeperException,InterruptedException{//獲取zookeeper鏈接CountDownLatchcountDownLatch=newCountDownLatch(1);ZooKeeperzooKeeper=null;try{zooKeeper=newZooKeeper("172.16.116.100:2181",30000,newWatcher{@Overridepublicvoidprocess(WatchedEventevent){if(Event.KeeperState.SyncConnected.equals(event.getState)&&Event.EventType.None.equals(event.getType)){System.out.println("獲取鏈接成功。。。。。。"+event);countDownLatch.countDown;}}});countDownLatch.await;}catch(Exceptione){e.printStackTrace;}//創(chuàng)建一個節(jié)點,1-節(jié)點路徑2-節(jié)點內(nèi)容3-節(jié)點的訪問權(quán)限4-節(jié)點類型//OPEN_ACL_UNSAFE:任何人可以操作該節(jié)點//CREATOR_ALL_ACL:創(chuàng)建者擁有所有訪問權(quán)限//READ_ACL_UNSAFE:任何人都可以讀取該節(jié)點//zooKeeper.create("/zktest/aa","haha~~".getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);zooKeeper.create("/test","haha~~".getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);//zooKeeper.create("/zktest/cc","haha~~".getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT_SEQUENTIAL);//zooKeeper.create("/zktest/dd","haha~~".getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);//zooKeeper.create("/zktest/dd","haha~~".getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);//zooKeeper.create("/zktest/dd","haha~~".getBytes,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);//判斷節(jié)點是否存在Statstat=zooKeeper.exists("/test",true);if(stat!=null){System.out.println("當前節(jié)點存在!"+stat.getVersion);}else{System.out.println("當前節(jié)點不存在!");}//判斷節(jié)點是否存在,同時添加監(jiān)聽zooKeeper.exists("/test",event->{});//獲取一個節(jié)點的數(shù)據(jù)byte[]data=zooKeeper.getData("/zktest/ss0000000001",false,null);System.out.println(newString(data));//查詢一個節(jié)點的所有子節(jié)點List
關(guān)鍵詞: 事件監(jiān)聽 協(xié)調(diào)服務(wù)