(三):持久化存儲(chǔ)和容錯(cuò)

2018-02-24 16:03 更新

來源:http://www.infoq.com/cn/articles/analyse-mesos-part-03

在深入淺出Mesos系列的第一篇文章中,我對(duì)相關(guān)的技術(shù)做了簡(jiǎn)要概述,在第二篇文章中,我深入介紹了Mesos的架構(gòu)。完成第二篇文章之后,我本想開始著手寫一篇Mesos如何處理資源分配的文章。不過,我收到一些讀者的反饋,于是決定在談資源分配之前,先完成這篇關(guān)于Mesos持久化存儲(chǔ)和容錯(cuò)的文章。

持久化存儲(chǔ)的問題

正如我在前文中討論過的,使用Mesos的主要好處是可以在同一組計(jì)算節(jié)點(diǎn)集合上運(yùn)行多種類型的應(yīng)用程序(調(diào)度以及通過Framework初始化任務(wù))。這些任務(wù)使用隔離模塊(目前是某些類型的容器技術(shù))從實(shí)際節(jié)點(diǎn)中抽象出來,以便它們可以根據(jù)需要在不同的節(jié)點(diǎn)上移動(dòng)和重新啟動(dòng)。

由此我們會(huì)思考一個(gè)問題,Mesos是如何處理持久化存儲(chǔ)的呢?如果我在運(yùn)行一個(gè)數(shù)據(jù)庫作業(yè),Mesos如何確保當(dāng)任務(wù)被調(diào)度時(shí),分配的節(jié)點(diǎn)可以訪問其所需的數(shù)據(jù)?如圖所示,在Hindman的示例中,使用Hadoop文件系統(tǒng)(HDFS)作為Mesos的持久層,這是HDFS常見的使用方式,也是Mesos的執(zhí)行器傳遞分配指定任務(wù)的配置數(shù)據(jù)給Slave經(jīng)常使用的方式。實(shí)際上,Mesos的持久化存儲(chǔ)可以使用多種類型的文件系統(tǒng),HDFS只是其中之一,但也是Mesos最經(jīng)常使用的,它使得Mesos具備了與高性能計(jì)算的親緣關(guān)系。其實(shí)Mesos可以有多種選擇來處理持久化存儲(chǔ)的問題:

  • 分布式文件系統(tǒng)。如上所述,Mesos可以使用DFS(比如HDFS或者Lustre)來保證數(shù)據(jù)可以被Mesos集群中的每個(gè)節(jié)點(diǎn)訪問。這種方式的缺點(diǎn)是會(huì)有網(wǎng)絡(luò)延遲,對(duì)于某些應(yīng)用程序來說,這樣的網(wǎng)絡(luò)文件系統(tǒng)或許并不適合。

  • 使用數(shù)據(jù)存儲(chǔ)復(fù)制的本地文件系統(tǒng)。另一種方法是利用應(yīng)用程序級(jí)別的復(fù)制來確保數(shù)據(jù)可被多個(gè)節(jié)點(diǎn)訪問。提供數(shù)據(jù)存儲(chǔ)復(fù)制的應(yīng)用程序可以是NoSQL數(shù)據(jù)庫,比如Cassandra和MongoDB。這種方式的優(yōu)點(diǎn)是不再需要考慮網(wǎng)絡(luò)延遲問題。缺點(diǎn)是必須配置Mesos,使特定的任務(wù)只運(yùn)行在持有復(fù)制數(shù)據(jù)的節(jié)點(diǎn)上,因?yàn)槟悴粫?huì)希望數(shù)據(jù)中心的所有節(jié)點(diǎn)都復(fù)制相同的數(shù)據(jù)。為此,可以使用一個(gè)Framework,靜態(tài)地為其預(yù)留特定的節(jié)點(diǎn)作為復(fù)制數(shù)據(jù)的存儲(chǔ)。

  • 不使用復(fù)制的本地文件系統(tǒng)。也可以將持久化數(shù)據(jù)存儲(chǔ)在指定節(jié)點(diǎn)的文件系統(tǒng)上,并且將該節(jié)點(diǎn)預(yù)留給指定的應(yīng)用程序。和前面的選擇一樣,可以靜態(tài)地為指定應(yīng)用程序預(yù)留節(jié)點(diǎn),但此時(shí)只能預(yù)留給單個(gè)節(jié)點(diǎn)而不是節(jié)點(diǎn)集合。后面兩種顯然不是理想的選擇,因?yàn)閷?shí)質(zhì)上都需要?jiǎng)?chuàng)建靜態(tài)分區(qū)。然而,在不允許延時(shí)或者應(yīng)用程序不能復(fù)制它的數(shù)據(jù)存儲(chǔ)等特殊情況下,我們需要這樣的選擇。

Mesos項(xiàng)目還在發(fā)展中,它會(huì)定期增加新功能?,F(xiàn)在我已經(jīng)發(fā)現(xiàn)了兩個(gè)可以幫助解決持久化存儲(chǔ)問題的新特性:

  • 動(dòng)態(tài)預(yù)留。Framework可以使用這個(gè)功能框架保留指定的資源,比如持久化存儲(chǔ),以便在需要啟動(dòng)另一個(gè)任務(wù)時(shí),資源邀約只會(huì)發(fā)送給那個(gè)Framework。這可以在單節(jié)點(diǎn)和節(jié)點(diǎn)集合中結(jié)合使用Framework配置,訪問永久化數(shù)據(jù)存儲(chǔ)。關(guān)于這個(gè)建議的功能的更多信息可以從此處獲得。

  • 持久化卷。該功能可以創(chuàng)建一個(gè)卷,作為Slave節(jié)點(diǎn)上任務(wù)的一部分被啟動(dòng),即使在任務(wù)完成后其持久化依然存在。Mesos為需要訪問相同的數(shù)據(jù)后續(xù)任務(wù),提供在可以訪問該持久化卷的節(jié)點(diǎn)集合上相同的Framework來初始化。關(guān)于這個(gè)建議的功能的更多信息可以從此處獲得。

容錯(cuò)

接下來,我們來談?wù)凪esos在其協(xié)議棧上是如何提供容錯(cuò)能力的。恕我直言,Mesos的優(yōu)勢(shì)之一便是將容錯(cuò)設(shè)計(jì)到架構(gòu)之中,并以可擴(kuò)展的分布式系統(tǒng)的方式來實(shí)現(xiàn)。

  • Master。故障處理機(jī)制和特定的架構(gòu)設(shè)計(jì)實(shí)現(xiàn)了Master的容錯(cuò)。

    首先,Mesos決定使用熱備份(hot-standby)設(shè)計(jì)來實(shí)現(xiàn)Master節(jié)點(diǎn)集合。正如Tomas Barton對(duì)上圖的說明,一個(gè)Master節(jié)點(diǎn)與多個(gè)備用(standby)節(jié)點(diǎn)運(yùn)行在同一集群中,并由開源軟件Zookeeper來監(jiān)控。Zookeeper會(huì)監(jiān)控Master集群中所有的節(jié)點(diǎn),并在Master節(jié)點(diǎn)發(fā)生故障時(shí)管理新Master的選舉。建議的節(jié)點(diǎn)總數(shù)是5個(gè),實(shí)際上,生產(chǎn)環(huán)境至少需要3個(gè)Master節(jié)點(diǎn)。 Mesos決定將Master設(shè)計(jì)為持有軟件狀態(tài),這意味著當(dāng)Master節(jié)點(diǎn)發(fā)生故障時(shí),其狀態(tài)可以很快地在新選舉的Master節(jié)點(diǎn)上重建。 Mesos的狀態(tài)信息實(shí)際上駐留在Framework調(diào)度器和Slave節(jié)點(diǎn)集合之中。當(dāng)一個(gè)新的Master當(dāng)選后,Zookeeper會(huì)通知Framework和選舉后的Slave節(jié)點(diǎn)集合,以便使其在新的Master上注冊(cè)。彼時(shí),新的 Master可以根據(jù)Framework和Slave節(jié)點(diǎn)集合發(fā)送過來的信息,重建內(nèi)部狀態(tài)。

  • Framework調(diào)度器。Framework調(diào)度器的容錯(cuò)是通過Framework將調(diào)度器注冊(cè)2份或者更多份到Master來實(shí)現(xiàn)。當(dāng)一個(gè)調(diào)度器發(fā)生故障時(shí),Master會(huì)通知另一個(gè)調(diào)度來接管。需要注意的是Framework自身負(fù)責(zé)實(shí)現(xiàn)調(diào)度器之間共享狀態(tài)的機(jī)制。

  • Slave。Mesos實(shí)現(xiàn)了Slave的恢復(fù)功能,當(dāng)Slave節(jié)點(diǎn)上的進(jìn)程失敗時(shí),可以讓執(zhí)行器/任務(wù)繼續(xù)運(yùn)行,并為那個(gè)Slave進(jìn)程重新連接那臺(tái)Slave節(jié)點(diǎn)上運(yùn)行的執(zhí)行器/任務(wù)。當(dāng)任務(wù)執(zhí)行時(shí),Slave會(huì)將任務(wù)的監(jiān)測(cè)點(diǎn)元數(shù)據(jù)存入本地磁盤。如果Slave進(jìn)程失敗,任務(wù)會(huì)繼續(xù)運(yùn)行,當(dāng)Master重新啟動(dòng)Slave進(jìn)程后,因?yàn)榇藭r(shí)沒有可以響應(yīng)的消息,所以重新啟動(dòng)的Slave進(jìn)程會(huì)使用檢查點(diǎn)數(shù)據(jù)來恢復(fù)狀態(tài),并重新與執(zhí)行器/任務(wù)連接。

如下情況則截然不同,計(jì)算節(jié)點(diǎn)上Slave正常運(yùn)行而任務(wù)執(zhí)行失敗。在此,Master負(fù)責(zé)監(jiān)控所有Slave節(jié)點(diǎn)的狀態(tài)。

2015-07-31/55bb142776666

當(dāng)計(jì)算節(jié)點(diǎn)/Slave節(jié)點(diǎn)無法響應(yīng)多個(gè)連續(xù)的消息后,Master會(huì)從可用資源的列表中刪除該節(jié)點(diǎn),并會(huì)嘗試關(guān)閉該節(jié)點(diǎn)。

然后,Master會(huì)向分配任務(wù)的Framework調(diào)度器匯報(bào)執(zhí)行器/任務(wù)失敗,并允許調(diào)度器根據(jù)其配置策略做任務(wù)失敗處理。通常情況下,F(xiàn)ramework會(huì)重新啟動(dòng)任務(wù)到新的Slave節(jié)點(diǎn),假設(shè)它接收并接受來自Master的相應(yīng)的資源邀約。

  • 執(zhí)行器/任務(wù)。與計(jì)算節(jié)點(diǎn)/Slave節(jié)點(diǎn)故障類似,Master會(huì)向分配任務(wù)的Framework調(diào)度器匯報(bào)執(zhí)行器/任務(wù)失敗,并允許調(diào)度器根據(jù)其配置策略在任務(wù)失敗時(shí)做出相應(yīng)的處理。通常情況下,F(xiàn)ramework在接收并接受來自Master的相應(yīng)的資源邀約后,會(huì)在新的Slave節(jié)點(diǎn)上重新啟動(dòng)任務(wù)。

結(jié)論

在接下來的文章中,我將更深入到資源分配模塊。同時(shí),我非常期待讀者的反饋,特別是關(guān)于如果我打標(biāo)的地方,如果你發(fā)現(xiàn)哪里不對(duì),請(qǐng)反饋給我。我非全知,虛心求教,所以期待讀者的校正和啟示。我也會(huì)在twitter響應(yīng)你的反饋,請(qǐng)關(guān)注 @hui_kenneth。

查看英文原文:?DEALING WITH PERSISTENT STORAGE AND FAULT TOLERANCE IN APACHE MESOS

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)