所有的努力都為遇見更好的自己
1铐维,zookeeper為我們解決什么樣的問題?
zookeeper是為我們解決分布式系統(tǒng)協(xié)調(diào)服務(wù)的組件蛇耀。
2,zookeeper運(yùn)行條件是什么坎弯?
zookeeper是以Fast Paxos算法為基礎(chǔ)的一個(gè)組件纺涤,F(xiàn)ast Paxos算法在選主的時(shí)候,必須有半數(shù)以上節(jié)點(diǎn)選擇同一個(gè)節(jié)點(diǎn)作為主節(jié)點(diǎn)抠忘,這個(gè)節(jié)點(diǎn)才可以作為主節(jié)點(diǎn)撩炊,所以,zookeeper運(yùn)行條件:
2.1崎脉,必須以集群的方式向外提供服務(wù)拧咳。
2.2,集群數(shù)量最好是奇數(shù)個(gè)囚灼,這樣方便選主(如果有2n個(gè)骆膝,會(huì)出現(xiàn)重復(fù)選主的情況祭衩,可能會(huì)有腦裂)
2.3,集群中必須有半數(shù)以上的節(jié)點(diǎn)在提供服務(wù)阅签,少于半數(shù)掐暮,集群不能向外正常提供服務(wù)。
3政钟,zookeeper特點(diǎn)
3.1劫乱,zookeeper不適合保存大量的數(shù)據(jù),只適合保存一些元數(shù)據(jù)信息(KB級(jí)別的數(shù)據(jù))锥涕,所以不適合作為大量數(shù)據(jù)的存儲(chǔ)系統(tǒng)
3.2衷戈,zookeeper存儲(chǔ)系統(tǒng)結(jié)構(gòu)類似于linux的文件系統(tǒng),其中每個(gè)節(jié)點(diǎn)znode(相當(dāng)于文件系統(tǒng)的某個(gè)文件夾)层坠,可以保存數(shù)據(jù)和向外提供數(shù)據(jù)查詢殖妇。即存取功能,這里只是少量數(shù)據(jù)破花,不能想linux系統(tǒng)文件夾谦趣,存儲(chǔ)大量數(shù)據(jù)。
3.3座每,zookeeper存儲(chǔ)系統(tǒng)的節(jié)點(diǎn)(znode)前鹅,即可以是臨時(shí)性節(jié)點(diǎn)(EPHEMERAL),也可以是永久性的節(jié)點(diǎn)峭梳。用戶可以更具自己的需求舰绘,選擇創(chuàng)建臨時(shí)或者永久性的節(jié)點(diǎn)。臨時(shí)性節(jié)點(diǎn)有個(gè)特征是葱椭,當(dāng)客戶端的session(鏈接)斷開的時(shí)候捂寿,臨時(shí)節(jié)點(diǎn)就會(huì)從zookeeper服務(wù)器中刪除,而永久性節(jié)點(diǎn)則不會(huì)孵运。
3.4秦陋,zookeeper可以提供節(jié)點(diǎn)監(jiān)控,即治笨,當(dāng)某個(gè)節(jié)點(diǎn)的字節(jié)點(diǎn)數(shù)量變化驳概,或者節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變化,可以通知到某個(gè)客戶端旷赖。即事件監(jiān)控的功能顺又。但是每次監(jiān)控只對(duì)一次事件有效,如果需要持續(xù)監(jiān)控杠愧,需要另行處理待榔。
4.zookeeper功能:
zookeeper只有兩點(diǎn)功能,4.1,在znode保存少量數(shù)據(jù)
4.2锐锣,對(duì)節(jié)點(diǎn)進(jìn)行監(jiān)控腌闯,當(dāng)發(fā)生某種變化的時(shí)候,通知到監(jiān)控方雕憔。
5姿骏,利用zookeeper的功能和特點(diǎn),可以幫助我們完成哪些功能
5.1斤彼,配置管理
在我們的應(yīng)用中除了代碼外分瘦,還有一些就是各種配置。比如數(shù)據(jù)庫連接等琉苇。一般我們都是使用配置文件的方式嘲玫,在代碼中引入這些配置文件。但是當(dāng)我們只有一種配置并扇,只有一臺(tái)服務(wù)器去团,并且不經(jīng)常修改的時(shí)候,使用配置文件是一個(gè)很好的做法穷蛹,但是如果我們配置非常多土陪,有很多服務(wù)器都需要這個(gè)配置,而且還可能是動(dòng)態(tài)的話使用配置文件就不是個(gè)好主意了肴熏。這個(gè)時(shí)候往往需要尋找一種集中管理配置的方法鬼雀,我們?cè)谶@個(gè)集中的地方修改了配置,所有對(duì)這個(gè)配置感興趣的都可以獲得變更蛙吏。比如我們可以把配置放在數(shù)據(jù)庫里源哩,然后所有需要配置的服務(wù)都去這個(gè)數(shù)據(jù)庫讀取配置。但是出刷,因?yàn)楹芏喾?wù)的正常運(yùn)行都非常依賴這個(gè)配置璧疗,所以需要這個(gè)集中提供配置服務(wù)的服務(wù)具備很高的可靠性。一般我們可以用一個(gè)集群來提供這個(gè)配置服務(wù)馁龟,但是用集群提升可靠性,那如何保證配置在集群中的一致性呢漆魔? 這個(gè)時(shí)候就需要使用一種實(shí)現(xiàn)了一致性協(xié)議的服務(wù)了坷檩。Zookeeper就是這種服務(wù),它使用Zab這種一致性協(xié)議來提供一致性「穆眨現(xiàn)在有很多開源項(xiàng)目使用Zookeeper來維護(hù)配置矢炼,比如在HBase中,客戶端就是連接一個(gè)Zookeeper阿纤,獲得必要的HBase集群的配置信息句灌,然后才可以進(jìn)一步操作。還有在開源的消息隊(duì)列Kafka中,也使用Zookeeper來維護(hù)broker的信息胰锌。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實(shí)現(xiàn)服務(wù)治理骗绕。
5.2名字服務(wù)
名字服務(wù)這個(gè)就很好理解了。比如為了通過網(wǎng)絡(luò)訪問一個(gè)系統(tǒng)资昧,我們得知道對(duì)方的IP地址酬土,但是IP地址對(duì)人非常不友好,這個(gè)時(shí)候我們就需要使用域名來訪問格带。但是計(jì)算機(jī)是不能是別域名的撤缴。怎么辦呢?如果我們每臺(tái)機(jī)器里都備有一份域名到IP地址的映射叽唱,這個(gè)倒是能解決一部分問題屈呕,但是如果域名對(duì)應(yīng)的IP發(fā)生變化了又該怎么辦呢?于是我們有了DNS這個(gè)東西棺亭。我們只需要訪問一個(gè)大家熟知的(known)的點(diǎn)凉袱,它就會(huì)告訴你這個(gè)域名對(duì)應(yīng)的IP是什么。在我們的應(yīng)用中也會(huì)存在很多這類問題侦铜,特別是在我們的服務(wù)特別多的時(shí)候专甩,如果我們?cè)诒镜乇4娣?wù)的地址的時(shí)候?qū)⒎浅2环奖悖侨绻覀冎恍枰L問一個(gè)大家都熟知的訪問點(diǎn)钉稍,這里提供統(tǒng)一的入口涤躲,那么維護(hù)起來將方便得多了。
5.3分布式鎖
其實(shí)在第一篇文章中已經(jīng)介紹了Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù)贡未。這樣我們就可以利用Zookeeper來協(xié)調(diào)多個(gè)分布式進(jìn)程之間的活動(dòng)种樱。比如在一個(gè)分布式環(huán)境中,為了提高可靠性俊卤,我們的集群的每臺(tái)服務(wù)器上都部署著同樣的服務(wù)嫩挤。但是,一件事情如果集群中的每個(gè)服務(wù)器都進(jìn)行的話消恍,那相互之間就要協(xié)調(diào)岂昭,編程起來將非常復(fù)雜。而如果我們只讓一個(gè)服務(wù)進(jìn)行操作狠怨,那又存在單點(diǎn)约啊。通常還有一種做法就是使用分布式鎖,在某個(gè)時(shí)刻只讓一個(gè)服務(wù)去干活佣赖,當(dāng)這臺(tái)服務(wù)出問題的時(shí)候鎖釋放恰矩,立即fail over到另外的服務(wù)。這在很多分布式系統(tǒng)中都是這么做憎蛤,這種設(shè)計(jì)有一個(gè)更好聽的名字叫Leader Election(leader選舉)外傅。比如HBase的Master就是采用這種機(jī)制。但要注意的是分布式鎖跟同一個(gè)進(jìn)程的鎖還是有區(qū)別的,所以使用的時(shí)候要比同一個(gè)進(jìn)程里的鎖更謹(jǐn)慎的使用萎胰。
5.4集群管理
在分布式的集群中碾盟,經(jīng)常會(huì)由于各種原因,比如硬件故障奥洼,軟件故障巷疼,網(wǎng)絡(luò)問題,有些節(jié)點(diǎn)會(huì)進(jìn)進(jìn)出出灵奖。有新的節(jié)點(diǎn)加入進(jìn)來嚼沿,也有老的節(jié)點(diǎn)退出集群。這個(gè)時(shí)候瓷患,集群中其他機(jī)器需要感知到這種變化骡尽,然后根據(jù)這種變化做出對(duì)應(yīng)的決策。比如我們是一個(gè)分布式存儲(chǔ)系統(tǒng)擅编,有一個(gè)中央控制節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)的分配攀细,當(dāng)有新的存儲(chǔ)進(jìn)來的時(shí)候我們要根據(jù)現(xiàn)在集群目前的狀態(tài)來分配存儲(chǔ)節(jié)點(diǎn)。這個(gè)時(shí)候我們就需要?jiǎng)討B(tài)感知到集群目前的狀態(tài)爱态。還有谭贪,比如一個(gè)分布式的SOA架構(gòu)中,服務(wù)是一個(gè)集群提供的锦担,當(dāng)消費(fèi)者訪問某個(gè)服務(wù)時(shí)俭识,就需要采用某種機(jī)制發(fā)現(xiàn)現(xiàn)在有哪些節(jié)點(diǎn)可以提供該服務(wù)(這也稱之為服務(wù)發(fā)現(xiàn),比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務(wù)發(fā)現(xiàn)的底層機(jī)制)洞渔。還有開源的Kafka隊(duì)列就采用了Zookeeper作為Cosnumer的上下線管理套媚。