一、 Zookeeper

一突诬、 Zookeeper概述

1. 概述

Zookeeper是一個(gè)開(kāi)源的分布式的止状,為分布式應(yīng)用提供協(xié)調(diào)服務(wù)的Apache項(xiàng)目。Hadoop和Hbase的重要組件攒霹。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)浆洗、域名服務(wù)催束、分布式同步、組服務(wù)等伏社。

2. 特點(diǎn)

1)Zookeeper:一個(gè)領(lǐng)導(dǎo)者(leader)抠刺,多個(gè)跟隨者(follower)組成的集群。
2)Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議摘昌,更新系統(tǒng)狀態(tài)速妖。
3)Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過(guò)程中參與投票聪黎。
4)集群中奇數(shù)臺(tái)服務(wù)器只要有半數(shù)以上節(jié)點(diǎn)存活罕容,Zookeeper集群就能正常服務(wù)。
5)全局?jǐn)?shù)據(jù)一致:每個(gè)server保存一份相同的數(shù)據(jù)副本稿饰,client無(wú)論連接到哪個(gè)server锦秒,數(shù)據(jù)都是一致的。
6)更新請(qǐng)求順序進(jìn)行喉镰,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行旅择。
7)數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功侣姆,要么失敗生真。
8)實(shí)時(shí)性,在一定時(shí)間范圍內(nèi)捺宗,client能讀到最新數(shù)據(jù)柱蟀。

3. 數(shù)據(jù)結(jié)構(gòu)

ZooKeeper數(shù)據(jù)模型的結(jié)構(gòu)與Unix文件系統(tǒng)很類(lèi)似,整體上可以看作是一棵樹(shù)偿凭,每個(gè)節(jié)點(diǎn)稱做一個(gè)ZNode产弹。每一個(gè)ZNode默認(rèn)能夠存儲(chǔ)1MB的元數(shù)據(jù),每個(gè)ZNode都可以通過(guò)其路徑唯一標(biāo)識(shí)。


數(shù)據(jù)結(jié)構(gòu)圖.png

4. 應(yīng)用場(chǎng)景

提供的服務(wù)包括:統(tǒng)一命名服務(wù)痰哨、統(tǒng)一配置管理胶果、統(tǒng)一集群管理、服務(wù)器節(jié)點(diǎn)動(dòng)態(tài)上下線斤斧、軟負(fù)載均衡等早抠。

5. 下載地址

https://zookeeper.apache.org/

二、 Zookeeper安裝

1. 本地模式安裝部署

a. 安裝前準(zhǔn)備

(1)安裝jdk
(2)上傳zookeeper到linux系統(tǒng)下
(3)修改tar包權(quán)限
chmod u+x zookeeper-3.4.10.tar.gz
(4)解壓到指定目錄
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(5)配置環(huán)境變量
vi /etc/profile
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin

b. 配置修改

將/opt/module/zookeeper-3.4.10/conf這個(gè)路徑下的zoo_sample.cfg修改為zoo.cfg撬讽;
mv zoo_sample.cfg zoo.cfg
進(jìn)入zoo.cfg文件:vim zoo.cfg
修改dataDir路徑為
dataDir=/opt/module/zookeeper-3.4.10/zkData
在/opt/module/zookeeper-3.4.10/這個(gè)目錄上創(chuàng)建zkData文件夾
[itstar@bigdata111 zookeeper-3.4.10]$ mkdir zkData

c. 操作zookeeper

(1)啟動(dòng)zookeeper
bin/zkServer.sh start
(2)查看進(jìn)程是否啟動(dòng)
[root@bigdata111 ~]# jps
4020 Jps
4001 QuorumPeerMain
(3)查看狀態(tài):
[itstar@bigdata111 zookeeper-3.4.10]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: standalone
(4)啟動(dòng)客戶端:
[itstar@bigdata111 zookeeper-3.4.10]$ bin/zkCli.sh
(5)退出客戶端:
[zk: localhost:2181(CONNECTED) 0] quit
(6)停止zookeeper
[itstar@bigdata111 zookeeper-3.4.10]$ bin/zkServer.sh stop

image.png

2. 配置參數(shù)解讀

解讀zoo.cfg文件中參數(shù)含義
1)tickTime=2000:通信心跳數(shù)蕊连,Zookeeper服務(wù)器心跳時(shí)間,單位毫秒
Zookeeper使用的基本時(shí)間游昼,服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔甘苍,也就是每個(gè)tickTime時(shí)間就會(huì)發(fā)送一個(gè)心跳,時(shí)間單位為毫秒烘豌。
它用于心跳機(jī)制载庭,并且設(shè)置最小的session超時(shí)時(shí)間為兩倍心跳時(shí)間。(session的最小超時(shí)時(shí)間是2*tickTime)
2)initLimit=10:Leader和Follower初始通信時(shí)限
集群中的follower跟隨者服務(wù)器與leader領(lǐng)導(dǎo)者服務(wù)器之間初始連接時(shí)能容忍的最多心跳數(shù)(tickTime的數(shù)量)廊佩,用它來(lái)限定集群中的Zookeeper服務(wù)器連接到Leader的時(shí)限囚聚。
投票選舉新leader的初始化時(shí)間
Follower在啟動(dòng)過(guò)程中,會(huì)從Leader同步所有最新數(shù)據(jù)标锄,然后確定自己能夠?qū)ν夥?wù)的起始狀態(tài)顽铸。
Leader允許Follower在initLimit時(shí)間內(nèi)完成這個(gè)工作。
3)syncLimit=5:Leader和Follower同步通信時(shí)限
集群中Leader與Follower之間的最大響應(yīng)時(shí)間單位料皇,假如響應(yīng)超過(guò)syncLimit * tickTime谓松,Leader認(rèn)為Follwer死掉,從服務(wù)器列表中刪除Follwer瓶蝴。
在運(yùn)行過(guò)程中毒返,Leader負(fù)責(zé)與ZK集群中所有機(jī)器進(jìn)行通信,例如通過(guò)一些心跳檢測(cè)機(jī)制舷手,來(lái)檢測(cè)機(jī)器的存活狀態(tài)拧簸。
如果L發(fā)出心跳包在syncLimit之后,還沒(méi)有從F那收到響應(yīng)男窟,那么就認(rèn)為這個(gè)F已經(jīng)不在線了盆赤。
4)dataDir:數(shù)據(jù)文件目錄+數(shù)據(jù)持久化路徑
保存內(nèi)存數(shù)據(jù)庫(kù)快照信息的位置,如果沒(méi)有其他說(shuō)明歉眷,更新的事務(wù)日志也保存到數(shù)據(jù)庫(kù)牺六。
5)clientPort=2181:客戶端連接端口
監(jiān)聽(tīng)客戶端連接的端口

三、Zookeeper內(nèi)部原理

1. 選舉機(jī)制

Server ID: myid(權(quán)重越大)
Zxid:數(shù)據(jù)ID(先一數(shù)據(jù)低進(jìn)行選擇)
1)半數(shù)機(jī)制(Paxos 協(xié)議):集群中半數(shù)以上機(jī)器存活汗捡,集群可用淑际。所以zookeeper適合裝在奇數(shù)臺(tái)機(jī)器上畏纲。
2)Zookeeper雖然在配置文件中并沒(méi)有指定master和slave。但是春缕,zookeeper工作時(shí)盗胀,是有一個(gè)節(jié)點(diǎn)為leader,其他則為follower锄贼,Leader是通過(guò)內(nèi)部的選舉機(jī)制臨時(shí)產(chǎn)生的票灰。
3)以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明整個(gè)選舉的過(guò)程。
假設(shè)有五臺(tái)服務(wù)器組成的zookeeper集群宅荤,它們的id從1-5屑迂,同時(shí)它們都是最新啟動(dòng)的,也就是沒(méi)有歷史數(shù)據(jù)冯键,在存放數(shù)據(jù)量這一點(diǎn)上惹盼,都是一樣的。假設(shè)這些服務(wù)器依序啟動(dòng)惫确,來(lái)看看會(huì)發(fā)生什么逻锐。

(1)服務(wù)器1啟動(dòng),此時(shí)只有它一臺(tái)服務(wù)器啟動(dòng)了雕薪,它發(fā)出去的報(bào)沒(méi)有任何響應(yīng),所以它的選舉狀態(tài)一直是LOOKING狀態(tài)晓淀。
(2)服務(wù)器2啟動(dòng)所袁,它與最開(kāi)始啟動(dòng)的服務(wù)器1進(jìn)行通信,互相交換自己的選舉結(jié)果凶掰,由于兩者都沒(méi)有歷史數(shù)據(jù)燥爷,所以id值較大的服務(wù)器2勝出,但是由于沒(méi)有達(dá)到超過(guò)半數(shù)以上的服務(wù)器都同意選舉它(這個(gè)例子中的半數(shù)以上是3)懦窘,所以服務(wù)器1前翎、2還是繼續(xù)保持LOOKING狀態(tài)。
(3)服務(wù)器3啟動(dòng)畅涂,根據(jù)前面的理論分析港华,服務(wù)器3成為服務(wù)器1、2午衰、3中的老大立宜,而與上面不同的是,此時(shí)有三臺(tái)服務(wù)器選舉了它臊岸,所以它成為了這次選舉的leader橙数。
(4)服務(wù)器4啟動(dòng),根據(jù)前面的分析帅戒,理論上服務(wù)器4應(yīng)該是服務(wù)器1灯帮、2、3、4中最大的钟哥,但是由于前面已經(jīng)有半數(shù)以上的服務(wù)器選舉了服務(wù)器3迎献,所以它只能接收當(dāng)小弟的命了。
(5)服務(wù)器5啟動(dòng)瞪醋,同4一樣當(dāng)小弟忿晕。

2. 節(jié)點(diǎn)類(lèi)型

1)Znode有兩種類(lèi)型:
短暫(ephemeral):客戶端和服務(wù)器端斷開(kāi)連接后,創(chuàng)建的節(jié)點(diǎn)自己刪除
持久(persistent):客戶端和服務(wù)器端斷開(kāi)連接后银受,創(chuàng)建的節(jié)點(diǎn)不刪除
2)Znode有四種形式的目錄節(jié)點(diǎn)(默認(rèn)是persistent )
(1)持久化目錄節(jié)點(diǎn)(PERSISTENT)(小寫(xiě):persistent)
客戶端與zookeeper斷開(kāi)連接后践盼,該節(jié)點(diǎn)依舊存在。
(2)持久化順序編號(hào)目錄節(jié)點(diǎn)(PERSISTENT_SEQUENTIAL)
(小寫(xiě):persistent_sequential)
客戶端與zookeeper斷開(kāi)連接后宾巍,該節(jié)點(diǎn)依舊存在咕幻,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)。
(3)臨時(shí)目錄節(jié)點(diǎn)(EPHEMERAL)(ephemeral)
客戶端與zookeeper斷開(kāi)連接后顶霞,該節(jié)點(diǎn)被刪除肄程。
(4)臨時(shí)順序編號(hào)目錄節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL)(ephemeral_sequential)
客戶端與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除选浑,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)蓝厌。
3)創(chuàng)建znode時(shí)設(shè)置順序標(biāo)識(shí),znode名稱后會(huì)附加一個(gè)值古徒,順序號(hào)是一個(gè)單調(diào)遞增的計(jì)數(shù)器拓提,由父節(jié)點(diǎn)維護(hù)
4)在分布式系統(tǒng)中,順序號(hào)可以被用于為所有的事件進(jìn)行全局排序隧膘,這樣客戶端可以通過(guò)順序號(hào)推斷事件的順序


image.png

3. stat結(jié)構(gòu)體

1)czxid- 引起這個(gè)znode創(chuàng)建的zxid代态,創(chuàng)建節(jié)點(diǎn)的事務(wù)的zxid
每次修改ZooKeeper狀態(tài)都會(huì)收到一個(gè)zxid形式的時(shí)間戳,也就是ZooKeeper事務(wù)ID疹吃。
事務(wù)ID是ZooKeeper中所有修改總的次序蹦疑。每個(gè)修改都有唯一的zxid,如果zxid1小于zxid2萨驶,那么zxid1在zxid2之前發(fā)生歉摧。
2)ctime - znode被創(chuàng)建的毫秒數(shù)(從1970年開(kāi)始)
3)mzxid - znode最后更新的zxid
4)mtime - znode最后修改的毫秒數(shù)(從1970年開(kāi)始)
5)pZxid-znode最后更新的子節(jié)點(diǎn)zxid
6)cversion - znode子節(jié)點(diǎn)變化號(hào),znode子節(jié)點(diǎn)修改次數(shù)
7)dataversion - znode數(shù)據(jù)變化號(hào)
8)aclVersion - znode訪問(wèn)控制列表的變化號(hào)
9)ephemeralOwner- 如果是臨時(shí)節(jié)點(diǎn)腔呜,這個(gè)是znode擁有者的session id判莉。如果不是臨時(shí)節(jié)點(diǎn)則是0。
10)dataLength- znode的數(shù)據(jù)長(zhǎng)度
11)numChildren - znode子節(jié)點(diǎn)數(shù)量

4. 監(jiān)聽(tīng)器原理

1育谬、監(jiān)聽(tīng)原理詳解:
1)首先要有一個(gè)main()線程
2)在main線程中創(chuàng)建ZK客戶端券盅,這是會(huì)創(chuàng)建兩個(gè)線程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connect),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)
3)通過(guò)connect線程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給ZK
4)在ZK的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中
5)ZK監(jiān)聽(tīng)到有數(shù)據(jù)或路徑發(fā)生變化時(shí)膛檀,就會(huì)將這個(gè)消息發(fā)送給listener線程
6)Listener線程內(nèi)部調(diào)用process()方法
2锰镀、常見(jiàn)的監(jiān)聽(tīng)
1)監(jiān)聽(tīng)節(jié)點(diǎn)數(shù)據(jù)的變化
1.Get path [watch]
2)監(jiān)聽(tīng)子節(jié)點(diǎn)增減的變化
1.Ls path [watch]


image.png

5. 寫(xiě)數(shù)據(jù)流程

讀是局部性的娘侍,即client只需要從與它相連的server上讀取數(shù)據(jù)即可;而client有寫(xiě)請(qǐng)求的話泳炉,與之相連的server會(huì)通知leader憾筏,然后leader會(huì)把寫(xiě)操作分發(fā)給所有server。所以定要比讀慢很多花鹅。


image.png

四氧腰、 Zookeeper實(shí)戰(zhàn)

1. 分布式安裝部署

0)集群規(guī)劃
在bigdata111、bigdata112和bigdata113三個(gè)節(jié)點(diǎn)上部署Zookeeper刨肃。
1)解壓安裝
(1)解壓zookeeper安裝包到/opt/module/目錄下
[itstar@bigdata111 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(2)在/opt/module/zookeeper-3.4.10/這個(gè)目錄下創(chuàng)建zkData
mkdir -p zkData
(3)重命名/opt/module/zookeeper-3.4.10/conf這個(gè)目錄下的zoo_sample.cfg為zoo.cfg
cp zoo_sample.cfg zoo.cfg


image.png

2)配置zoo.cfg文件
(1)具體配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加如下配置
#######################cluster##########################
server.1=bigdata111:2888:3888
server.2=bigdata112:2888:3888
server.3=bigdata113:2888:3888


image.png

(2)配置參數(shù)解讀
Server.A=B:C:D古拴。
A是一個(gè)數(shù)字,表示這個(gè)是第幾號(hào)服務(wù)器真友;
B是這個(gè)服務(wù)器的ip地址黄痪;
C是這個(gè)服務(wù)器與集群中的Leader服務(wù)器交換信息的端口;
D是萬(wàn)一集群中的Leader服務(wù)器掛了盔然,需要一個(gè)端口來(lái)重新進(jìn)行選舉桅打,選出一個(gè)新的Leader,而這個(gè)端口就是用來(lái)執(zhí)行選舉時(shí)服務(wù)器相互通信的端口愈案。
集群模式下配置一個(gè)文件myid挺尾,這個(gè)文件在dataDir目錄下,這個(gè)文件里面有一個(gè)數(shù)據(jù)就是A的值站绪,Zookeeper啟動(dòng)時(shí)讀取此文件潦嘶,拿到里面的數(shù)據(jù)與zoo.cfg里面的配置信息比較從而判斷到底是哪個(gè)server。
3)集群操作
(1)在/opt/module/zookeeper-3.4.10/zkData目錄下創(chuàng)建一個(gè)myid的文件
touch myid

添加myid文件崇众,注意一定要在linux里面創(chuàng)建,在notepad++里面很可能亂碼
(2)編輯myid文件
vi myid
在文件中添加與server對(duì)應(yīng)的編號(hào):如2


image.png

(3)拷貝配置好的zookeeper到其他機(jī)器上
scp -r /opt/module/zookeeper-3.4.14 root@bigdata112:/opt/module/
scp -r /opt/module/zookeeper-3.4.14 root@bigdata113:/opt/module/
(4)修改bigdata112和bigdata113的myid文件
image.png

image.png

(4)分別啟動(dòng)zookeeper
[root@bigdata111 zookeeper-3.4.10]# bin/zkServer.sh start
[root@bigdata112 zookeeper-3.4.10]# bin/zkServer.sh start
[root@bigdata113 zookeeper-3.4.10]# bin/zkServer.sh start
(5)查看狀態(tài)

image.png

image.png

image.png

2. 客戶端命令行操作

命令基本語(yǔ)法 功能描述
help 顯示所有操作命令
ls path [watch] 使用 ls 命令來(lái)查看當(dāng)前znode中所包含的內(nèi)容
ls2 path [watch] 查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)
create 普通創(chuàng)建(永久節(jié)點(diǎn))
-s 含有序列
-e 臨時(shí)(重啟或者超時(shí)消失)
get path [watch] 獲得節(jié)點(diǎn)的值
set 設(shè)置節(jié)點(diǎn)的具體值
stat 查看節(jié)點(diǎn)狀態(tài)
delete 刪除節(jié)點(diǎn)
rmr 遞歸刪除節(jié)點(diǎn)

1)啟動(dòng)客戶端
[itstar@bigdata112 zookeeper-3.4.10]$ bin/zkCli.sh
2)顯示所有操作命令
[zk: localhost:2181(CONNECTED) 1] help
3)查看當(dāng)前znode中所包含的內(nèi)容
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
4)查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)
[zk: localhost:2181(CONNECTED) 1] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
5)創(chuàng)建普通節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 2] create /app1 "hello app1"
Created /app1
[zk: localhost:2181(CONNECTED) 4] create /app1/server101 "192.168.1.101"
Created /app1/server101
6)獲得節(jié)點(diǎn)的值
[zk: localhost:2181(CONNECTED) 6] get /app1
hello app1
cZxid = 0x20000000a
ctime = Mon Jul 17 16:08:35 CST 2017
mZxid = 0x20000000a
mtime = Mon Jul 17 16:08:35 CST 2017
pZxid = 0x20000000b
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 1
[zk: localhost:2181(CONNECTED) 8] get /app1/server101
192.168.1.101
cZxid = 0x20000000b
ctime = Mon Jul 17 16:11:04 CST 2017
mZxid = 0x20000000b
mtime = Mon Jul 17 16:11:04 CST 2017
pZxid = 0x20000000b
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 0
7)創(chuàng)建短暫節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 9] create -e /app-emphemeral 8888
(1)在當(dāng)前客戶端是能查看到的
[zk: localhost:2181(CONNECTED) 10] ls /
[app1, app-emphemeral, zookeeper]
(2)退出當(dāng)前客戶端然后再重啟客戶端
[zk: localhost:2181(CONNECTED) 12] quit
[itstar@bigdata113 zookeeper-3.4.10]$ bin/zkCli.sh
(3)再次查看根目錄下短暫節(jié)點(diǎn)已經(jīng)刪除
[zk: localhost:2181(CONNECTED) 0] ls /
[app1, zookeeper]
8)創(chuàng)建帶序號(hào)的節(jié)點(diǎn)
(1)先創(chuàng)建一個(gè)普通的根節(jié)點(diǎn)app2
[zk: localhost:2181(CONNECTED) 11] create /app2 "app2"
(2)創(chuàng)建帶序號(hào)的節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 13] create -s /app2/aa 888
Created /app2/aa0000000000
[zk: localhost:2181(CONNECTED) 14] create -s /app2/bb 888
Created /app2/bb0000000001
[zk: localhost:2181(CONNECTED) 15] create -s /app2/cc 888
Created /app2/cc0000000002
如果原節(jié)點(diǎn)下有1個(gè)節(jié)點(diǎn)航厚,則再排序時(shí)從1開(kāi)始顷歌,以此類(lèi)推。
[zk: localhost:2181(CONNECTED) 16] create -s /app1/aa 888
Created /app1/aa0000000001
9)修改節(jié)點(diǎn)數(shù)據(jù)值
[zk: localhost:2181(CONNECTED) 2] set /app1 999
10)節(jié)點(diǎn)的值變化監(jiān)聽(tīng)
(1)在104主機(jī)上注冊(cè)監(jiān)聽(tīng)/app1節(jié)點(diǎn)數(shù)據(jù)變化
[zk: localhost:2181(CONNECTED) 26] get /app1 watch
(2)在103主機(jī)上修改/app1節(jié)點(diǎn)的數(shù)據(jù)
[zk: localhost:2181(CONNECTED) 5] set /app1 777
(3)觀察104主機(jī)收到數(shù)據(jù)變化的監(jiān)聽(tīng)
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/app1
11)節(jié)點(diǎn)的子節(jié)點(diǎn)變化監(jiān)聽(tīng)(路徑變化)
(1)在104主機(jī)上注冊(cè)監(jiān)聽(tīng)/app1節(jié)點(diǎn)的子節(jié)點(diǎn)變化
[zk: localhost:2181(CONNECTED) 1] ls /app1 watch
[aa0000000001, server101]
(2)在103主機(jī)/app1節(jié)點(diǎn)上創(chuàng)建子節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 6] create /app1/bb 666
Created /app1/bb
(3)觀察104主機(jī)收到子節(jié)點(diǎn)變化的監(jiān)聽(tīng)
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/app1
12)刪除節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 4] delete /app1/bb
13)遞歸刪除節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 7] rmr /app2
14)查看節(jié)點(diǎn)狀態(tài)
[zk: localhost:2181(CONNECTED) 12] stat /app1
cZxid = 0x20000000a
ctime = Mon Jul 17 16:08:35 CST 2017
mZxid = 0x200000018
mtime = Mon Jul 17 16:54:38 CST 2017
pZxid = 0x20000001c
cversion = 4
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 2

3. API應(yīng)用

修改pom.xml幔睬,添加zookeeper依賴

<dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
</dependencies>
import org.apache.curator.utils.ZookeeperFactory;
import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.zip.ZipOutputStream;

public class ZKTest {

    private ZooKeeper zkClient;
    @Before
    public void init() throws IOException {
        zkClient = new ZooKeeper("192.168.1.111", 2000, new Watcher() {
            public void process(WatchedEvent watchedEvent) {
                System.out.println(watchedEvent.getType()+"---"+watchedEvent.getPath());
                try {
                    zkClient.getChildren("/", true);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },false);
    }
    @Test
    public void create() throws KeeperException, InterruptedException {
        String str = zkClient.create("/idea", "Idea Test!".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(str);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眯漩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子麻顶,更是在濱河造成了極大的恐慌赦抖,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辅肾,死亡現(xiàn)場(chǎng)離奇詭異队萤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)矫钓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)要尔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舍杜,“玉大人,你說(shuō)我怎么就攤上這事赵辕〖燃ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵还惠,是天一觀的道長(zhǎng)左冬。 經(jīng)常有香客問(wèn)我玻佩,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任踱葛,我火速辦了婚禮,結(jié)果婚禮上珊随,老公的妹妹穿的比我還像新娘洗贰。我一直安慰自己,他們只是感情好嫉晶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布骑疆。 她就那樣靜靜地躺著,像睡著了一般替废。 火紅的嫁衣襯著肌膚如雪箍铭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天椎镣,我揣著相機(jī)與錄音诈火,去河邊找鬼。 笑死状答,一個(gè)胖子當(dāng)著我的面吹牛冷守,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惊科,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拍摇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了馆截?” 一聲冷哼從身側(cè)響起充活,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜡娶,沒(méi)想到半個(gè)月后混卵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窖张,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年幕随,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宿接。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡合陵,死狀恐怖枢赔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拥知,我是刑警寧澤踏拜,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站低剔,受9級(jí)特大地震影響速梗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟齿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一姻锁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猜欺,春花似錦位隶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赋荆,卻和暖如春笋妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窄潭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工春宣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫉你。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓月帝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幽污。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚷辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容