圖片來自網(wǎng)絡(luò)凯旋,如有侵權(quán)請聯(lián)系作者刪除
一.ZooKeeper是什么
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能解決什么
1.命名服務(wù)(Name service)
- ZooKeeper提供類似JNDI服務(wù)谐鼎,都能夠幫助應(yīng)用系統(tǒng)通過一個資源引用的方式來實現(xiàn)對資源的定位與實用。
- 利用ZooKeeper順序節(jié)點的特性趣惠,制作分布式的ID生成器狸棍。
2.配置管理
配置的管理在分布式應(yīng)用環(huán)境中很常見,例如同一個應(yīng)用系統(tǒng)需要多臺 PC Server 運行味悄,但是它們運行的應(yīng)用系統(tǒng)的某些配置項是相同的草戈,如果要修改這些相同的配置項,那么就必須同時修改每臺運行這個應(yīng)用系統(tǒng)的 PC Server侍瑟,這樣非常麻煩而且容易出錯唐片。
像這樣的配置信息完全可以交給 Zookeeper 來管理,將配置信息保存在 Zookeeper 的某個目錄節(jié)點中涨颜,然后將所有需要修改的應(yīng)用機器監(jiān)控配置信息的狀態(tài)费韭,一旦配置信息發(fā)生變化,每臺應(yīng)用機器就會收到 Zookeeper 的通知庭瑰,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中
圖片來自網(wǎng)絡(luò)揽思,如有侵權(quán)請聯(lián)系作者刪除
3.集群管理
Zookeeper 能夠很容易的實現(xiàn)集群管理的功能,如有多臺 Server 組成一個服務(wù)集群见擦,那么必須要一個“總管”知道當(dāng)前集群中每臺機器的服務(wù)狀態(tài),一旦有機器不能提供服務(wù)羹令,集群中其它機器必須知道鲤屡,從而做出調(diào)整重新分配服務(wù)策略。同樣當(dāng)增加集群的服務(wù)能力時福侈,就會增加一臺或多臺 Server酒来,同樣也必須讓“總管”知道。
Zookeeper 不僅能夠幫你維護(hù)當(dāng)前的集群中機器的服務(wù)狀態(tài)肪凛,而且能夠幫你選出一個“總管”堰汉,讓這個總管來管理集群,這就是 Zookeeper 的另一個功能 Leader Election伟墙。
它們的實現(xiàn)方式都是在 Zookeeper 上創(chuàng)建一個 EPHEMERAL 類型的目錄節(jié)點翘鸭,然后每個 Server 在它們創(chuàng)建目錄節(jié)點的父目錄節(jié)點上調(diào)用 getChildren(String path, boolean watch) 方法并設(shè)置 watch 為 true,由于是 EPHEMERAL 目錄節(jié)點戳葵,當(dāng)創(chuàng)建它的 Server 死去就乓,這個目錄節(jié)點也隨之被刪除,所以 Children 將會變化,這時 getChildren上的 Watch 將會被調(diào)用生蚁,所以其它 Server 就知道已經(jīng)有某臺 Server 死去了噩翠。新增 Server 也是同樣的原理。
Zookeeper 如何實現(xiàn) Leader Election邦投,也就是選出一個 Master Server伤锚。和前面的一樣每臺 Server 創(chuàng)建一個 EPHEMERAL 目錄節(jié)點,不同的是它還是一個 SEQUENTIAL 目錄節(jié)點志衣,所以它是個 EPHEMERAL_SEQUENTIAL 目錄節(jié)點屯援。之所以它是 EPHEMERAL_SEQUENTIAL 目錄節(jié)點,是因為我們可以給每臺 Server 編號蠢涝,我們可以選擇當(dāng)前是最小編號的 Server 為 Master玄呛,假如這個最小編號的 Server 死去,由于是 EPHEMERAL 節(jié)點和二,死去的 Server 對應(yīng)的節(jié)點也被刪除徘铝,所以當(dāng)前的節(jié)點列表中又出現(xiàn)一個最小編號的節(jié)點,我們就選擇這個節(jié)點為當(dāng)前 Master惯吕。這樣就實現(xiàn)了動態(tài)選擇 Master惕它,避免了傳統(tǒng)意義上單 Master 容易出現(xiàn)單點故障的問題
三.Zookeeper的數(shù)據(jù)模型
Zookeeper 會維護(hù)一個具有層次關(guān)系的數(shù)據(jù)結(jié)構(gòu),它非常類似于一個標(biāo)準(zhǔn)的文件系統(tǒng)
圖片來自于網(wǎng)絡(luò)废登,如有侵權(quán)請聯(lián)系作者刪除
每個節(jié)點在zookeeper中叫做znode,每個znode節(jié)點有唯一的路徑標(biāo)識淹魄,Znode節(jié)點分為:臨時節(jié)點和持久化節(jié)點
臨時節(jié)點的生命周期與創(chuàng)建該節(jié)點的客戶端的生命周期一致,一旦客戶端與zookeeper服務(wù)器失去聯(lián)系堡距,這個節(jié)點也將被刪除--臨時節(jié)點不能擁有子節(jié)點
持久化節(jié)點是指與客戶端狀態(tài)無關(guān)的節(jié)點的甲锡,除非客戶端主動發(fā)起刪除操作,否則就算客戶端與服務(wù)器失去聯(lián)系羽戒,該節(jié)點依然存在
znode 是有版本的缤沦,每個 znode 中存儲的數(shù)據(jù)可以有多個版本,也就是一個訪問路徑中可以存儲多份數(shù)據(jù)
znode 可以被監(jiān)控(可以設(shè)置Watcher)易稠,包括這個目錄節(jié)點中存儲的數(shù)據(jù)的修改缸废,子節(jié)點目錄的變化等,一旦變化可以通知設(shè)置監(jiān)控的客戶端驶社,這個是 Zookeeper 的核心特性企量。
四.Leader選舉
Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在。當(dāng)Zookeeper集群中的一臺服務(wù)器出現(xiàn)以下兩種情況之一時亡电,需要進(jìn)入Leader選舉届巩。
(1) 服務(wù)器初始化啟動。
(2) 服務(wù)器運行期間無法和Leader保持連接
1.服務(wù)器啟動時的Leader選舉
若進(jìn)行Leader選舉份乒,則至少需要兩臺機器姆泻,這里選取3臺機器組成的服務(wù)器集群為例零酪。在集群初始化階段,當(dāng)有一臺服務(wù)器Server1啟動時拇勃,其單獨無法進(jìn)行和完成Leader選舉四苇,當(dāng)?shù)诙_服務(wù)器Server2啟動時,此時兩臺機器可以相互通信方咆,每臺機器都試圖找到Leader月腋,于是進(jìn)入Leader選舉過程。選舉過程如下
(1) 每個Server發(fā)出一個投票瓣赂。由于是初始情況榆骚,Server1和Server2都會將自己作為Leader服務(wù)器來進(jìn)行投票,每次投票會包含所推舉的服務(wù)器的myid和ZXID煌集,使用(myid, ZXID)來表示妓肢,此時Server1的投票為(1, 0),Server2的投票為(2, 0)苫纤,然后各自將這個投票發(fā)給集群中其他機器碉钠。
(2) 接受來自各個服務(wù)器的投票。集群的每個服務(wù)器收到投票后卷拘,首先判斷該投票的有效性喊废,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務(wù)器栗弟。
(3) 處理投票污筷。針對每一個投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行PK乍赫,PK規(guī)則如下
· 優(yōu)先檢查ZXID瓣蛀。ZXID比較大的服務(wù)器優(yōu)先作為Leader。
· 如果ZXID相同雷厂,那么就比較myid惋增。myid較大的服務(wù)器作為Leader服務(wù)器。
對于Server1而言罗侯,它的投票是(1, 0),接收Server2的投票為(2, 0)溪猿,首先會比較兩者的ZXID钩杰,均為0,再比較myid诊县,此時Server2的myid最大讲弄,于是更新自己的投票為(2, 0),然后重新投票依痊,對于Server2而言避除,其無須更新自己的投票怎披,只是再次向集群中所有機器發(fā)出上一次投票信息即可。
(4) 統(tǒng)計投票瓶摆。每次投票后凉逛,服務(wù)器都會統(tǒng)計投票信息,判斷是否已經(jīng)有過半機器接受到相同的投票信息群井,對于Server1状飞、Server2而言,都統(tǒng)計出集群中已經(jīng)有兩臺機器接受了(2, 0)的投票信息书斜,此時便認(rèn)為已經(jīng)選出了Leader诬辈。
(5) 改變服務(wù)器狀態(tài)。一旦確定了Leader荐吉,每個服務(wù)器就會更新自己的狀態(tài)焙糟,如果是Follower,那么就變更為FOLLOWING样屠,如果是Leader穿撮,就變更為LEADING。
2.服務(wù)器運行時的Leader選舉
在Zookeeper運行期間瞧哟,Leader與非Leader服務(wù)器各司其職混巧,即便當(dāng)有非Leader服務(wù)器宕機或新加入,此時也不會影響Leader勤揩,但是一旦Leader服務(wù)器掛了咧党,那么整個集群將暫停對外服務(wù),進(jìn)入新一輪Leader選舉陨亡,其過程和啟動時期的Leader選舉過程基本一致傍衡。假設(shè)正在運行的有Server1、Server2负蠕、Server3三臺服務(wù)器蛙埂,當(dāng)前Leader是Server2,若某一時刻Leader掛了遮糖,此時便開始Leader選舉绣的。選舉過程如下
(1) 變更狀態(tài)。Leader掛后欲账,余下的非Observer服務(wù)器都會講自己的服務(wù)器狀態(tài)變更為LOOKING屡江,然后開始進(jìn)入Leader選舉過程。
(2) 每個Server會發(fā)出一個投票赛不。在運行期間惩嘉,每個服務(wù)器上的ZXID可能不同,此時假定Server1的ZXID為123踢故,Server3的ZXID為122文黎;在第一輪投票中惹苗,Server1和Server3都會投自己,產(chǎn)生投票(1, 123)耸峭,(3, 122)桩蓉,然后各自將投票發(fā)送給集群中所有機器。
(3) 接收來自各個服務(wù)器的投票抓艳。與啟動時過程相同触机。
(4) 處理投票。與啟動時過程相同玷或,此時儡首,Server1將會成為Leader。
(5) 統(tǒng)計投票偏友。與啟動時過程相同蔬胯。
(6) 改變服務(wù)器的狀態(tài)。與啟動時過程相同