【分布式】Zookeeper與Paxos
一、前言
在學(xué)習(xí)了Paxos在Chubby中的應(yīng)用后,接下來學(xué)習(xí)Paxos在開源軟件Zookeeper中的應(yīng)用。
二、Zookeeper
Zookeeper是一個開源的分布式協(xié)調(diào)服務(wù),其設(shè)計目標(biāo)是將那些復(fù)雜的且容易出錯的分布式一致性服務(wù)封裝起來,構(gòu)成一個高效可靠的原語集,并以一些列簡單的接口提供給用戶使用。其是一個典型的分布式數(shù)據(jù)一致性的解決方案,分布式應(yīng)用程序可以基于它實現(xiàn)諸如數(shù)據(jù)發(fā)布/發(fā)布、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master選舉、分布式鎖和分布式隊列等功能。其可以保證如下分布式一致性特性。
① 順序一致性,從同一個客戶端發(fā)起的事務(wù)請求,最終將會嚴(yán)格地按照其發(fā)起順序被應(yīng)用到Zookeeper中去。
② 原子性,所有事務(wù)請求的處理結(jié)果在整個集群中所有機器上的應(yīng)用情況是一致的,即整個集群要么都成功應(yīng)用了某個事務(wù),要么都沒有應(yīng)用。
③ 單一視圖,無論客戶端連接的是哪個Zookeeper服務(wù)器,其看到的服務(wù)端數(shù)據(jù)模型都是一致的。
④ 可靠性,一旦服務(wù)端成功地應(yīng)用了一個事務(wù),并完成對客戶端的響應(yīng),那么該事務(wù)所引起的服務(wù)端狀態(tài)變更將會一直被保留,除非有另一個事務(wù)對其進行了變更。
⑤ 實時性,Zookeeper保證在一定的時間段內(nèi),客戶端最終一定能夠從服務(wù)端上讀取到最新的數(shù)據(jù)狀態(tài)。
2.1 設(shè)計目標(biāo)
Zookeeper致力于提供一個高性能、高可用、且具有嚴(yán)格的順序訪問控制能力(主要是寫操作的嚴(yán)格順序性)的分布式協(xié)調(diào)服務(wù),其具有如下的設(shè)計目標(biāo)。
① 簡單的數(shù)據(jù)模型,Zookeeper使得分布式程序能夠通過一個共享的樹形結(jié)構(gòu)的名字空間來進行相互協(xié)調(diào),即Zookeeper服務(wù)器內(nèi)存中的數(shù)據(jù)模型由一系列被稱為ZNode的數(shù)據(jù)節(jié)點組成,Zookeeper將全量的數(shù)據(jù)存儲在內(nèi)存中,以此來提高服務(wù)器吞吐、減少延遲的目的。
② 可構(gòu)建集群,一個Zookeeper集群通常由一組機器構(gòu)成,組成Zookeeper集群的而每臺機器都會在內(nèi)存中維護當(dāng)前服務(wù)器狀態(tài),并且每臺機器之間都相互通信。
③ 順序訪問,對于來自客戶端的每個更新請求,Zookeeper都會分配一個全局唯一的遞增編號,這個編號反映了所有事務(wù)操作的先后順序。
④ 高性能,Zookeeper將全量數(shù)據(jù)存儲在內(nèi)存中,并直接服務(wù)于客戶端的所有非事務(wù)請求,因此它尤其適用于以讀操作為主的應(yīng)用場景。
2.2 基本概念
① 集群角色,最典型的集群就是Master/Slave模式(主備模式),此情況下把所有能夠處理寫操作的機器稱為Master機器,把所