在深入淺出Mesos系列的第一篇文章中,我對(duì)相關(guān)的技術(shù)做了簡(jiǎn)要概述,在第二篇文章中,我深入介紹了Mesos的架構(gòu)。完成第二篇文章之后,我本想開始著手寫一篇Mesos如何處理資源分配的文章。不過,我收到一些讀者的反饋,于是決定在談資源分配之前,先完成這篇關(guān)于Mesos持久化存儲(chǔ)和容錯(cuò)的文章。
正如我在前文中討論過的,使用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ǔ)。
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è)建議的功能的更多信息可以從此處獲得。
接下來,我們來談?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ī)制。
如下情況則截然不同,計(jì)算節(jié)點(diǎn)上Slave正常運(yùn)行而任務(wù)執(zhí)行失敗。在此,Master負(fù)責(zé)監(jiān)控所有Slave節(jié)點(diǎn)的狀態(tài)。
當(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)的資源邀約。
在接下來的文章中,我將更深入到資源分配模塊。同時(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
更多建議: