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