zookeeper 入門指南
原文地址: http://zookeeper.apache.org/doc/r3.4.8/zookeeperStarted.html
使用zookeeper進行分佈式協調應用程序
本文介紹zookeeper快速入門. 本文主要爲那些希望嘗試zookeeper研發人員,介紹簡單的安裝, 少許驗證zookeeper狀態的指令, 和一些編程實例. 最後順便介紹少許的集羣的安裝部署和事務日誌的優化. 如果想要在商業環境上使用zookeeper, 可以查看zookeeper 管理員指導手冊.
準備工作
在管理員指導頁面查看 System Requirements
下載
如果想獲取具有分佈式特性zookeeper,建議從Apache下載一個最新穩定版版本
單機操作
將zookeeper安裝在一臺機器上非常簡單. zookeeper被打包在一個簡單的JAR文件中, 所以安裝需要創建一個配置文件.
下載了穩定版的zookeeper後, 解壓, 並進入解壓文件的根目錄中
由於啓動zookeeper 需要一個配置文件. 在這裏介紹一個實例: 創建conf/zoo.cfg:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
這個文件可以叫任意名字, 爲了演示這裏命名爲conf/zoo.cfg. 將dataDir的值指定到一個空的文件夾中. 詳細字段含義如下:
- tickTime
單位是毫秒, 用於心跳,配置最小session超時時間. - dataDir
dataDir用於存儲內存級數據庫的鏡像, 除非特別配置,否則事務日誌也將更新到數據庫中 - clientPort
監聽client連接的端口
現在已經創建了配置文件, 啓動zookeeper
bin/zkServer.sh start
zookeeper的日誌管理使用的是log4j – 更過的詳細配置可以再研發指導中日誌篇查看. 你可以在控制檯或者配置log4j配置來查看日誌信息.
啓動zookeeper單機模式已講到這裏. 由於沒有集羣, 所以如果zookeeper處理出現問題, 服務就會停止. 對於開發中單機版是夠用的, 但如果要運行集羣模式下面將會介紹.
存儲管理
如果要在生產環境上長期運行zookeeper, dataDir和logs 就比較進行管理. 詳細內容將在maintenace介紹.
zookeeper連接
連接zookeeper 需要幾個服務選項:
- Java:
bin/zkCli.sh -server 127.0.0.1:2181
C: 通過make cli_mt 或者make cli_st編譯
運行可以使用
LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181
或者是
LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181
一旦連接上zookeeper , 可以看到類似這樣的信息:
Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]
使用help指令可以列舉出所有客戶端的操作指令
[zkshell: 0] help
ZooKeeper host:port cmd args
get path [watch]
ls path [watch]
set path data [version]
delquota [-n|-b] path
quit
printwatches on|off
createpath data acl
stat path [watch]
listquota path
history
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path
到這裏, 你可以嘗試簡單的命令. 首先ls 命令
[zkshell: 8] ls /
[zookeeper]
接下來,創建一個新節點zk_test,並賦值內容爲my_data create /zk_test my_data .
[zkshell: 9] create /zk_test my_data
Created /zk_test
再次,輸入ls / 查看目錄結構
[zkshell: 11] ls /
[zookeeper, zk_test]
注意現在zk_test目錄已經創建成功.
如果要查看節點內容的數據,可以使用get指令
[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0
我們可以通過set 命令改變節點的數據內容
[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
最後我們使用delete 刪除一個節點
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
示例就到這裏,查看更多請查看Programmer’s Guide.
- zookeeper編程
zookeeper 具有Java和C 版本. 它們在功能上都是等價的. C語言版本具有兩個不同的分支: 單線程和多線程. 它們在管理輪詢上有些不同. 更多信息示例可以查看Programming Examples in the ZooKeeper Programmer’s Guide - 集羣
對於大多數開發,測試,和技術選項過成功使用單機版zookepper是非常方便的. 但是在生產環境中, 應該使用集羣模式. 集羣由一組相同的叫做quorum應用服務器組成; 在集羣模式下,所有的服務器都具有相同配置文件.
注: 在集羣模式下,三臺服務器是集羣的最少數量, zookeeper 強力建議使用奇數個服務器. 如果你只使用了兩天服務器, 如果一個發生故障,它們就無法形成一個大部分仲裁的形式. 兩臺服務器的形式要比一臺服務器更不穩定,因爲它們具有兩個單點故障.
在集羣模式下conf/zoo.cfg文件是必不可少的, 配置信息與單機模式配置只有少許不同:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
initLimit 是一個超時時間, zookeeper使用它限制仲裁服務器連接leader的時間(5 * tickTime = 10秒).
syncLimit 是仲裁服務器與leader服務器斷開時間的大小(2 * tickTime = 4秒).
這兩個超時時間的單位都是tickTime
server.x列表構成了zookeeper的服務. 當服務器啓動時候,它通過數據目錄下的myid文件 知道自己是哪一個server. 文件中記錄有服務器的ASCII數值.
最後, 注意server名稱後面兩個數值端口:”2888”和”3888”. 每個服務器都使用前一個端口去連接其他服務器. 這樣一個連接是必須的, 只有這樣所有的服務器纔可以進行通信, 例如: 根據順序更新操作進行響應. 具體來說, 一個zookeeper服務器使用這個端口連接followers到leader. 當一個新的leader出現時候, follower將開啓TCP連接到leader,就使用這個端口. 由於默認leader選舉的時候也需要使用TCP,我們當前需要另外一個端口用於leader選舉. 這個端口就是後面的端口.
注意: 如果你想在單機上測試多服務器操作, 在每個server.x配置文件,指定服務器名稱爲唯一衝裁編號和leader選舉端口(例如: 2888:3888, 2889:3889, 2890:3890). 當然分隔dataDirs和區分clientPort是必須的.
要知道在單物理機上設置多個服務程序,這樣並不能做出冗餘. 如果發生機器宕機, 所有的zookeeper服務都將下線. 冗餘備份需要每個服務器都有自己的物理機.