文章目錄:
1.1:什麼是Zookeeper
1.2:Zookeeper的集羣結構
1.3:Zookeeper的選舉機制
1.4:Zookeeper的作用
1.1:什麼是Zookeeper
Zookeeper英譯:動物管理員
Zookeeper是分佈式集羣中的大管家
分佈式集羣系統比較複雜,子模塊很多,但是子模塊往往不是孤立存在的,它們彼此之間需要協作和交互,各個子系統就好比動物園裏的動物,爲了使各個子系統能正常爲用戶提供統一的服務,必須需要一種機制來進行協調——這就是ZooKeeper
Zookeeper 是爲分佈式應用程序提供高性能協調服務的工具集合,也是Google的Chubby一個開源的實現,是Hadoop 的子項目
1.2:Zookeepe的集羣結構
在Zookeeper集羣中,主要分爲三者角色,而每一個節點同時只能扮演一種角色,這三種角色分別是:
> leader 負責進行投票的發起和決議,監控集羣中的節點是否存活(心跳機制),進行分配資源
> follower 用於接受客戶端請求並向客戶端返回結果,在選主過程中參與投票
>observer 與follower不同,observer不參與選舉
A:Zookeeper:一個leader,多個follower/observer組成的集羣
B:全局數據一致:每個server保存一份相同的數據副本,client無論連接到哪個server,數據都是一致的
C:數據更新原子性,一次數據更新要麼成功,要麼失敗
D:實時性,在一定時間範圍內,client能讀到最新數據
E:半數機制:整個集羣中只要有一半以上存活,就可以提供服務。因此通常Zookeeper由2n+1臺servers組成,每個server都知道彼此的存在。每個server都維護的內存狀態鏡像以及持久化存儲的事務日誌和快照。爲了保證Leader選舉能過得到多數的支持,所以ZooKeeper集羣的數量一般爲奇數。對於2n+1臺server,只要有n+1臺(大多數)server可用,整個系統保持可用
1.3:Zookeeper的選舉機制
zookeeper中有三種選舉算法
>LeaderElection
>FastLeaderElection(默認算法)
>AuthLeaderElection
首先介紹幾個名詞的含義
服務器ID
配置server時,給服務器標識的id,id越大在選擇算法中的權重越大
數據ID
服務器在運行時產生的數據id,id越大,表示數據越新而且在選舉算法中的權重越大
邏輯時鐘
或者叫投票的次數,同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數據就會增加,然後與接收到的其它服務器返回的投票信息中的數值相比,根據不同的值做出不同的判斷。
1.3.1、全新集羣選舉
以一個簡單的例子來說明整個選舉的過程.
假設有五臺服務器組成的zookeeper集羣,它們的id從1-5,同時它們都是最新啓動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的.假設這些服務器依序啓動,來看看會發生什麼.
1) 服務器1啓動,此時只有它一臺服務器啓動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態
2) 服務器2啓動,它與最開始啓動的服務器1進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史數據,所以id值較大的服務器2勝出,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1,2還是繼續保持LOOKING狀態.
3) 服務器3啓動,根據前面的理論分析,服務器3成爲服務器1,2,3中的老大,而與上面不同的是,此時有三臺服務器選舉了它,所以它成爲了這次選舉的leader.
4) 服務器4啓動,根據前面的分析,理論上服務器4應該是服務器1,2,3,4中最大的,但是由於前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了.
5) 服務器5啓動,同4一樣,當小弟.
這種情況下如果啓動順序爲 53214:主爲5 13452:主爲4 31524:主爲5
1.3.2、非全新集羣選舉(當leader崩潰或者leader失去大多數的follower)
(1)每個server會將自己的(數據id 、服務器id 、邏輯時鐘)作爲廣播信息,廣播到集羣中所有的服務器(server)。然後等待集羣中的服務器(server)返回的選舉結果
(2)當某個服務器(server)收到其他server廣播過來的數據,它會對這些數據進行對比
第一步:比較邏輯時鐘
> 邏輯時鐘小的server,更新本機邏輯時鐘,重新選舉
第二步:邏輯時鐘一致的時候,根據數據id和服務器id推薦leader
>首先比較每個server的數據id,比如server1的數據id大,當前server就推薦server1爲leader
>如果最大的數據id有兩個server(server1和server2),但是server2的服務器id比server1大,那麼當前server就推 薦server2爲leader
第二步圖解:括號內容爲 (服務器id,數據id)
1.4:Zookeeper的作用
Zookeeper包含一個簡單的原語集,分佈式應用程序可以基於它實現命名服務、配置維護、集羣選主等:
>命名服務:註冊節點信息,形成有層次的目錄結構(類似Java的包名)。
>配置維護:配置信息的統一管理和動態切換。
>集羣選主:確保整個集羣中只有一個主,其它爲從。並且當主掛了後,可以從新選主