系統要求
支持的平台
ZooKeeper由多個組件組成。某些組件得到廣泛支持,其他組件僅在較小的平台上受支持。
- 客戶端是Java客戶端庫,應用程序使用它連接到ZooKeeper集合。
- Server是在ZooKeeper集合節點上運行的Java服務器。
- Native Client是一個用C實現的客戶端,類似於Java客戶端,應用程序使用它連接到ZooKeeper集合。
- Contrib是指多個可選的附加組件。
以下矩陣描述了為在不同操作系統平台上運行每個組件而提交的支持級別。
支持矩陣
操作系統 | 客戶 | 服務器 | 原生客戶端 | 的Contrib |
---|---|---|---|---|
GNU / Linux的 | 開發和生產 | 開發和生產 | 開發和生產 | 開發和生產 |
的Solaris | 開發和生產 | 開發和生產 | 不支持 | 不支持 |
FreeBSD的 | 開發和生產 | 開發和生產 | 不支持 | 不支持 |
視窗 | 開發和生產 | 開發和生產 | 不支持 | 不支持 |
Mac OS X. | 僅限發展 | 僅限發展 | 不支持 | 不支持 |
對於矩陣中未明確提及的任何操作系統,組件可能有效,也可能無效。ZooKeeper社區將修復針對其他平台報告的明顯錯誤,但沒有完全支持。
必備軟件
ZooKeeper在Java中運行,1.7或更高版本(JDK 7或更高版本,FreeBSD支持需要openjdk7)。它作為ZooKeeper服務器的集合運行。三個ZooKeeper服務器是整體的最小建議大小,我們還建議它們在不同的機器上運行。在Yahoo!,ZooKeeper通常部署在專用的RHEL盒子上,具有雙核處理器,2GB RAM和80GB IDE硬盤。
獨立操作(單機)
在獨立模式下設置ZooKeeper服務器非常簡單。服務器包含在單個JAR文件中,因此安裝包括創建配置。
下載完一個穩定的ZooKeeper版本后,將其解壓縮並cd到root
要啟動ZooKeeper,您需要一個配置文件。這是一個示例,在conf / zoo.cfg中創建它:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
這個文件可以直接被引用,但為了這個目的,請將其命名為conf / zoo.cfg。更改dataDir的值以指定現有(從空開始)目錄。以下是每個字段的含義:
-
tickTime:ZooKeeper使用的基本時間單位(以毫秒為單位)。它用於做心跳,最小會話超時將是tickTime的兩倍。
-
dataDir:存儲內存數據庫快照的位置,除非另有說明,否則為數據庫更新的事務日志。
-
clientPort:偵聽客戶端連接的端口
現在您已創建配置文件,您可以啟動ZooKeeper:
bin/zkServer.sh start
ZooKeeper使用log4j記錄消息 - 更多詳細信息,請參閱Programmer's Guide 的Logging部分。您將看到日志消息進入控制台(默認)和/或日志文件,具體取決於log4j配置。
此處列出的步驟在獨立模式下運行ZooKeeper。沒有復制,因此如果ZooKeeper進程失敗,服務將關閉。這適用於大多數開發情況,但要在復制模式下運行ZooKeeper,請參閱運行Replicated ZooKeeper。
管理ZooKeeper存儲
對於長期運行的生產系統,必須在外部管理ZooKeeper存儲(dataDir和logs)。有關詳細信息,請參閱維護部分。
連接到ZooKeeper
$ bin/zkCli.sh -server 127.0.0.1:2181
這使您可以執行簡單的文件操作。
連接后,您應該看到類似的內容:
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]
在shell中,鍵入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
create path data acl
stat path [watch]
listquota path
history
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
deleteall path
setquota -n|-b val path
從這里,您可以嘗試一些簡單的命令來感受這個簡單的命令行界面。首先,從發出list命令開始,如ls
:,產生:
[zkshell: 8] ls /
[zookeeper]
接下來,通過運行創建一個新的znode create /zk_test my_data
。這將創建一個新的znode並將字符串“my_data”與節點相關聯。你應該看到:
[zkshell: 9] create /zk_test my_data
Created /zk_test
發出另一個ls /
命令以查看目錄的外觀:
[zkshell: 11] ls /
[zookeeper, zk_test]
請注意,現在已創建zk_test目錄。
接下來,通過運行get
命令驗證數據是否與znode相關聯,如下所示:
[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
命令來更改與zk_test關聯的數據,如下所示:
[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
(注意我們get
在設置數據之后做了一次,確實改變了。
最后,讓我們delete
通過發出以下節點:
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
這就是現在。要了解更多信息,請繼續閱讀本文檔的其余部分,並參閱“ 程序員指南”。
編程到ZooKeeper
ZooKeeper具有Java綁定和C綁定。它們在功能上是等價的。C綁定有兩種變體:單線程和多線程。這些僅在消息傳遞循環的完成方式上有所不同。有關更多信息,請參閱ZooKeeper程序員指南中的編程示例,了解使用不同API的示例代碼。
運行復制的ZooKeeper(集群)
在獨立模式下運行ZooKeeper便於評估,開發和測試。但在生產中,您應該以復制模式運行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用於限制仲裁中ZooKeeper服務器連接到領導者的時間長度。條目syncLimit限制服務器與領導者的過期時間。
使用這兩個超時,您可以使用tickTime指定時間單位。在這個例子中,initLimit的超時是2000個milleseconds(滴答)或10秒的5個滴答。
表單server.X的條目列出構成ZooKeeper服務的服務器。當服務器啟動時,它通過在數據目錄中查找文件myid來知道它是哪個服務器。該文件包含服務器編號,ASCII格式。
最后,記下每個服務器名稱后面的兩個端口號:“2888”和“3888”。對等方使用以前的端口連接到其他對等方。這種連接是必要的,以便對等方可以進行通信,例如,就更新的順序達成一致。更具體地說,ZooKeeper服務器使用此端口將關注者連接到領導者。當新的領導者出現時,跟隨者使用此端口打開與領導者的TCP連接。由於默認的領導者選舉也使用TCP,我們目前需要另一個端口進行領導者選舉。這是服務器條目中的第二個端口。
設置日志路徑
修改 bin/zkEnv.sh 文件
依次啟動后通過查看狀態可見
注意
如果要在一台計算機上測試多個服務器,請將servername指定為localhost,並為該服務器中的每個server.X 指定唯一的仲裁和領導者選舉端口(即上例中的2888:3888,2889:3889,2890:3890)。配置文件。當然,單獨的_dataDir_s和distinct _clientPort_s也是必需的(在上面復制的例子中,在單個localhost上運行,你仍然會有三個配置文件)。
請注意,在一台計算機上設置多台服務器不會產生任何冗余。如果發生導致機器死亡的事情,所有zookeeper服務器都將脫機。完全冗余要求每台服務器都有自己的機器。它必須是完全獨立的物理服務器。同一物理主機上的多個虛擬機仍然容易受到該主機的完全故障的影響。
其他優化
還有一些其他配置參數可以大大提高性能:
- 要在更新時獲得較低的延遲,請務必擁有專用的事務日志目錄。默認情況下,事務日志與數據快照和myid文件放在同一目錄中。dataLogDir參數指示用於事務日志的不同目錄。
安裝zkui
1.下載項目https://github.com/DeemOpen/zkui
2.使用maven編譯jar包
3.上傳生成的兩個jar包中的 zkui-2.0-SNAPSHOT-jar-with-dependencies.jar,和最外層目錄下的文件 config.cfg 到服務器,這兩個文件要放在一起。(或者直接在linux上打包需要安裝maven環境)
4.直接正常啟動 java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar
5.修改config.cfg文件
6.啟動完成后,直接通過瀏覽器 ip:9090 查看對應ip下的zk情況
效果圖