天天看點

ZooKeeper 筆記(1) 安裝部署及hello world

先給一堆學習文檔,友善以後檢視

官網文檔位址大全:

OverView(概述)

<a href="http://zookeeper.apache.org/doc/r3.4.6/releasenotes.html#changes" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html</a>

Getting Started(開始入門)

<a href="http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html</a>

Tutorial(教程)

<a href="http://zookeeper.apache.org/doc/r3.4.6/zookeeperTutorial.html" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/zookeeperTutorial.html</a>

Java Example(Java示例)

<a href="http://zookeeper.apache.org/doc/r3.4.6/javaExample.html" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/javaExample.html</a>

Programmer's Guide(開發人員指南)

<a href="http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html</a>

Recipes and Solutions(技巧及解決方案)

<a href="http://zookeeper.apache.org/doc/r3.4.6/recipes.html" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/recipes.html</a>

3.4.6 API online(線上API速查)

<a href="http://zookeeper.apache.org/doc/r3.4.6/api/index.html" target="_blank">http://zookeeper.apache.org/doc/r3.4.6/api/index.html</a>

另外推薦園友sunddenly的zookeeper系列

<a href="http://www.cnblogs.com/sunddenly/category/620563.html" target="_blank">http://www.cnblogs.com/sunddenly/category/620563.html</a>

一、安裝部署

本文在一台機器上模拟3個 zk server的叢集安裝

1.1 下載下傳解壓

解壓到3個目錄(模拟3台zk server):

1.2 建立每個目錄下conf/zoo.cfg配置檔案 

/home/hadoop/zookeeper-1/conf/zoo.cfg 内容如下:

/home/hadoop/zookeeper-2/conf/zoo.cfg 内容如下:

/home/hadoop/zookeeper-3/conf/zoo.cfg 内容如下:

注:因為是在一台機器上模拟叢集,是以端口不能重複,這裡用2181~2183,2287~2289,以及3387~3389互相錯開。另外每個zk的instance,都需要設定獨立的資料存儲目錄、日志存儲目錄,是以dataDir、dataLogDir這二個節點對應的目錄,需要手動先建立好。

另外還有一個灰常關鍵的設定,在每個zk server配置檔案的dataDir所對應的目錄下,必須建立一個名為myid的檔案,其中的内容必須與zoo.cfg中server.x 中的x相同,即:

/home/hadoop/tmp/zk1/data/myid 中的内容為1,對應server.1中的1

/home/hadoop/tmp/zk2/data/myid 中的内容為2,對應server.2中的2

/home/hadoop/tmp/zk3/data/myid 中的内容為3,對應server.3中的3

生産環境中,分布式叢集部署的步驟與上面基本相同,隻不過因為各zk server分布在不同的機器,上述配置檔案中的localhost換成各伺服器的真實Ip即可。分布在不同的機器後,不存在端口沖突問題,可以讓每個伺服器的zk均采用相同的端口,這樣管理起來比較友善。

1.3 啟動驗證 

啟用成功後,輸入 jps 看下程序

20351 ZooKeeperMain

20791 QuorumPeerMain

20822 QuorumPeerMain

20865 QuorumPeerMain

應該至少能看到以上幾個程序。

可以啟動用戶端測試下:

(注:如果是遠端連接配接,把localhost換成指定的IP即可)

成功後,應該會進到提示符下,類似下面這樣:

[zk: localhost:2181(CONNECTED) 0]  

然後,就可以用一些基礎指令,比如 ls ,create ,delete ,get 來測試了(關于這些指令,大家可以檢視文檔),特别提一個很有用的指令rmr 用來遞歸删除某個節點及其所有子節點

二、java 與 zk的連接配接示例

2.1 maven項目的pom.xml中先添加以下依賴項

2.2 最基本的示例程式

2.3 與zk叢集的連接配接

zk的優點之一,就是高可用性,上面的代碼連接配接的是單台zk server,如果這台server挂了,自然代碼就會出錯,事實上zk的API考慮到了這一點,把連接配接代碼改成下面這樣:

 即:IP1:port1,IP2:port2,IP3:port3...  用這種方式連接配接叢集就行了,隻要有超過半數的zk server還活着,應用一般就沒問題。但是也有一種極罕見的情況,比如這行代碼執行時,剛初始化完成,正準備連接配接ip1時,因為網絡故障ip1對應的server挂了,仍然會報錯(此時,zk還來不及選出新leader),這個問題詳見:http://segmentfault.com/q/1010000002506725/a-1020000002507402,參考該文的做法,改成:

 但是這樣代碼未免太冗長,建議用開源的zkClient,官方位址: https://github.com/sgroschupf/zkclient,使用方法很簡單:

pom.xml先加這一坨,然後這樣用: