zookeeper安裝和簡單使用java
下載zookeeper-3.4.6,解壓縮到一個目錄。修改conf目錄下的配置文件爲zoo.cfg,使用默認的參數。以下,node
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper clientPort=2181
這個版本的zookeeper提供windows的啓動腳本,因此直接啓動腳本就能夠了。shell
zookeeper 默認的端口號爲2181。啓動後以下,數據庫
C:\Users\Lenovo>netstat -anob|findstr "2181" C:\Users\Lenovo>netstat -anob|findstr "2181" TCP 0.0.0.0:2181 0.0.0.0:0 LISTENING 5148 TCP [::]:2181 [::]:0 LISTENING 5148
能夠看到2181端口啓動成功。windows
如今使用windows的客戶端腳本啓動zookeeper的客戶端。
安全
以下,運行help查看命令行的幫助。服務器
[zk: localhost:2181(CONNECTED) 6] help ZooKeeper -server host:port cmd args stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history redo cmdno printwatches on|off delete path [version] sync path listquota path rmr path get path [watch] create [-s] [-e] path data acl addauth scheme auth quit getAcl path close connect host:port [zk: localhost:2181(CONNECTED) 7]
能夠運行簡單的命令,以下,ls命令和stat命令,架構
[zk: localhost:2181(CONNECTED) 7] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 8] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0xe cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1
如今使用create命令在根目錄下創建一個目錄以下,
分佈式
[zk: localhost:2181(CONNECTED) 9] create /zk_test mydata Created /zk_test [zk: localhost:2181(CONNECTED) 10] ls / [zookeeper, zk_test]
如今使用get命令查看zk_test目錄的信息,以下,oop
[zk: localhost:2181(CONNECTED) 11] get /zk_test mydata cZxid = 0x14 ctime = Sun Mar 15 16:47:09 CST 2015 mZxid = 0x14 mtime = Sun Mar 15 16:47:09 CST 2015 pZxid = 0x14 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
如今可使用set命令設置目錄 zk_test的數據,以下,
[zk: localhost:2181(CONNECTED) 12] set /zk_test junk cZxid = 0x14 ctime = Sun Mar 15 16:47:09 CST 2015 mZxid = 0x15 mtime = Sun Mar 15 16:50:36 CST 2015 pZxid = 0x14 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 [zk: localhost:2181(CONNECTED) 13] get /zk_test junk cZxid = 0x14 ctime = Sun Mar 15 16:47:09 CST 2015 mZxid = 0x15 mtime = Sun Mar 15 16:50:36 CST 2015 pZxid = 0x14 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0
最後使用delete命令刪除目錄,以下,
[zk: localhost:2181(CONNECTED) 14] delete /zk_test [zk: localhost:2181(CONNECTED) 15] get /zk_test Node does not exist: /zk_test [zk: localhost:2181(CONNECTED) 16] ls / [zookeeper]
以上就是zookeeper的安裝和客戶端的使用。
ZooKeeper 的客戶端-服務器架構
ZooKeeper 有一個相似於文件系統的數據模型,由 znodes 組成。能夠將 znodes(ZooKeeper 數據節點)視爲相似 UNIX 的傳統系統中的文件,但它們能夠有子節點。另外一種方式是將它們視爲目錄,它們能夠有與其相關的數據。每一個這些目錄都被稱爲一個 znode。圖 2 顯示的圖顯示zookeeper的目錄結構,
znode 層次結構被存儲在每一個 ZooKeeper 服務器的內存中。這實現了對來自客戶端的讀取操做的可擴展的快速響應。每一個 ZooKeeper 服務器還在磁盤上維護了一個事務日誌,記錄全部的寫入請求。由於 ZooKeeper 服務器在返回一個成功的響應以前必須將事務同步到磁盤,因此事務日誌也是 ZooKeeper 中對性能最重要的組成部分。能夠存儲在 znode 中的數據的默認最大大小爲 1 MB。所以,即便 ZooKeeper 的層次結構看起來與文件系統類似,也不該該將它用做一個通用的文件系統。相反,應該只將它用做少許數據的存儲機制,以便爲分佈式應用程序提供可靠性、可用性和協調。
當客戶端請求讀取特定 znode 的內容時,讀取操做是在客戶端所鏈接的服務器上進行的。所以,因爲只涉及集合體中的一個服務器,因此讀取是快速和可擴展的。然而,爲了成功完成寫入操做,要求 ZooKeeper 集合體的嚴格意義上的多數節點都是可用的。在啓動 ZooKeeper 服務時,集合體中的某個節點被選舉爲領導者。當客戶端發出一個寫入請求時,所鏈接的服務器會將請求傳遞給領導者。此領導者對集合體的全部節點發出相同的寫入請求。若是嚴格意義上的多數節點(也被稱爲法定數量(quorum))成功響應該寫入請求,那麼寫入請求被視爲已成功完成。而後,一個成功的返回代碼會返回給發起寫入請求的客戶端。若是集合體中的可用節點數量未達到法定數量,那麼 ZooKeeper 服務將不起做用。
法定數量是經過嚴格意義上的多數節點來表示的。在集合體中,能夠包含一個節點,但它不是一個高可用和可靠的系統。若是在集合體中有兩個節點,那麼這兩個節點都必須已經啓動並讓服務正常運行,由於兩個節點中的一個並非嚴格意義上的多數。若是在集合體中有三個節點,即便其中一個停機了,您仍然能夠得到正常運行的服務(三個中的兩個是嚴格意義上的多數)。出於這個緣由,ZooKeeper 的集合體中一般包含奇數數量的節點,由於就容錯而言,與三個節點相比,四個節點並不佔優點,由於只要有兩個節點停機,ZooKeeper 服務就會中止。在有五個節點的集羣上,須要三個節點停機纔會致使 ZooKeeper 服務中止運做。
如今,咱們已經清楚地瞭解到,節點數量應該是奇數,讓咱們再來思考一下 ZooKeeper 集合體中須要有多少個節點。讀取操做始終從鏈接到客戶端的 ZooKeeper 服務器讀取數據,因此它們的性能不會隨着集合體中的服務器數量額變化而變化。可是,僅在寫入法定數量的節點時,寫入操做纔是成功的。這意味着,隨着在集合體中的節點數量的增長,寫入性能會降低,由於必須將寫入內容寫入到更多的服務器中,並在更多服務器之間進行協調。
ZooKeeper 的美妙之處在於,想運行多少服務器徹底由您本身決定。若是想運行一臺服務器,從 ZooKeeper 的角度來看是沒問題的;只是您的系統再也不是高度可靠或高度可用的。三個節點的 ZooKeeper 集合體支持在一個節點故障的狀況下不丟失服務,這對於大多數用戶而言,這多是沒問題的,也能夠說是最多見的部署拓撲。不過,爲了安全起見,能夠在您的集合體中使用五個節點。五個節點的集合體讓您能夠拿出一臺服務器進行維護或滾動升級,並可以在不中斷服務的狀況下承受第二臺服務器的意外故障。
所以,在 ZooKeeper 集合體中,3、五或七是最典型的節點數量。請記住,ZooKeeper 集合體的大小與分佈式系統中的節點大小沒有什麼關係。分佈式系統中的節點將是 ZooKeeper 集合體的客戶端,每一個 ZooKeeper 服務器都可以以可擴展的方式處理大量客戶端。例如,HBase(Hadoop 上的分佈式數據庫)依賴於 ZooKeeper 實現區域服務器的領導者選舉和租賃管理。您能夠利用一個相對較少(好比說,五個)節點的 ZooKeeper 集合體運行有 50 個節點的大型 HBase 集羣。
參考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
http://www.ibm.com/developerworks/cn/data/library/bd-zookeeper/
http://ifeve.com/zookeeper-leader/
http://greemranqq.iteye.com/blog/2171449
=============END=============