Observers:让 ZooKeeper更具可伸缩性 | 时光机
戳藍(lán)字“CSDN云計(jì)算”關(guān)注我們哦!
時(shí)光機(jī):搭載這部時(shí)光機(jī),帶您回顧《程序員》大量?jī)?yōu)秀文章,重溫經(jīng)典技術(shù)干貨,我們發(fā)現(xiàn)硬核技術(shù)永不過(guò)時(shí),對(duì)于get要點(diǎn)、solve難題、提高自我,仍有非凡意義。
作者:Henry Robinson,Henry Robinson在紐約大學(xué)獲得計(jì)算機(jī)科學(xué)學(xué)士學(xué)位,在劍橋大學(xué)獲得語(yǔ)言。
譯者:王旭
導(dǎo)讀
時(shí)光機(jī)第02期,帶您了解 ZooKeeper更具可伸縮性的優(yōu)勢(shì)。云計(jì)算時(shí)代,軟件開(kāi)發(fā)人員面臨著越來(lái)越多分布式協(xié)作方面的問(wèn)題。ZooKeeper是由Apache出品的一個(gè)分布式協(xié)作服務(wù),新加入的Observer特性,進(jìn)一步增強(qiáng)了ZooKeeper的可伸縮性。
ZooKeeper 是 由 Apache 出 品的一個(gè)分布式協(xié)作服務(wù),用于實(shí)現(xiàn)鎖和并發(fā)事務(wù)排隊(duì)等協(xié)作原語(yǔ)。ZooKeeper 的一個(gè)優(yōu)勢(shì)是可伸縮性(Scalability)。五臺(tái)或七臺(tái)機(jī)器集群可以滿(mǎn)足很多大型應(yīng)用的需求。
最近我們給ZooKeeper增加了一個(gè)新的特性,進(jìn)一步增強(qiáng)了它的可伸縮性—一種稱(chēng)為Observers的服務(wù)器。在這篇文章中,我想介紹一下添加這個(gè)特性的緣由,并解釋這個(gè)服務(wù)器如何幫助我們的系統(tǒng)更具有可伸縮性。可伸縮性對(duì)不同的人意味著不同的事情,而在這里是說(shuō),如果我們的工作負(fù)載可以通過(guò)給系統(tǒng)分配更多的資源來(lái)分擔(dān),那么這個(gè)系統(tǒng)就是可伸縮的。一個(gè)不可伸縮的系統(tǒng)是無(wú)法通過(guò)增加資源來(lái)提升性能的,甚至?xí)诠ぷ髫?fù)載增加時(shí),性能急劇下降。
要了解Observers為何能影響ZooKeeper的可伸縮性,我們需要首先了解一下這個(gè)服務(wù)是如何工作的。寬泛地說(shuō),ZooKeeper 集群上的任何操作不是讀操作就是寫(xiě)操作。ZooKeeper 確保了所有讀和寫(xiě)操作在所有客戶(hù)端看來(lái)具有完全相同的順序,這樣他們就不用再為操作的順序而困惑了。
在提供強(qiáng)一致性保障的同時(shí),ZooKeeper同時(shí)給出高可用性承諾,這可以被簡(jiǎn)單地解釋為它可以在多臺(tái)服務(wù)器失效的情況下仍然為客戶(hù)端提供服務(wù)。ZooKeeper使用一個(gè)傳統(tǒng)的手段來(lái)達(dá)到可用性——通過(guò)將數(shù)據(jù)讀寫(xiě)分布到幾臺(tái)機(jī)器上來(lái)實(shí)現(xiàn)。這樣一來(lái)如果其中一臺(tái)機(jī)器失效了,其他的可以接管它的服務(wù),而這一切對(duì)客戶(hù)而言是不可見(jiàn)的。然而,一致性和可用性這兩個(gè)屬性是很難同時(shí)達(dá)到的。
目前,ZooKeeper必須確保集群中的每個(gè)副本都對(duì)讀寫(xiě)操作是順序性的。它通過(guò)一個(gè)一致性協(xié)議來(lái)達(dá)到這一目標(biāo)。簡(jiǎn)單地說(shuō),這個(gè)協(xié)議由一個(gè)選定的領(lǐng)導(dǎo)者將新操作告訴其他服務(wù)器, 所有節(jié)點(diǎn)投票支持的方式反饋給領(lǐng)導(dǎo)節(jié)點(diǎn)。一旦領(lǐng)導(dǎo)節(jié)點(diǎn)收集到過(guò)半數(shù)的投票,它就認(rèn)為投票已經(jīng)獲得了通過(guò),并將進(jìn)一步消息傳送給服務(wù)器,以使它們可以繼續(xù)工作,將操作提交到內(nèi)存中。
從始至終的數(shù)據(jù)流如圖1所示。客戶(hù)進(jìn)程將一個(gè)值提交給它連接的服務(wù)器,服務(wù)器將消息轉(zhuǎn)送給領(lǐng)導(dǎo)節(jié)點(diǎn),并郵領(lǐng)導(dǎo)節(jié)點(diǎn)發(fā)起這個(gè)一致性協(xié)議,一旦最初的服務(wù)器從領(lǐng)導(dǎo)節(jié)點(diǎn)得到結(jié)果,它就可以返回給用戶(hù)了。Observers的需求源于ZooKeeper服務(wù)器在上述協(xié)議中實(shí)際扮演了兩個(gè)角色。它們從客戶(hù)端接受連接與操作請(qǐng)求,之后對(duì)操作結(jié)果進(jìn)行投票。這兩個(gè)職能在 ZooKeeper集群擴(kuò)展的時(shí)候彼此制約。如果我們希望增加ZooKeeper集群服務(wù)的客戶(hù)數(shù)量(我們經(jīng)常考慮到有上萬(wàn)個(gè)客戶(hù)端的情況),那么我們必須增加服務(wù)器的數(shù)量,來(lái)支持這么多的客戶(hù)端。
然而,從一致性協(xié)議的描述可以看到,增加服務(wù)器的數(shù)量增加了對(duì)協(xié)議的投票部分的壓力。領(lǐng)導(dǎo)節(jié)點(diǎn)必須等待集群中過(guò)半數(shù)的服務(wù)器響應(yīng)投票。于是,節(jié)點(diǎn)的增加使得部分計(jì)算機(jī)運(yùn)行較慢,從而拖慢整個(gè)投票過(guò)程的可能性也隨之提高,投票操作會(huì)隨之下降。這正是我們?cè)趯?shí)際操作中看到的問(wèn)題——隨著ZooKeeper集群變大,投票操作的吞吐量會(huì)下降。所以,這讓我們不得不在增加客戶(hù)節(jié)點(diǎn)數(shù)量的期望和保持較好吞吐性能的期望間進(jìn)行權(quán)衡。
為了打破這一耦合關(guān)系,我們引入了不參與投票的服務(wù)器,稱(chēng)為Observers。Observers可以接受客戶(hù)端的連接,將寫(xiě)請(qǐng)求轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)節(jié)點(diǎn)。但是,領(lǐng)導(dǎo)節(jié)點(diǎn)不會(huì)要求Observers參加投票,所以,Observers不參與投票過(guò)程,而是和其他服務(wù)節(jié)點(diǎn)一起得到投票結(jié)果。
這個(gè)簡(jiǎn)單的擴(kuò)展給ZooKeeper的可伸縮性帶來(lái)了全新的景像。我們現(xiàn)在可以加入很多Observers節(jié)點(diǎn),而無(wú)須擔(dān)心嚴(yán)重影響寫(xiě)吞吐量。然而,規(guī)模伸縮并非無(wú)懈可擊——協(xié)議中的一步(通知階段)仍然與服務(wù)器的數(shù)量呈線性關(guān)系。
不過(guò)這里的串行開(kāi)銷(xiāo)非常低,我們可以認(rèn)為在通知服務(wù)器階段的開(kāi)銷(xiāo)無(wú)法成為主要瓶頸。圖2顯示了一個(gè)簡(jiǎn)單評(píng)測(cè)的結(jié)果,縱軸表示我能夠從一個(gè)單一的客戶(hù)端發(fā)出的每秒鐘同步寫(xiě)操作的數(shù)量(一個(gè)調(diào)優(yōu)的ZooKeeper可以得到更好的每秒鐘操作數(shù)——這里我們更感興趣的是相對(duì)值),橫軸是ZooKeeper集群的尺寸。
藍(lán)色部分表示每個(gè)服務(wù)器都是Voting服務(wù)器的情況,而綠色部分則只有三個(gè)是Voting服務(wù)器,其它都是Observers。測(cè)評(píng)結(jié)果顯示我們擴(kuò)充Observers,寫(xiě)性能幾乎可以保持不變,但如果同時(shí)擴(kuò)展Voting節(jié)點(diǎn)的數(shù)量的話,性能就會(huì)明顯下降。Observers的有效性顯而易見(jiàn)的,它們給集群帶來(lái)了很多好處。
Observers同樣提升讀性能的可伸縮性
增加客戶(hù)端的數(shù)量只是Observers的一個(gè)重要用例。作為一個(gè)優(yōu)化,ZooKeeper 服務(wù)器可以直接讀取它們的本地?cái)?shù)據(jù)存儲(chǔ),而無(wú)須經(jīng)過(guò)投票過(guò)程,這面臨一定的“時(shí)光旅行”風(fēng)險(xiǎn)。可能在讀到新值之后又讀到老值,但這只在服務(wù)器故障時(shí)才會(huì)發(fā)生。事實(shí)上,在這種情況下客戶(hù)端可以請(qǐng)求一個(gè)“sync”操作來(lái)保證下一個(gè)值是最新的。
因此,在大量讀操作的工作負(fù)載下,Observers是個(gè)巨大的性能提升。寫(xiě)操作直接進(jìn)入標(biāo)準(zhǔn)的投票路徑,這樣,與客戶(hù)端可擴(kuò)展性類(lèi)似,提高投票服務(wù)器數(shù)量來(lái)承擔(dān)讀操作會(huì)影響寫(xiě)
性能。Observers允許我們將讀性能和寫(xiě)性能分開(kāi)。這適用于ZooKeeper的很多應(yīng)用場(chǎng)景,大部分客戶(hù)端很少寫(xiě),但經(jīng)常讀。
Observers提供了廣域網(wǎng)能力
Observers對(duì)于跨廣域網(wǎng)連接的客戶(hù)端來(lái)說(shuō)是很好的候選方案。這有三個(gè)原因:首先,為了獲得很好的讀性能,有必要讓客戶(hù)端離服務(wù)器盡量近,這樣往返時(shí)延不會(huì)太高。然而,
將ZooKeeper集群分散到兩個(gè)集群是非常不可取的設(shè)計(jì),因?yàn)榱己门渲玫腪ooKeeper 應(yīng)該讓投票服務(wù)器間用低時(shí)延連接互聯(lián)——否則我們將會(huì)遇到上面提到的低反應(yīng)速度的問(wèn)題。
其次,Observers可以被部署在需要訪問(wèn)ZooKeeper的任意數(shù)據(jù)中心中。這樣,投票協(xié)議不會(huì)受到數(shù)據(jù)中心間鏈路的高時(shí)延的影響,性能得到提升。投票過(guò)程中Observers和領(lǐng)導(dǎo)節(jié)點(diǎn)間的消息遠(yuǎn)少于投票服務(wù)器和領(lǐng)導(dǎo)節(jié)點(diǎn)間的消息。這有助于在遠(yuǎn)程數(shù)據(jù)中心高寫(xiě)負(fù)載的情況下降低帶寬需求。
最后,由于Observers即使失效也不會(huì)影響到投票集群,這樣如果數(shù)據(jù)中心間鏈路發(fā)生故障,也不會(huì)影響到服務(wù)本身的可用性。這種故障的發(fā)生概率要遠(yuǎn)高于一個(gè)數(shù)據(jù)中心機(jī)架間的連接的故障概率,所以不依賴(lài)于這種鏈路是個(gè)優(yōu)點(diǎn)。
如何開(kāi)始使用Observers
O b s e r v e r s 還 沒(méi) 有 成 為 某 個(gè)ZooKeeper release 的一部分,所以要使用它,你需要從 Subversion trunk 獲取源代碼。
下面的內(nèi)容提取自Observers用戶(hù)手冊(cè),可以在源代碼的d o c s /zooKeeperObservers.html 文件中看到。
如何使用Observers
注意,在ZOOKEEPER-578 解決之前,你必須在每個(gè)服務(wù)器的配置文件中設(shè)置electionAlg=0 。否則當(dāng)你啟動(dòng)服務(wù)的時(shí)候會(huì)拋出一個(gè)異常。
原因:Observers并不參與領(lǐng)導(dǎo)節(jié)點(diǎn)的選舉,它們依賴(lài)于投票 Followers 來(lái)獲知領(lǐng)導(dǎo)的變動(dòng)。目前,只有基本 選 舉 算 法 啟 動(dòng) 一 個(gè) 線 程 來(lái) 響 應(yīng)Observers確定當(dāng)前領(lǐng)導(dǎo)的請(qǐng)求。其他JIRA 上的工作將會(huì)讓其他所有的領(lǐng)導(dǎo)選舉協(xié)議都支持這一功能。
設(shè)置ZooKeeper使用Observers非常簡(jiǎn)單,只需要在配置文件中有兩處改動(dòng)。首先是每個(gè) Observer 的配置文件中都要有這么一行:
peerType=observer
這行讓服務(wù)器作為一個(gè) Observer 來(lái)工作。之后,在每個(gè)服務(wù)器配置文件中,你必須在服務(wù)器定義行,給每個(gè) Observer加入observer。比如:
server.1:localhost:2181:3181:observer
這讓每個(gè)其他服務(wù)器知道 server.1是一個(gè) Observer,就不會(huì)期望它進(jìn)行投票了。這就是要加入一個(gè) Observer 的時(shí)候,所有你需要做的配置。現(xiàn)在可以將它作為一個(gè)正常的 Follower 來(lái)看待了。可以這樣試試:
bin/zkCli.sh -server
localhost:2181
這里 localhost:2181 是 Observer 在每個(gè)配置文件中指定的主機(jī)名和端口號(hào)。你應(yīng)該看到命令行提示了,這時(shí)就可以查詢(xún)ZooKeeper服務(wù)了。
下一步工作
Observers特性還有很多工作要做。短期內(nèi),我們將致力于讓Observers與ZooKeeper中的所有領(lǐng)導(dǎo)選舉算法完全兼容 —— 我們希望這個(gè)可以在未來(lái)幾天內(nèi)完成。長(zhǎng)期看,我們希望能研究一下進(jìn)行性能優(yōu)化,比如基于Observers的集群的批量和離線讀取,來(lái)更好地利用Observers不像一般ZooKeeper服務(wù)器一樣嚴(yán)格要求時(shí)延的好處。
我們希望Observers能進(jìn)入明年年初的ZooKeeper3.3.0。此外我們會(huì)很高興能聽(tīng)到你的反饋,不管 是 在 郵 件 列 表 里 還 是 直 接 發(fā) 送E-mail。ZooKeeper 長(zhǎng)期招募貢獻(xiàn)
者,我們有足夠多的有趣的問(wèn)題來(lái)解決。
福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計(jì)算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!
推薦閱讀:
VMware竟然出了一款防火墻
技術(shù)頭條
你的 AI 老師已上崗
技術(shù)頭條
助力 Android 抗衡 iOS,華為發(fā)布方舟編譯器!
程序員的黑磚窯,東南亞博彩騙局詳解
售價(jià)910元!周志華等人英文新書(shū)《演化學(xué)習(xí)》出爐!
真香,朕在看了!
總結(jié)
以上是生活随笔為你收集整理的Observers:让 ZooKeeper更具可伸缩性 | 时光机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大兴安岭驾车到昌吉回族自治州车师古道会经
- 下一篇: 景德镇自驾到昌吉回族自治州车师古道多少公