定義
Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.
ZooKeeper是一個開源的,高可靠性的分布式系統協調器,它公開了一些常用的服務,如命名,配置管理,同步和組服務,你可以用它來共識、組管理、領匯入選舉和出席協議,甚至可以根據自己的需求來構建它.
特點
1.簡單
zookeeper實作分布式協調的功能是通過一個共享的層級空間,類似于標準的檔案系統,它有所謂的znodes組成,即類似檔案系統中的檔案和目錄,但是跟檔案系統不同的是,它不是用來存盤的,他的資料保存在記憶體中,這樣可以達到高吞吐低延遲的目標,在CAP理論中,zookeeper保證了CP即一致性和磁區容錯性,
2.可靠
zk通過一組集群來保證高度的可靠,如下圖zookeeper集群當中broker相互都知道對方的存在,它們的資料狀態都維護在記憶體,同時在磁盤會有失誤日志和資料快照,只要大部分server有效就能保證zk有效,

3.順序一致性
zk為每個更新添加一個反映所有ZooKeeper事務順序的數字,后續操作可以使用該順序來實作更高級別的抽象,例如同步原語
4.快
它在“以讀為主”的作業負載中尤其快,ZooKeeper應用程式運行在數千臺機器上,在讀操作比寫操作更常見的情況下,它的性能最好,其比率大約為10:1,
5.類似檔案系統的模型架構
zk提供的命名空間非常類似于標準檔案系統的名稱空間,名稱是由斜杠(/)分隔的路徑元素序列,zk命名空間中的每個節點都由路徑標識,

6.永久節點和臨時節點
znode維護一個stat結構,其中包括資料更改、ACL更改和時間戳的版本號,以允許快取驗證和協調更新,每次znode的資料更改時,版本號都會增加,例如,每當客戶機檢索資料時,它也會收到資料的版本,存盤在命名空間中每個znode的資料是以原子方式讀寫的,Reads獲取與znode關聯的所有資料位元組,write替換所有資料,每個節點都有一個訪問控制串列(ACL),它限制了誰可以做什么,
臨時節點:只要創建znode的會話處于活動狀態,這些znode就存在,會話結束時,znode被洗掉,
7.事件監聽
ZooKeeper允許用戶在指定節點上注冊一些 Watcher,并且在一些特定事件觸發的時候,ZooKeeper服務端會將事件通知到感興趣的客戶端上去,該機制是 ZooKeeper 實作分布式協調服務的重要特性
8.簡單的API
- create : 創建節點
- delete : 洗掉節點
- exists : 判斷節點是否存在
- get data : 讀取節點資料
- set data : 寫節點資料
- get children : 獲取子節點
- sync : 等待資料傳播
下載安裝
下載地址: https://zookeeper.apache.org/releases.html#download 解壓到合適目錄,測驗版本3.5.5

將conf下樣例組態檔zoo_sample.cfg復制一份重來命名為zoo.cfg,配置下資料目錄和日志目錄,接下來啟動測驗
服務端啟動:zkServer.cmd
客戶端啟動:zkCli.cmd


啟動服務端時似乎埠被占用,所以再加個配置項
admin.serverPort=8888
同時看到myid值為空,window下測驗時也沒有生成myid檔案,默認會去dataDir配置的目錄找這個檔案,可自己創建一個myid檔案并在檔案里寫入一個序號標識該服務器,注意檔案名為myid而不是myid.txt
服務端啟動后可以看到有個java.exe 偵聽埠2181

啟動客戶端


集群模式
zk的安裝模式可以分為3種,分別為:單機模式,集群模式和偽集群模式,上面演示的即為單機模式;通過多臺集群提供服務即為集群模式;一臺電腦還可以進行偽集群模式,即在一臺物理電腦上運行多個zk實體,
集群模式是通過組態檔的配置項來設定,主要涉及的配置項如下:
initLimit=10
syncLimit=5
server.1=192.168.191.1:2888:3888
server.2=192.168.191.2:2888:3888
-
initlimit:用來配置zk接受客戶端(指zk集群中連接都leader的follower服務器)初始化連接時最長能忍受多少個心跳時間間隔數,當已經超過10個心跳時間(即tickTime)長度后zk服務器還沒有收到客戶端回傳的資訊,那么表明這個客戶端連接失敗,總時間長度為10*2000=20s
-
synclimit:標識leader和follower之間發送訊息,請求和應答時間長度,最長不能超過多少個ticktime的時間長度,總時間程度為:5*2000=10s
-
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集群中的 Leader 服務器交換資訊的埠;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時服務器相互通信的埠,通俗一點講就是C埠用于集群內部通信,D埠用于leader選舉,如果是偽集群的配置方式,由于 B 都是一樣,所以不同的 Zookeeper 實體通信埠號不能一樣,所以要給它們分配不同的埠號,
集群模式下還需要修改一個檔案myid,這個檔案在dataDir目錄下,這個檔案里面就有一個資料就是 A 的值,Zookeeper 啟動時會讀取這個檔案,拿到里面的資料與 zoo.cfg 里面的配置資訊比較從而判斷到底是哪個 server,
對于集群模式,至少需要三臺服務器,強烈建議使用奇數個服務器,如果您只有兩臺服務器,那么您將處于這樣一種情況:如果其中一臺服務器發生故障,則沒有足夠的計算機組成多數仲裁,兩臺服務器天生就比一臺服務器不穩定,因為有兩個單點故障
接下來我們做一個為集群模式的測驗,配置出3個zk實體
-
組態檔修改,zoo.cfg檔案配置出3份

回應的在各自的datadir下創建自己的myid檔案,注意無后綴名,內容為1,2,3 分別用來表示第幾號服務器 -
服務端啟動組態檔,同樣復制3份

-
啟動服務
當啟動第1個cmd檔案zkServer1.cmd時,會報如下錯誤,啟動第2個cmd檔案zkServer2.cmd就正常了,依次啟動zkserver1.cmd,zkserver2.cmd,zkserver3.cmd,報錯資訊是zookeeper的Leader選舉演算法的例外資訊,當節點沒有啟動完畢的時候,Leader無法正常進行作業,這種錯誤資訊是可以忽略的,等其他節點啟動之后就正常了,

? 3個埠已全部啟動

參考鏈接 https://zookeeper.apache.org/doc/r3.6.2/zookeeperOver.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88996.html
標籤:Java
上一篇:URL及日期等特殊資料格式處理-JSON框架Jackson精解第2篇
下一篇:Yii偽靜態設定
