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