//下載
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
//解壓
tar xvf zookeeper-3.4.6.tar.gz
//文件夾重命名
mv zookeeper-3.4.6 zk
//配置環(huán)境變量
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
cd conf/
mv zoo_sample.cfg zoo_1.cfg
mv zoo_sample.cfg zoo_2.cfg
mv zoo_sample.cfg zoo_3.cfg
zoo_1.cfg:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_1
# the port at which the clients will connect
clientPort=2181
#the location of the log file
dataLogDir=/usr/local/zk/logs_1
server.0=128.199.173.52:2287:3387
server.1=128.199.173.52:2288:3388
server.2=128.199.173.52:2289:3389
zoo_2.cfg:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_2
# the port at which the clients will connect
clientPort=2182
#the location of the log file
dataLogDir=/usr/local/zk/logs_2
server.0=128.199.173.52:2287:3387
server.1=128.199.173.52:2288:3388
server.2=128.199.173.52:2289:3389
zoo_3.cfg:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_3
# the port at which the clients will connect
clientPort=2183
#the location of the log file
dataLogDir=/usr/local/zk/logs_3
server.0=128.199.XXX.XX:2287:3387
server.1=128.199.XXX.XX:2288:3388
server.2=128.199.XXX.XX:2289:3389
- initLimit:這個(gè)配置項(xiàng)是用來(lái)配置 Zookeeper 接受客戶(hù)端(這里所說(shuō)的客戶(hù)端不是用戶(hù)連接 Zookeeper 服務(wù)器的客戶(hù)端塞俱,而是 Zookeeper 服務(wù)器集群中連接到 Leader 的 Follower 服務(wù)器)初始化連接時(shí)最長(zhǎng)能忍受多少個(gè)心跳時(shí)間間隔數(shù)。當(dāng)已經(jīng)超過(guò) 10 個(gè)心跳的時(shí)間(也就是 tickTime)長(zhǎng)度后 Zookeeper 服務(wù)器還沒(méi)有收到客戶(hù)端的返回信息,那么表明這個(gè)客戶(hù)端連接失敗赤套」倏ǎ總的時(shí)間長(zhǎng)度就是 10*2000=20 秒枚粘。
- syncLimit:這個(gè)配置項(xiàng)標(biāo)識(shí) Leader 與 Follower 之間發(fā)送消息户敬,請(qǐng)求和應(yīng)答時(shí)間長(zhǎng)度唉擂,最長(zhǎng)不能超過(guò)多少個(gè) tickTime 的時(shí)間長(zhǎng)度厂捞,總的時(shí)間長(zhǎng)度就是 5*2000=10 秒输玷。
- server.A=B:C:D:其中 A 是一個(gè)數(shù)字,表示這個(gè)是第幾號(hào)服務(wù)器靡馁,就是集群模式下配置的myid文件所存放的數(shù)值欲鹏;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ù)器相互通信的端口尽狠。如果是偽集群的配置方式,由于B都是一樣叶圃,所以不同的Zookeeper 實(shí)例通信端口號(hào)不能一樣袄膏,所以要給它們分配不同的端口號(hào)。
/usr/local/zk/data_x目錄中分別創(chuàng)建myid掺冠,cfg文件中的server.X沉馆,“X”表示每個(gè)目錄中的myid的值。
vi myid
在bin目錄中啟動(dòng)zookeeper
./zkServer.sh start zoo1.cfg
在bin目錄中查看zookeeper運(yùn)行狀態(tài)
./zkServer.sh status zoo1.cfg
通過(guò)客戶(hù)端連接德崭,進(jìn)入zookeeper命令行
bin/zkCli.sh -server 128.199.XXX.XX:2181,128.199.XXX.XX:2182,128.199.XXX.XX:2183
zookeeper命令:
//查看操作
help
//查看已經(jīng)存在的znode
ls /
//創(chuàng)建znode
create /test "test"
//獲取znode
get /test
//刪除znode斥黑。若刪除節(jié)點(diǎn)存在子節(jié)點(diǎn),必須先刪除子節(jié)點(diǎn)眉厨,再刪除父節(jié)點(diǎn)锌奴。
delete /test
//創(chuàng)建臨時(shí)節(jié)點(diǎn),創(chuàng)建它的客戶(hù)端斷開(kāi)時(shí)會(huì)自動(dòng)刪除
create -e /test-temp "temp"
//創(chuàng)建順序節(jié)點(diǎn)憾股,會(huì)在節(jié)點(diǎn)名后添加自增長(zhǎng)數(shù)字
create -s /test-no. ""
//更新節(jié)點(diǎn)
set /test "test2"
//退出
quit
Znode維護(hù)著數(shù)據(jù)鹿蜀、ACL(access control list箕慧,訪(fǎng)問(wèn)控制列表)、時(shí)間戳等交換版本號(hào)等數(shù)據(jù)結(jié)構(gòu)茴恰。每當(dāng)Znode中的數(shù)據(jù)更新后它所維護(hù)的版本號(hào)將增加颠焦,這非常類(lèi)似于數(shù)據(jù)庫(kù)中計(jì)數(shù)器時(shí)間戳的操作方式。另外Znode還具有原子性操作的特點(diǎn):命名空間中往枣,每一個(gè)Znode的數(shù)據(jù)將被原子地讀寫(xiě)伐庭。讀操作將讀取與Znode相關(guān)的所有數(shù)據(jù),寫(xiě)操作將替換掉所有的數(shù)據(jù)分冈。除此之外圾另,每一個(gè)節(jié)點(diǎn)都有一個(gè)訪(fǎng)問(wèn)控制列表,這個(gè)訪(fǎng)問(wèn)控制列表規(guī)定了用戶(hù)操作的權(quán)限雕沉。
ZooKeeper中同樣存在臨時(shí)節(jié)點(diǎn)集乔。這些節(jié)點(diǎn)與session同時(shí)存在,當(dāng)session生命周期結(jié)束蘑秽,這些臨時(shí)節(jié)點(diǎn)也將被刪除。臨時(shí)節(jié)點(diǎn)在某些場(chǎng)合也發(fā)揮著非常重要的作用箫攀。Watch機(jī)制就是監(jiān)控某一個(gè)或者一些Znode的變化肠牲。一個(gè)Watch事件是一個(gè)一次性的觸發(fā)器,當(dāng)被設(shè)置了Watch的數(shù)據(jù)發(fā)生了改變的時(shí)候靴跛,則服務(wù)器將這個(gè)改變發(fā)送給設(shè)置了Watch的客戶(hù)端缀雳,以便通知它們。
Watch機(jī)制主要有以下三個(gè)特點(diǎn):
1.一次性的觸發(fā)器
當(dāng)數(shù)據(jù)改變的時(shí)候梢睛,那么一個(gè)Watch事件會(huì)產(chǎn)生并且被發(fā)送到客戶(hù)端中肥印。但是客戶(hù)端只會(huì)收到一次這樣的通知,如果以后這個(gè)數(shù)據(jù)再次發(fā)生改變的時(shí)候绝葡,之前設(shè)置Watch的客戶(hù)端將不會(huì)再次收到改變的通知深碱。
例子:如果客戶(hù)端調(diào)用了 getData("/znode1", true) 并且稍后 /znode1 節(jié)點(diǎn)上的數(shù)據(jù)發(fā)生了改變或者被刪除了,客戶(hù)端將會(huì)獲取到 /znode1 發(fā)生變化的監(jiān)視事件藏畅,而如果 /znode1 再一次發(fā)生了變化敷硅,除非客戶(hù)端再次對(duì) /znode1 設(shè)置監(jiān)視,否則客戶(hù)端不會(huì)收到事件通知愉阎。
2.發(fā)送給客戶(hù)端(Sent to the client)
這個(gè)表明了Watch的通知事件是從服務(wù)器發(fā)送給客戶(hù)端的绞蹦,Zookeeper客戶(hù)端和服務(wù)端是通過(guò)Socket進(jìn)行通信的,是異步的榜旦,這就表明不同的客戶(hù)端收到的Watch的時(shí)間可能不同(或因?yàn)楣收喜粫?huì)成功地到達(dá)客戶(hù)端)幽七,但是ZooKeeper有保證當(dāng)一個(gè)客戶(hù)端在看到Watch事件之前不會(huì)看到結(jié)點(diǎn)數(shù)據(jù)的變化。
例子:A=3溅呢,此時(shí)在上面設(shè)置了一次Watch澡屡,如果A突然變成4了猿挚,那么客戶(hù)端會(huì)先收到Watch事件的通知,然后才會(huì)看到A=4挪蹭。
3.被設(shè)置Watch的數(shù)據(jù)
znode 節(jié)點(diǎn)本身具有不同的改變方式亭饵。也可以想象 Zookeeper 維護(hù)了兩條監(jiān)視鏈表:數(shù)據(jù)監(jiān)視和子節(jié)點(diǎn)監(jiān)視getData()/exists()設(shè)置數(shù)據(jù)監(jiān)視。getChildren() 設(shè)置子節(jié)點(diǎn)監(jiān)視梁厉。
例子:
一次成功的 setData()會(huì)觸發(fā)設(shè)置在某一節(jié)點(diǎn)上所設(shè)置的數(shù)據(jù)監(jiān)視辜羊。
一次成功的 create() 操作則會(huì)出發(fā)當(dāng)前節(jié)點(diǎn)上所設(shè)置的數(shù)據(jù)監(jiān)視以及父節(jié)點(diǎn)的子節(jié)點(diǎn)監(jiān)視(child watch)。
一次成功的 delete() 操作將會(huì)觸發(fā)當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)監(jiān)視和子節(jié)點(diǎn)監(jiān)視事件词顾,同時(shí)也會(huì)觸發(fā)該節(jié)點(diǎn)父節(jié)點(diǎn)的的子節(jié)點(diǎn)監(jiān)視(child watch)八秃。
當(dāng)客戶(hù)端與Zookeeper服務(wù)器端失去聯(lián)系時(shí),客戶(hù)端并不會(huì)收到監(jiān)視事件的通知肉盹,當(dāng)客戶(hù)端重新連接后昔驱,以前注冊(cè)的監(jiān)視會(huì)重新被注冊(cè)并觸發(fā),對(duì)于開(kāi)發(fā)人員來(lái)說(shuō) 這通常是透明的上忍。只有一種情況會(huì)導(dǎo)致監(jiān)視事件的丟失骤肛,即:通過(guò)exists()設(shè)置了某個(gè)znode節(jié)點(diǎn)的監(jiān)視,但是如果某個(gè)客戶(hù)端在此znode節(jié)點(diǎn)被創(chuàng)建和刪除的時(shí)間間隔內(nèi)與zookeeper服務(wù)器失去了聯(lián)系窍蓝,該客戶(hù)端即使稍后重新連接 zookeeper服務(wù)器后也得不到事件通知腋颠。-
ACL訪(fǎng)問(wèn)控制列表。ZooKeeper使用ACL來(lái)控制對(duì)旗下Znode結(jié)點(diǎn)們的訪(fǎng)問(wèn)吓笙。通過(guò)設(shè)置權(quán)限為來(lái)表明是否允許改變一個(gè)結(jié)點(diǎn)的內(nèi)容淑玫。需要注意的是一條ACL僅針對(duì)于一個(gè)特定的節(jié)點(diǎn),不適用于子節(jié)點(diǎn)面睛。
例子:如果/app 只對(duì)IP:172.16.16.1可讀 而 / APP/status 是對(duì)任何人可讀的絮蒿。
與傳統(tǒng)Linux機(jī)制不同,一個(gè)結(jié)點(diǎn)的數(shù)據(jù)沒(méi)有類(lèi)似“擁有者叁鉴,組用戶(hù)土涝,其他用戶(hù)”的概念,在ZooKeeper中幌墓,ACL通過(guò)設(shè)置ID以及與其關(guān)聯(lián)的權(quán)限來(lái)完成訪(fǎng)問(wèn)控制的回铛。ACL的權(quán)限組成語(yǔ)法是:(scheme:expression, perms)。前者表明設(shè)置的ID克锣,逗號(hào)后面表示的是ID相關(guān)的權(quán)限茵肃。
例子:ip:172.16.16.1,READ 指明了IP地址為如上的用戶(hù)的權(quán)限為只讀。可設(shè)置的schemes: world 有個(gè)唯一的id, anyone 袭祟,代表所有人验残。 auth 不使用任何id,代表任何已認(rèn)證的用戶(hù)巾乳。 digest 用 username:password 字符串來(lái)產(chǎn)生一個(gè)MD5串您没,然后該串被用來(lái)作為ACL ID鸟召。認(rèn)證是通過(guò)明文發(fā)送username:password 來(lái)進(jìn)行的,當(dāng)用在A(yíng)CL時(shí)氨鹏,表達(dá)式為username:base64 欧募,base64是password的SHA1摘要的編碼。 ip 使用客戶(hù)端的主機(jī)IP作為ACL ID 仆抵。這個(gè)ACL表達(dá)式的格式為addr/bits 跟继,此時(shí)addr中的有效位與客戶(hù)端addr中的有效位進(jìn)行比對(duì)。 可設(shè)置的權(quán)限: CREATE:表明你可以創(chuàng)建一個(gè)Znode的子結(jié)點(diǎn)镣丑。 READ:你可以得到這個(gè)結(jié)點(diǎn)的數(shù)據(jù)以及列舉該結(jié)點(diǎn)的子結(jié)點(diǎn)情況舔糖。 WRITE:設(shè)置一個(gè)結(jié)點(diǎn)的數(shù)據(jù)。 DELETE:可以刪除一個(gè)結(jié)點(diǎn) ADMIN:對(duì)一個(gè)結(jié)點(diǎn)設(shè)置權(quán)限莺匠。