要想使用ZooKeeper,首先就要把它部署在服務器上跑起來,就想Apache,Tomcat,FtpServer等服務器同樣。ZooKeeper的部署方式主要有三種,單機模式、僞集羣模式、集羣模式。其實剩下的兩種模式都是集羣模式的特殊狀況。
1.4.1. 基本的環境變量配置
Java大型的項目中,環境變量的配置很重要,若是沒有很好的配置環境變量的話,甚至項目連啓動都是難事。
export ZOOKEEPER_HOME=/home/zookeeper-3.3.3
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
1.4.2. ZooKeeper的單機模式部署
ZooKeeper的單機模式一般是用來快速測試客戶端應用程序的,在實際過程當中不多是單機模式。單機模式的配置也比較簡單。
l 編寫配置文件zoo.cfg
zookeeper-3.3.3/conf文件夾下面就是要編寫配置文件的位置了。在文件夾下面新建一個文件zoo.cfg。ZooKeeper的運行默認是讀取zoo.cfg文件裏面的內容的。如下是一個最簡單的配置文件的樣例:
tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
在這個文件中,咱們須要指定 dataDir 的值,它指向了一個目錄,這個目錄在開始的時候須要爲空。下面是每一個參數的含義:
tickTime :基本事件單元,以毫秒爲單位。這個時間是做爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每一個 tickTime 時間就會發送一個心跳。
dataDir :存儲內存中數據庫快照的位置,顧名思義就是 Zookeeper 保存數據的目錄,默認狀況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
clientPort :這個端口就是客戶端鏈接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
使用單機模式時用戶須要注意:這種配置方式下沒有 ZooKeeper 副本,因此若是 ZooKeeper 服務器出現故障, ZooKeeper 服務將會中止。
l 執行運行腳本
在zookeeper-3.3.3/bin文件夾下面運行zkServer.sh便可,運行完畢以後則ZooKeeper服務變啓動起來。
./zkServer.sh start
腳本默認調用zoo.cfg裏面的配置,所以程序正常啓動。
1.4.3. ZooKeeper的集羣模式部署
ZooKeeper的集羣模式下,多個Zookeeper服務器在工做前會選舉出一個Leader,在接下來的工做中這個被選舉出來的Leader死了,而剩下的Zookeeper服務器會知道這個Leader死掉了,在活着的Zookeeper集羣中會繼續選出一個Leader,選舉出Leader的目的是爲了能夠在分佈式的環境中保證數據的一致性。
圖3.2 ZooKeeper集羣模式圖
l 確認集羣服務器的數量
因爲ZooKeeper集羣中,會有一個Leader負責管理和協調其餘集羣服務器,所以服務器的數量一般都是單數,例如3,5,7...等,這樣2n+1的數量的服務器就能夠容許最多n臺服務器的失效。
l 編寫配置文件
配置文件須要在每臺服務器中都要編寫,如下是一個配置文件的樣本:
# Filename zoo.cfg
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=202.115.36.251:2888:3888
server.2=202.115.36.241:2888:3888
server.3=202.115.36.242:2888:3888
initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 5*2000=10 秒。
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。
l 建立myid文件
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就只有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個 server。
l 執行運行腳本
和單機模式下的運行方式基本相同,值得注意的地方就是要分別在不一樣服務器上執行一次,例如分別在251,241,242上運行:
./zkServer.sh start
這樣才能使得整個集羣啓動起來。
1.4.4. ZooKeeper的集羣僞分佈
其實在企業中式不會存在的,另外爲了測試一個客戶端程序也沒有必要存在,只有在物質條件比較匱乏的條件下才會存在的模式。
集羣僞分佈模式就是在單機下模擬集羣的ZooKeeper服務,在一臺機器上面有多個ZooKeeper的JVM同時運行。
l 確認集羣僞服務器的數量
2n+1,和以前的集羣分佈相同。
l 編寫配置文件
在/conf文件夾新建三個配置文件,zoo1.cfg,zoo2.cfg以及zoo3.cfg。配置文件分別以下編寫:
Zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_1
clientPort=2181
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
Zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_2
clientPort=2182
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
Zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_3
clientPort=2183
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
因爲三個服務都在同一臺電腦上,所以這裏要保證地址的惟一性,所以要特別注意IP地址和端口號不要互相沖突,以避免影響程序的正確執行。
l 建立myid文件
這個同集羣模式部署,在各自的文件夾下面建立。
l 執行運行腳本
因爲全部的配置文件都在/conf文件夾下面,所以要執行三次,並且要加文件名的參數,否則會默認執行zoo.cfg這個文件,以下:
./zkServer.sh start zoo1.cfg
./zkServer.sh start zoo2.cfg
./zkServer.sh start zoo3.cfg
執行完畢後,將完成ZooKeeper的集羣僞分佈的啓動。
1.4.5. 經過ZooKeeper命令行工具訪問ZooKeeper
ZooKeeper命令行工具相似於Linux的shell環境,不過功能確定不及shell啦,可是使用它咱們能夠簡單的對ZooKeeper進行訪問,數據建立,數據修改等操做。
當啓動 ZooKeeper 服務成功以後,輸入下述命令,鏈接到 ZooKeeper 服務:
zkCli.sh –server 202.115.36.251:2181
鏈接成功後,系統會輸出 ZooKeeper 的相關環境以及配置信息,並在屏幕輸出「 Welcome to ZooKeeper 」等信息。
命令行工具的一些簡單操做以下:
1 )使用 ls 命令來查看當前 ZooKeeper 中所包含的內容:
[zk: 202.115.36.251:2181(CONNECTED) 1] ls /
2 )建立一個新的 znode ,使用 create /zk myData 。這個命令建立了一個新的 znode 節點「 zk 」以及與它關聯的字符串:
[zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData"
3 )咱們運行 get 命令來確認 znode 是否包含咱們所建立的字符串:
[zk: 202.115.36.251:2181(CONNECTED) 3] get /zk
4 )下面咱們經過 set 命令來對 zk 所關聯的字符串進行設置:
[zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl"
5 )下面咱們將剛纔建立的 znode 刪除:
[zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk
1.4.6. 使用API來訪問ZooKeeper
API訪問ZooKeeper纔是客戶端主要的使用手段,經過在客戶端編寫豐富多彩的程序,來達到對ZooKeeper的利用。這裏給出一個簡單的例子:(深刻的還沒能力給出啊,例子是從網上找的很清晰明瞭)
1. import java.io.IOException;
2.
3. import org.apache.zookeeper.CreateMode;
4. import org.apache.zookeeper.KeeperException;
5. import org.apache.zookeeper.Watcher;
6. import org.apache.zookeeper.ZooDefs.Ids;
7. import org.apache.zookeeper.ZooKeeper;
8.
9. public class demo {
10. // 會話超時時間,設置爲與系統默認時間一致
11. private static final int SESSION_TIMEOUT=30000;
12.
13. // 建立 ZooKeeper 實例
14. ZooKeeper zk;
15.
16. // 建立 Watcher 實例
17. Watcher wh=new Watcher(){
18. public void process(org.apache.zookeeper.WatchedEvent event)
19. {
20. System.out.println(event.toString());
21. }
22. };
23.
24. // 初始化 ZooKeeper 實例
25. private void createZKInstance() throws IOException
26. {
27. zk=new ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT,this.wh);
28.
29. }
30.
31. private void ZKOperations() throws IOException,InterruptedException,KeeperException
32. {
33. System.out.println("\n1. 建立 ZooKeeper 節點 (znode : zoo2, 數據: myData2 ,權限: OPEN_ACL_UNSAFE ,節點類型: Persistent");
34. zk.create("/zoo2","myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
35.
36. System.out.println("\n2. 查看是否建立成功: ");
37. System.out.println(new String(zk.getData("/zoo2",false,null)));
38.
39. System.out.println("\n3. 修改節點數據 ");
40. zk.setData("/zoo2", "shenlan211314".getBytes(), -1);
41.
42. System.out.println("\n4. 查看是否修改爲功: ");
43. System.out.println(new String(zk.getData("/zoo2", false, null)));
44.
45. System.out.println("\n5. 刪除節點 ");
46. zk.delete("/zoo2", -1);
47.
48. System.out.println("\n6. 查看節點是否被刪除: ");
49. System.out.println(" 節點狀態: ["+zk.exists("/zoo2", false)+"]");
50. }
51.
52. private void ZKClose() throws InterruptedException
53. {
54. zk.close();
55. }
56.
57. public static void main(String[] args) throws IOException,InterruptedException,KeeperException {
58. demo dm=new demo();
59. dm.createZKInstance( );
60. dm.ZKOperations();
61. dm.ZKClose();
62. }
63.}
此類包含兩個主要的 ZooKeeper 函數,分別爲 createZKInstance ()和 ZKOperations ()。其中 createZKInstance ()函數負責對 ZooKeeper 實例 zk 進行初始化。 ZooKeeper 類有兩個構造函數,咱們這裏使用 「 ZooKeeper ( String connectString, , int sessionTimeout, , Watcher watcher )」對其進行初始化。所以,咱們須要提供初始化所需的,鏈接字符串信息,會話超時時間,以及一個 watcher 實例。 17 行到 23 行代碼,是程序所構造的一個 watcher 實例,它可以輸出所發生的事件。
ZKOperations ()函數是咱們所定義的對節點的一系列操做。它包括:建立 ZooKeeper 節點( 33 行到 34 行代碼)、查看節點( 36 行到 37 行代碼)、修改節點數據( 39 行到 40 行代碼)、查看修改後節點數據( 42 行到 43 行代碼)、刪除節點( 45 行到 46 行代碼)、查看節點是否存在( 48 行到 49 行代碼)。另外,須要注意的是:在建立節點的時候,須要提供節點的名稱、數據、權限以及節點類型。此外,使用 exists 函數時,若是節點不存在將返回一個 null 值。
源碼來源: minglisoft.cn/technology java