分布式系统的可靠协调系统——Zookeeper
文章目錄
- 一、zookeeper簡介
- 1.1 zookeeper的概述
- 1.2 Zookeeper的定義
- 1.3 Zookeeper的工作機(jī)制
- 1.4 Zookeeper 的特點(diǎn)
- 1.5 zookeeper 的數(shù)據(jù)結(jié)構(gòu)
- 二、Zookeeper的應(yīng)用場景
- 2.1 統(tǒng)一命名服務(wù)
- 2.2 統(tǒng)一配置管理
- 2.3 統(tǒng)一集群管理
- 2.4 服務(wù)器動態(tài)上下線
- 2.5 軟負(fù)載均衡
- 三、Zookeeper的選舉機(jī)制
- 3.1 第一次啟動選舉機(jī)制
- 3.2 非第一次啟動選舉機(jī)制
- 四、部署Zookeeper集群
- 4.1 部署Zookeeper集群的具體實(shí)驗(yàn)步驟(實(shí)操)
- 1.安裝前準(zhǔn)備
- 2.安裝Zookeeper\
- 3.修改配置文件
- ① 復(fù)制配置文件
- ② 修改配置,添加集群信息
- 4.在每個節(jié)點(diǎn)上創(chuàng)建數(shù)據(jù)目錄和日志目錄
- 5.在每個節(jié)點(diǎn)的dataDir指定的目錄下創(chuàng)建一個myid的文件
- 6.配置Zookeeper啟動腳本
- 7.設(shè)置開機(jī)自啟
- 8.分別啟動 Zookeeper并查看狀態(tài)
一、zookeeper簡介
1.1 zookeeper的概述
ZooKeeper是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。
ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。
ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
ZooKeeper代碼版本中,提供了分布式獨(dú)享鎖、選舉、隊列的接口,代碼在$zookeeper_home\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。
1.2 Zookeeper的定義
Zookeeper是一~個開源的分布式的,為分布式框架提供協(xié)調(diào)服務(wù)的Apache項目。
1.3 Zookeeper的工作機(jī)制
Zookeeper從設(shè)計模式角度來理解:是一個基于觀察者模式設(shè)計的分布式服務(wù)管理框架,它負(fù)責(zé)存儲和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就將負(fù)責(zé)通知已經(jīng)在Zookeeper上注冊的那些觀察者做出相應(yīng)的反應(yīng)。
就是說Zookeeper =文件系統(tǒng)+通知機(jī)制。
1.4 Zookeeper 的特點(diǎn)
(1) Zookeeper:一個領(lǐng)導(dǎo)者(Leader) ,多個跟隨者(Follower) 組成的集群。
(2) Zookeepe集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù)。所以Zookeeper適合安裝奇數(shù)臺服務(wù)器。
(3)全局?jǐn)?shù)據(jù)一致:每個Server保存一份相同的數(shù)據(jù)副本,Client無論連接到哪個Server, 數(shù)據(jù)都是一致的。
(4)更新請求順序執(zhí)行,來自同一個Client的更新請求按其發(fā)送順序依次執(zhí)行,即先進(jìn)先出。.
(5)數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗。
(6)實(shí)時性,在一定時間范圍內(nèi),Client能讀到最新數(shù)據(jù)。
1.5 zookeeper 的數(shù)據(jù)結(jié)構(gòu)
ZooKeeper數(shù)據(jù)模型的結(jié)構(gòu)與Linux文件系統(tǒng)很類似,整體上可以看作是一棵樹,每個節(jié)點(diǎn)稱做–個ZNode。
每一個ZNode默認(rèn)能夠存儲1MB的數(shù)據(jù),每個ZNode都可以通過其路徑唯一標(biāo)識。
二、Zookeeper的應(yīng)用場景
提供的服務(wù)包括:統(tǒng)一命名服務(wù)、 統(tǒng)一配置管理、統(tǒng)一集群管理、服務(wù)器節(jié)點(diǎn)動態(tài)上下線、軟負(fù)載均衡等。
2.1 統(tǒng)一命名服務(wù)
在分布式環(huán)境下,經(jīng)常需要對應(yīng)用/服務(wù)進(jìn)行統(tǒng)一命名, 便于識別。例如: IP不容 易記住,而域名容易記住。
2.2 統(tǒng)一配置管理
分布式環(huán)境下,配置文件同步非常常見。一般要求一個集群中,所有節(jié)點(diǎn)的配置信息是一致的,比如Kafka集群。對配置文
件修改后,希望能夠快速同步到各個節(jié)點(diǎn)上。
配置管理可交由ZooKeeper實(shí)現(xiàn)。可將配置信息寫入ZooKeeper.上的一-個Znode。各個客戶端服務(wù)器監(jiān)聽這個Znode。一旦
Znode中的數(shù)據(jù)被修改,ZooKeeper將 通知各個客戶端服務(wù)器。
2.3 統(tǒng)一集群管理
分布式環(huán)境中,實(shí)時掌握每個節(jié)點(diǎn)的狀態(tài)是必要的。可根據(jù)節(jié)點(diǎn)實(shí)時狀態(tài)做出一-些調(diào)整。
ZooKeeper可以實(shí)現(xiàn)實(shí)時監(jiān)控節(jié)點(diǎn)狀態(tài)變化。可將節(jié)點(diǎn)信息寫入ZooKeeper.上的一-個ZNode。監(jiān)聽這個ZNode可獲取它的實(shí)時狀態(tài)變化。
2.4 服務(wù)器動態(tài)上下線
客戶端能實(shí)時洞察到服務(wù)器上下線的變化。
2.5 軟負(fù)載均衡
在Zookeeper中記錄每臺服務(wù)器的訪問數(shù),讓訪問數(shù)最少的服務(wù)器去處理最新的客戶端請求。
三、Zookeeper的選舉機(jī)制
3.1 第一次啟動選舉機(jī)制
服務(wù)器1啟動,發(fā)起一次選舉。服務(wù)器1投自己一票。此時服務(wù)器1票數(shù)一票, 不夠半數(shù)以上(3票),選舉無法完成,服務(wù)器1狀態(tài)保持為LO0KING;
服務(wù)器2啟動,再發(fā)起一次選舉。服務(wù)器1和2分別投自己一票并交換選票信息:此時服務(wù)器1發(fā)現(xiàn)服務(wù)器2的myid比自己目前
投票推舉的( 服務(wù)器1)大,更改選票為推舉服務(wù)器2。此時服務(wù)器1票數(shù)0票,服務(wù)器2票數(shù)2票,沒有半數(shù)以上結(jié)果,選舉無法完成,服務(wù)器1,2狀態(tài)保持LOOKING
服務(wù)器3啟動,發(fā)起一次選舉。此時服務(wù)器1和2都會更改選票為服務(wù)器3。此次投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為0票,服
務(wù)器3為3票。此時服務(wù)器3的票數(shù)已經(jīng)超過半數(shù),服務(wù)器3當(dāng)選Leader。服務(wù)器1,2更改狀態(tài)為FOLLOWING,服務(wù)器3更改狀態(tài)為LEADING;
服務(wù)器4啟動,發(fā)起一次選舉。此時服務(wù)器1,2,3已經(jīng)不是L00KING狀態(tài),不會更改選票信息。交換選票信息結(jié)果:服務(wù)器3為3票,服務(wù)器4為1票。此時服務(wù)器4服從多數(shù),更改選票信息為服務(wù)器3,并更改狀態(tài)為FOLLOWING;
服務(wù)器5啟動,同4服從多數(shù),更改選票信息為服務(wù)器3,并更改狀態(tài)為FOLLOWING;
3.2 非第一次啟動選舉機(jī)制
1)當(dāng)ZooKeeper集群中的一臺 服務(wù)器出現(xiàn)以下兩種情況之一時, 就會開始進(jìn)入Leader選舉:
服務(wù)器初始化啟動。
服務(wù)器運(yùn)行期間無法和Leader保持連接。
2)而當(dāng)一臺機(jī)器進(jìn)入Leader選舉流程時,當(dāng)前集群也可能會處于以下兩種狀態(tài):
集群中本來就已經(jīng)存在一個Leader。
對于已經(jīng)存在Leader的情況,機(jī)器試圖去選舉Leader時,會被告知當(dāng)前服務(wù)器的Leader信息,對于該機(jī)器來說,僅僅需要和Leader機(jī)器建立連接,并進(jìn)行狀態(tài)同步即可。
集群中確實(shí)不存在Leader
假設(shè)ZooKeeper由5臺服務(wù)器組成,SID分別為1、2、3、4、5,ZXID分別為8、8、8、7、7,并且此時SID為3的服務(wù)器是Leader。某一時刻,3和5服務(wù)器出現(xiàn)故障,因此開始進(jìn)行Leader選舉。
選舉Leader規(guī)則:
EPOCH大的直接勝出。
EPOCH相同,事務(wù)id大的勝出。
事務(wù)id相同,服務(wù)器id大的勝出。
SID: 服務(wù)器ID。用來唯一 標(biāo)識一臺ZooKeeper集群中的機(jī)器,每臺機(jī)器不能重復(fù),和myid一致。
ZXID:事務(wù)ID。ZXID是-一個事務(wù)ID,用來標(biāo)識一次服務(wù)器狀態(tài)的變更。在某-一時刻,集群中的每臺機(jī)器的ZXID值不一定完全一致,這和ZooKeeper服務(wù)器對于客戶端“更新請求”的處理邏輯速度有關(guān)。
Epoch:每個Leader任期的代號。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數(shù)據(jù)就會增加
四、部署Zookeeper集群
4.1 部署Zookeeper集群的具體實(shí)驗(yàn)步驟(實(shí)操)
1.安裝前準(zhǔn)備
查看版本
2.安裝Zookeeper\
3.修改配置文件
① 復(fù)制配置文件
② 修改配置,添加集群信息
4.在每個節(jié)點(diǎn)上創(chuàng)建數(shù)據(jù)目錄和日志目錄
5.在每個節(jié)點(diǎn)的dataDir指定的目錄下創(chuàng)建一個myid的文件
6.配置Zookeeper啟動腳本
7.設(shè)置開機(jī)自啟
8.分別啟動 Zookeeper并查看狀態(tài)
總結(jié)
以上是生活随笔為你收集整理的分布式系统的可靠协调系统——Zookeeper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELK 企业级日志分析系统
- 下一篇: zookeeper + kafka集群搭