官方說(shuō)辭:Zookeeper 分布式服務(wù)框架是Apache Hadoop 的一個(gè)子項(xiàng)目,它主要是用來(lái)解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)的管理等。
創(chuàng)新互聯(lián)公司專注于湟中企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。湟中網(wǎng)站建設(shè)公司,為湟中等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)好抽象,我們改變一下方式,先看看它都提供了哪些功能,然后再看看使用它的這些功能能做點(diǎn)什么。
簡(jiǎn)單的說(shuō),zookeeper=文件系統(tǒng)+通知機(jī)制。
Zookeeper維護(hù)一個(gè)類似文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):
每個(gè)子目錄項(xiàng)如 NameService 都被稱作為 znode,和文件系統(tǒng)一樣,我們能夠自由的增加、刪除znode,在一個(gè)znode下增加、刪除子znode,唯一的不同在于znode是可以存儲(chǔ)數(shù)據(jù)的。
有四種類型的znode:
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)被刪除
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)被刪除,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)
客戶端注冊(cè)監(jiān)聽它關(guān)心的目錄節(jié)點(diǎn),當(dāng)目錄節(jié)點(diǎn)發(fā)生變化(數(shù)據(jù)改變、被刪除、子目錄節(jié)點(diǎn)增加刪除)時(shí),zookeeper會(huì)通知客戶端。
就這么簡(jiǎn)單,下面我們看看能做點(diǎn)什么呢?
1、 命名服務(wù)
這個(gè)似乎最簡(jiǎn)單,在zookeeper的文件系統(tǒng)里創(chuàng)建一個(gè)目錄,即有唯一的path。在我們使用tborg無(wú)法確定上游程序的部署機(jī)器時(shí)即可與下游程序約定好path,通過(guò)path即能互相探索發(fā)現(xiàn),不見不散了。
2、 配置管理
程序總是需要配置的,如果程序分散部署在多臺(tái)機(jī)器上,要逐個(gè)改變配置就變得困難。好吧,現(xiàn)在把這些配置全部放到zookeeper上去,保存在 Zookeeper 的某個(gè)目錄節(jié)點(diǎn)中,然后所有相關(guān)應(yīng)用程序?qū)@個(gè)目錄節(jié)點(diǎn)進(jìn)行監(jiān)聽,一旦配置信息發(fā)生變化,每個(gè)應(yīng)用程序就會(huì)收到 Zookeeper 的通知,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中就好。
3、 集群管理
所謂集群管理無(wú)在乎兩點(diǎn):是否有機(jī)器退出和加入、選舉master。
對(duì)于第一點(diǎn),所有機(jī)器約定在父目錄GroupMembers下創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),然后監(jiān)聽父目錄節(jié)點(diǎn)的子節(jié)點(diǎn)變化消息。一旦有機(jī)器掛掉,該機(jī)器與zookeeper的連接斷開,其所創(chuàng)建的臨時(shí)目錄節(jié)點(diǎn)被刪除,所有其他機(jī)器都收到通知:某個(gè)兄弟目錄被刪除,于是,所有人都知道:它上船了。新機(jī)器加入也是類似,所有機(jī)器收到通知:新兄弟目錄加入,highcount又有了。
對(duì)于第二點(diǎn),我們稍微改變一下,所有機(jī)器創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),每次選取編號(hào)最小的機(jī)器作為master就好。
4、 分布式鎖
有了zookeeper的一致性文件系統(tǒng),鎖的問題變得容易。鎖服務(wù)可以分為兩類,一個(gè)是保持獨(dú)占,另一個(gè)是控制時(shí)序。
對(duì)于第一類,我們將zookeeper上的一個(gè)znode看作是一把鎖,通過(guò)createznode的方式來(lái)實(shí)現(xiàn)。所有客戶端都去創(chuàng)建 /distribute_lock 節(jié)點(diǎn),最終成功創(chuàng)建的那個(gè)客戶端也即擁有了這把鎖。廁所有言:來(lái)也沖沖,去也沖沖,用完刪除掉自己創(chuàng)建的distribute_lock 節(jié)點(diǎn)就釋放出鎖。
對(duì)于第二類, /distribute_lock 已經(jīng)預(yù)先存在,所有客戶端在它下面創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),和選master一樣,編號(hào)最小的獲得鎖,用完刪除,依次方便。
5、隊(duì)列管理
兩種類型的隊(duì)列:
1、 同步隊(duì)列,當(dāng)一個(gè)隊(duì)列的成員都聚齊時(shí),這個(gè)隊(duì)列才可用,否則一直等待所有成員到達(dá)。
第一類,在約定目錄下創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),監(jiān)聽節(jié)點(diǎn)數(shù)目是否是我們要求的數(shù)目。
第二類,和分布式鎖服務(wù)中的控制時(shí)序場(chǎng)景基本原理一致,入列有編號(hào),出列按編號(hào)。
終于了解完我們能用zookeeper做什么了,可是作為一個(gè)程序員,我們總是想狂熱了解zookeeper是如何做到這一點(diǎn)的,單點(diǎn)維護(hù)一個(gè)文件系統(tǒng)沒有什么難度,可是如果是一個(gè)集群維護(hù)一個(gè)文件系統(tǒng)保持?jǐn)?shù)據(jù)的一致性就非常困難了。
Zookeeper作為一個(gè)集群提供一致的數(shù)據(jù)服務(wù),自然,它要在所有機(jī)器間做數(shù)據(jù)復(fù)制。數(shù)據(jù)復(fù)制的好處:
1、 容錯(cuò)
一個(gè)節(jié)點(diǎn)出錯(cuò),不致于讓整個(gè)系統(tǒng)停止工作,別的節(jié)點(diǎn)可以接管它的工作;
2、提高系統(tǒng)的擴(kuò)展能力
把負(fù)載分布到多個(gè)節(jié)點(diǎn)上,或者增加節(jié)點(diǎn)來(lái)提高系統(tǒng)的負(fù)載能力;
3、提高性能
讓客戶端本地訪問就近的節(jié)點(diǎn),提高用戶訪問速度。
從客戶端讀寫訪問的透明度來(lái)看,數(shù)據(jù)復(fù)制集群系統(tǒng)分下面兩種:
1、寫主(WriteMaster) 對(duì)數(shù)據(jù)的修改提交給指定的節(jié)點(diǎn)。讀無(wú)此限制,可以讀取任何一個(gè)節(jié)點(diǎn)。這種情況下客戶端需要對(duì)讀與寫進(jìn)行區(qū)別,俗稱讀寫分離;
對(duì)zookeeper來(lái)說(shuō),它采用的方式是寫任意。通過(guò)增加機(jī)器,它的讀吞吐能力和響應(yīng)能力擴(kuò)展性非常好,而寫,隨著機(jī)器的增多吞吐能力肯定下降(這也是它建立observer的原因),而響應(yīng)能力則取決于具體實(shí)現(xiàn)方式,是延遲復(fù)制保持最終一致性,還是立即復(fù)制快速響應(yīng)。
我們關(guān)注的重點(diǎn)還是在如何保證數(shù)據(jù)在集群所有機(jī)器的一致性,這就涉及到paxos算法。
據(jù)說(shuō)Paxos算法的難理解與算法的知名度一樣令人敬仰,所以我們先看如何保持?jǐn)?shù)據(jù)的一致性,這里有個(gè)原則就是:
在一個(gè)分布式數(shù)據(jù)庫(kù)系統(tǒng)中,如果各節(jié)點(diǎn)的初始狀態(tài)一致,每個(gè)節(jié)點(diǎn)都執(zhí)行相同的操作序列,那么他們最后能得到一個(gè)一致的狀態(tài)。
Paxos算法解決的什么問題呢,解決的就是保證每個(gè)節(jié)點(diǎn)執(zhí)行相同的操作序列。好吧,這還不簡(jiǎn)單,master維護(hù)一個(gè)全局寫隊(duì)列,所有寫操作都必須放入這個(gè)隊(duì)列編號(hào),那么無(wú)論我們寫多少個(gè)節(jié)點(diǎn),只要寫操作是按編號(hào)來(lái)的,就能保證一致性。沒錯(cuò),就是這樣,可是如果master掛了呢。
Paxos算法通過(guò)投票來(lái)對(duì)寫操作進(jìn)行全局編號(hào),同一時(shí)刻,只有一個(gè)寫操作被批準(zhǔn),同時(shí)并發(fā)的寫操作要去爭(zhēng)取選票,只有獲得過(guò)半數(shù)選票的寫操作才會(huì)被批準(zhǔn)(所以永遠(yuǎn)只會(huì)有一個(gè)寫操作得到批準(zhǔn)),其他的寫操作競(jìng)爭(zhēng)失敗只好再發(fā)起一輪投票,就這樣,在日復(fù)一日年復(fù)一年的投票中,所有寫操作都被嚴(yán)格編號(hào)排序。編號(hào)嚴(yán)格遞增,當(dāng)一個(gè)節(jié)點(diǎn)接受了一個(gè)編號(hào)為100的寫操作,之后又接受到編號(hào)為99的寫操作(因?yàn)榫W(wǎng)絡(luò)延遲等很多不可預(yù)見原因),它馬上能意識(shí)到自己數(shù)據(jù)不一致了,自動(dòng)停止對(duì)外服務(wù)并重啟同步過(guò)程。任何一個(gè)節(jié)點(diǎn)掛掉都不會(huì)影響整個(gè)集群的數(shù)據(jù)一致性(總2n+1臺(tái),除非掛掉大于n臺(tái))。
總結(jié)一下,數(shù)據(jù)一致性是如何保證的?是投票投出來(lái)的,幸福也是一樣啊。
針對(duì)于上面所涉及到的知識(shí)點(diǎn)我總結(jié)出了有1到5年開發(fā)經(jīng)驗(yàn)的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費(fèi)分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復(fù)習(xí)且找到一個(gè)好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時(shí)間來(lái)學(xué)習(xí),也可以關(guān)注我一下以后會(huì)有更多干貨分享。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。