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