定義
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