ZooKeeper
ZooKeeper:ZooKeeper是一種分佈式協調服務,用於管理大型主機。
分佈式應用:分佈式應用可以在給定時間(同時)在網絡中的多個系統上運行,通過協調它們以快速有效的方式完成特定任務
分佈式應用有兩部分:Server(服務器) 和 Client(客戶端) 應用程序。
- 服務器應用程序:實際上是分佈式的,並具有通用接口,以便客戶端可以連接到集羣中的任何服務器並獲得相同的結果。
- 客戶端應用程序:是與分佈式應用進行交互的工具。
分佈式應用的優點:
- 可靠性:單個或幾個系統的故障不會使整個系統出現故障。
- 可擴展性:可以在需要時增加性能,通過添加更多機器,在應用程序配置中進行微小的更改,而不會有停機時間。
- 透明性:隱藏系統的複雜性,並將其顯示爲單個實體/應用程序。
分佈式應用的缺點:
- 競爭條件:兩個或多個機器嘗試執行特定任務,實際上只需在任意給定時間由單個機器完成。例如,共享資源只能在任意給定時間由單個機器修改。
- 死鎖:兩個或多個操作等待彼此無限期完成
- 不一致:數據的部分失敗。
Apache ZooKeeper是由集羣(節點組)使用的一種服務,用於在自身之間協調,並通過穩健的同步技術維護共享數據。ZooKeeper本身是一個分佈式應用程序,爲寫入分佈式應用程序提供服務。
ZooKeeper集羣奇數個節點的原因:
- 防止由腦裂造成的集羣不可用
- 在容錯能力相同的情況下,奇數臺更節省資源。
ZooKeeper提供的常見服務如下 :
-
命名服務:按名稱標識集羣中的節點。它類似於DNS,但僅對於節點。
-
配置管理:加入節點的最近的和最新的系統配置信息。
-
集羣管理:實時地在集羣和節點狀態中加入/離開節點。
-
選舉算法:選舉一個節點作爲協調目的的leader。
-
分佈式鎖和隊列同步服務:在修改數據的同時鎖定數據。此機制可幫助你在連接其他分佈式應用程序(如Apache HBase)時進行自動故障恢復。
-
高度可靠的數據註冊表:即使在一個或幾個節點關閉時也可以獲得數據。
ZooKeeper的好處:
- 簡單的分佈式協調過程
- 最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖,這是zookeeper最重要的性能。
- 實時性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得服務器的更新信息,或者服務器失效的信息。
- 序列化:根據特定規則對數據進行編碼。確保應用程序運行一致。這種方法可以在MapReduce中用來協調隊列以執行運行的線程。
- 可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺服務器接受,那麼它將被所有的服務器接受。
- 原子性:數據轉移完全成功或完全失敗,但沒有事務是部分的。
- 等待無關(wait-free):慢的或者失效的client不得干預快速的client的請求,使得每個client都能有效的等待。
分佈式與數據複製:Zookeeper作爲一個集羣提供一致的數據服務,自然,它要在所有機器間做數據複製。
數據複製的好處:
- 容錯:一個節點出錯,不致於讓整個系統停止工作,別的節點可以接管它的工作;
- 提高系統的擴展能力:把負載分佈到多個節點上,或者增加節點來提高系統的負載能力;
- 提高性能:讓客戶端本地訪問就近的節點,提高用戶訪問速度。
從客戶端讀寫訪問的透明度來看,數據複製集羣系統分下面兩種:
-
寫主(WriteMaster):對數據的修改提交給指定的節點。讀無此限制,可以讀取任何一個節點。這種情況下客戶端需要對讀與寫進行區別,俗稱讀寫分離;
-
寫任意(Write Any):對數據的修改可提交給任意的節點,跟讀一樣。這種情況下,客戶端對集羣節點的角色與變化透明。
zookeeper安裝:
獨立配置的ZooKeeper集羣,進程名稱QuorumPeerMain
單機模式
Zookeeper 的配置文件在 conf 目錄下,這個目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名爲 zoo.cfg,因爲 Zookeeper 在啓動時會找這個文件作爲默認配置文件。
1 tickTime=2000
2 dataDir=D:/devtools/zookeeper-3.2.2/build
3 clientPort=2181
下面詳細介紹一下,這個配置文件中各個配置項的意義。
- tickTime:這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
- dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
- clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
集羣模式
集羣模式除了上面的三個配置項還要增加下面幾個配置項:
1. initLimit=5
2. syncLimit=2
3. server.1=192.168.211.1:2888:3888
4. server.2=192.168.211.2:2888:3888
- initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 5 * 2000=10 秒
- syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2 * 2000=4 秒
- server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
zookeeper的節點類型:
-
PERSISTENT(持久化目錄節點):客戶端與zookeeper斷開連接後,該節點依舊存在
-
PERSISTENT_SEQUENTIAL(持久化順序編號目錄節點):客戶端與zookeeper斷開連接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
-
EPHEMERAL(臨時目錄節點):客戶端與zookeeper斷開連接後,該節點被刪除
-
EPHEMERAL_SEQUENTIAL(臨時順序編號目錄節點):客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
ZooKeeper 角色:(zookeeper服務主要有兩個角色leader和follower)
ZooKeeper工作原理:
Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分 別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和 leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。
爲了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。
每個Server在工作過程中有三種狀態:
-
LOOKING:當前Server不知道leader是誰,正在搜尋
-
LEADING:當前Server即爲選舉出來的leader
-
FOLLOWING:leader已經選舉出來,當前Server與之同步
zookeeper中的命令
連接到Zookeeper服務
zkCli.sh -server hadoop2:2181
可用命令
help
使用ls命令查看當前Zookeeper中所包含的內容
ls
創建一個新的Znode節點"aa",以及和它相關字符,默認是不帶編號的
create /aa "my first zk"
創建帶編號的持久性節點"bb",
create -s /bb "the bb node"
創建不帶編號的臨時節點"cc"
create -e /cc "the cc node"
創建帶編號的臨時節點"dd"
create -s -e /dd "the dd node"
關閉本次連接回話session,再重新打開一個連接
close
connect haddoop1:2181
獲取節點
get /aa
通過set命令來對zk所關聯的字符串進行設置
set /aa haha123
刪除節點
delete /aa
退出
quit
查看一個文件的狀態信息
stat /a
close
connect haddoop1:2181
獲取節點
get /aa
通過set命令來對zk所關聯的字符串進行設置
set /aa haha123
刪除節點
delete /aa
退出
quit
查看一個文件的狀態信息
stat /a