//下載
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
//配置環境變量
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:這個配置項是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 10*2000=20 秒。
- syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*2000=10 秒。
- server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器,就是集群模式下配置的myid文件所存放的數值;B是這個服務器的ip地址;C表示的是這個服務器與集群中的 Leader 服務器交換信息的端口;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是偽集群的配置方式,由于B都是一樣,所以不同的Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
/usr/local/zk/data_x目錄中分別創建myid,cfg文件中的server.X,“X”表示每個目錄中的myid的值。
vi myid
在bin目錄中啟動zookeeper
./zkServer.sh start zoo1.cfg
在bin目錄中查看zookeeper運行狀態
./zkServer.sh status zoo1.cfg
通過客戶端連接,進入zookeeper命令行
bin/zkCli.sh -server 128.199.XXX.XX:2181,128.199.XXX.XX:2182,128.199.XXX.XX:2183
zookeeper命令:
//查看操作
help
//查看已經存在的znode
ls /
//創建znode
create /test "test"
//獲取znode
get /test
//刪除znode。若刪除節點存在子節點,必須先刪除子節點,再刪除父節點。
delete /test
//創建臨時節點,創建它的客戶端斷開時會自動刪除
create -e /test-temp "temp"
//創建順序節點,會在節點名后添加自增長數字
create -s /test-no. ""
//更新節點
set /test "test2"
//退出
quit
Znode維護著數據、ACL(access control list,訪問控制列表)、時間戳等交換版本號等數據結構。每當Znode中的數據更新后它所維護的版本號將增加,這非常類似于數據庫中計數器時間戳的操作方式。另外Znode還具有原子性操作的特點:命名空間中,每一個Znode的數據將被原子地讀寫。讀操作將讀取與Znode相關的所有數據,寫操作將替換掉所有的數據。除此之外,每一個節點都有一個訪問控制列表,這個訪問控制列表規定了用戶操作的權限。
ZooKeeper中同樣存在臨時節點。這些節點與session同時存在,當session生命周期結束,這些臨時節點也將被刪除。臨時節點在某些場合也發揮著非常重要的作用。Watch機制就是監控某一個或者一些Znode的變化。一個Watch事件是一個一次性的觸發器,當被設置了Watch的數據發生了改變的時候,則服務器將這個改變發送給設置了Watch的客戶端,以便通知它們。
Watch機制主要有以下三個特點:
1.一次性的觸發器
當數據改變的時候,那么一個Watch事件會產生并且被發送到客戶端中。但是客戶端只會收到一次這樣的通知,如果以后這個數據再次發生改變的時候,之前設置Watch的客戶端將不會再次收到改變的通知。
例子:如果客戶端調用了 getData("/znode1", true) 并且稍后 /znode1 節點上的數據發生了改變或者被刪除了,客戶端將會獲取到 /znode1 發生變化的監視事件,而如果 /znode1 再一次發生了變化,除非客戶端再次對 /znode1 設置監視,否則客戶端不會收到事件通知。
2.發送給客戶端(Sent to the client)
這個表明了Watch的通知事件是從服務器發送給客戶端的,Zookeeper客戶端和服務端是通過Socket進行通信的,是異步的,這就表明不同的客戶端收到的Watch的時間可能不同(或因為故障不會成功地到達客戶端),但是ZooKeeper有保證當一個客戶端在看到Watch事件之前不會看到結點數據的變化。
例子:A=3,此時在上面設置了一次Watch,如果A突然變成4了,那么客戶端會先收到Watch事件的通知,然后才會看到A=4。
3.被設置Watch的數據
znode 節點本身具有不同的改變方式。也可以想象 Zookeeper 維護了兩條監視鏈表:數據監視和子節點監視getData()/exists()設置數據監視。getChildren() 設置子節點監視。
例子:
一次成功的 setData()會觸發設置在某一節點上所設置的數據監視。
一次成功的 create() 操作則會出發當前節點上所設置的數據監視以及父節點的子節點監視(child watch)。
一次成功的 delete() 操作將會觸發當前節點的數據監視和子節點監視事件,同時也會觸發該節點父節點的的子節點監視(child watch)。
當客戶端與Zookeeper服務器端失去聯系時,客戶端并不會收到監視事件的通知,當客戶端重新連接后,以前注冊的監視會重新被注冊并觸發,對于開發人員來說 這通常是透明的。只有一種情況會導致監視事件的丟失,即:通過exists()設置了某個znode節點的監視,但是如果某個客戶端在此znode節點被創建和刪除的時間間隔內與zookeeper服務器失去了聯系,該客戶端即使稍后重新連接 zookeeper服務器后也得不到事件通知。-
ACL訪問控制列表。ZooKeeper使用ACL來控制對旗下Znode結點們的訪問。通過設置權限為來表明是否允許改變一個結點的內容。需要注意的是一條ACL僅針對于一個特定的節點,不適用于子節點。
例子:如果/app 只對IP:172.16.16.1可讀 而 / APP/status 是對任何人可讀的。
與傳統Linux機制不同,一個結點的數據沒有類似“擁有者,組用戶,其他用戶”的概念,在ZooKeeper中,ACL通過設置ID以及與其關聯的權限來完成訪問控制的。ACL的權限組成語法是:(scheme:expression, perms)。前者表明設置的ID,逗號后面表示的是ID相關的權限。
例子:ip:172.16.16.1,READ 指明了IP地址為如上的用戶的權限為只讀。可設置的schemes: world 有個唯一的id, anyone ,代表所有人。 auth 不使用任何id,代表任何已認證的用戶。 digest 用 username:password 字符串來產生一個MD5串,然后該串被用來作為ACL ID。認證是通過明文發送username:password 來進行的,當用在ACL時,表達式為username:base64 ,base64是password的SHA1摘要的編碼。 ip 使用客戶端的主機IP作為ACL ID 。這個ACL表達式的格式為addr/bits ,此時addr中的有效位與客戶端addr中的有效位進行比對。 可設置的權限: CREATE:表明你可以創建一個Znode的子結點。 READ:你可以得到這個結點的數據以及列舉該結點的子結點情況。 WRITE:設置一個結點的數據。 DELETE:可以刪除一個結點 ADMIN:對一個結點設置權限。