什么是分布式系統(tǒng)?分布式系統(tǒng)主要分成存儲模型和計(jì)算模型兩類。其中計(jì)算模型的分布式系統(tǒng)原理與存儲模型類似,只是會根據(jù)自身計(jì)算特點(diǎn)加一些特殊調(diào)度邏輯進(jìn)去。任何一個分布式系統(tǒng)都需要考慮如下幾個問題。
1.?dāng)?shù)據(jù)如何存儲
就像把雞蛋放進(jìn)籃子里面。一般來說籃子大小是一樣的,當(dāng)然也有的系統(tǒng)支持不一樣大小的籃子。雞蛋大小也不一樣,有很多系統(tǒng)就把雞蛋給“切割”成一樣大小然后再放。并且有的雞蛋表示對籃子有要求,如對機(jī)房/機(jī)架位的要求。衡量一個數(shù)據(jù)分布算法好不好就看它是否分得足夠均勻,使得所有機(jī)器的負(fù)載方差足夠小。
2.?dāng)?shù)據(jù)如何容災(zāi)
分布式系統(tǒng)一個很重要的定位就是要讓程序自動來管機(jī)器,盡量減少人工參與,否則一個分布式系統(tǒng)的運(yùn)維成本將是不可接受的。系統(tǒng)中最容易出問題的硬盤的年故障率可能會達(dá)到10%。這樣算下來,一個有1000臺機(jī)器的集群,每一個星期就會有2臺機(jī)器宕機(jī)。在機(jī)器數(shù)量大了之后,這是一個很正常的事情。一般一臺機(jī)器出故障之后修復(fù)周期是24小時,這個過程中進(jìn)行人工接入換設(shè)備或者重啟機(jī)器。在機(jī)器恢復(fù)之后內(nèi)存信息完全丟失,硬盤信息可能可以保存。一個分布式系統(tǒng)必須保證一臺機(jī)器的宕機(jī)對服務(wù)不受影響,并且在修復(fù)好了之后再重新放到集群當(dāng)中之后也能正常工作。
3.網(wǎng)絡(luò)故障
網(wǎng)絡(luò)故障是最常見的故障,就是該問題會大大增加分布式系統(tǒng)設(shè)計(jì)的難度,故障一般發(fā)生在網(wǎng)絡(luò)擁塞、路由變動、設(shè)備異常等情況出現(xiàn)時。出現(xiàn)的問題可能是丟包,可能是延時,也可能是完全失去連接。有鑒于此,一般在設(shè)計(jì)分布式系統(tǒng)的時候,四層協(xié)議都采用TCP,很少采用UDP/UDT協(xié)議。而且由于TCP協(xié)議并不能完全保證數(shù)據(jù)傳輸?shù)綄γ?,如?dāng)再發(fā)送數(shù)據(jù),只要數(shù)據(jù)寫入本地緩沖區(qū),操作系統(tǒng)就會返回應(yīng)用層說發(fā)送成功,但是有可能根本沒送到對面。所以一般還需要加上應(yīng)用層的ACK,來保證網(wǎng)絡(luò)層的行為是可預(yù)期的。
4.如何保證數(shù)據(jù)讀寫一致性
想獲知數(shù)據(jù)是否具有一致性很簡單,就是更新/刪除請求返回之后,別人是否能讀到新寫的這個值。對于單機(jī)系統(tǒng),這個一致性要達(dá)到很簡單,大不了是損失一點(diǎn)寫的效率。但是對于分布式系統(tǒng)就復(fù)雜了。為了容災(zāi),一份數(shù)據(jù)肯定有多個副本,那么如何更新這多個副本以及控制讀寫協(xié)議就成了一個大問題。而且有的寫操作可能會跨越多個分片,復(fù)制副本的時候甚至出現(xiàn)網(wǎng)絡(luò)故障,造成保證數(shù)據(jù)一致性的難度成倍增加。
對于普通用戶而言,常見的數(shù)據(jù)存儲方式為集中式存儲,例如,計(jì)算機(jī)中C盤,或者映射的網(wǎng)絡(luò)硬盤等,一旦硬盤出現(xiàn)故障,系統(tǒng)將出現(xiàn)不可恢復(fù)的故障。與傳統(tǒng)集中式存儲不同,分布式存儲技術(shù)并不是將數(shù)據(jù)存儲在某個或多個特定的節(jié)點(diǎn)上,而是通過網(wǎng)絡(luò)使用企業(yè)中的每臺機(jī)器上的硬盤空間,并將這些分散的存儲資源構(gòu)成一個虛擬的存儲設(shè)備,數(shù)據(jù)分散在企業(yè)的各個角落,每個分散的數(shù)據(jù)甚至復(fù)制多個副本進(jìn)行分散存儲在不同節(jié)點(diǎn),一旦某個副本出現(xiàn),如上面的網(wǎng)絡(luò)故障或者丟失等,通過一致性檢查,出現(xiàn)故障或丟失的副本即將被恢復(fù)出來。
常見的分布式文件系統(tǒng)有HDFS、GlusterFS、Lustre、MooseFS、Ceph等。各自適用于不同的領(lǐng)域。它們都不是系統(tǒng)級的分布式文件系統(tǒng),而是應(yīng)用級的分布式文件存儲服務(wù)。