分散式(叢集)檔案系統的設計
阿新 • • 發佈:2019-01-08
本文講的分散式檔案系統,是通過叢集來實現的,因此也是叢集檔案系統。本文介紹下分散式檔案系統中的常見問題及GFS中給出的解決方法。
設計要點:
效能
提高效能的方法就是並行,講一個任務分解成多個任務,同時執行。
GFS中的思路是將檔案分塊,每個塊是一個chunk,每個chunk單獨儲存,儲存chunk的節點叫chunkserver。對檔案的讀寫,可以轉成對chunk的讀寫,不同的chunk可以並行執行,提高效率。每個chunk有唯一的一個chunk handle表示,chunk的大小(chunk size)需要根據應用特點決定。chunk size過大,影響並行度;過小,佔用更多的metadata空間,更多的chunk解析時間。
高可用性(availability)和可靠性(reliability)
可用性指系統平均宕機時間佔總使用時間的比例,越小越好。
可控性指系統的平均無故障執行時間,越長越好。
高可用性可以通過硬體冗餘(redundency)實現,當一個硬體不能工作的時候,迅速切換到備份系統。縮小切換時間可以增加系統的可用性。
提高容錯性(fault tolerance)可以提高系統的可靠性,一個component失效,不會影響整體的功能。
GFS中採用的就是硬體冗餘的方法來實現高可用和高可靠。master和chunkserver都有備份,對於chunkserver,有3個節點互為備份,備份以chunk為單位進行。
master採用主備(master/slave)方式備份。master主節點(primary master)會將自己的狀態資訊(operation log和checkpoint)同步到備份節點上,當主節點不可用時,備份節點可以新的主節點使用。
chunkserver採用負載均衡(load balance)方式備份。每個chunk會被儲存在3臺chunkserver上,每個chunkserver都會參與處理請求。對於讀請求,會選擇距離client較近的chunkserver;對於寫請求,master會選擇一個primary replica,由primary replica負責將client的資料同步到其他的備份節點上。
可擴充套件性
叢集的規模可以根據需要動態擴充套件,主要指儲存能力的擴充套件性,即增加chunkserver的能力。為了支援動態擴充套件,需要做到chunk儲存位置的透明性(Location transparency),使用者不需要知道每個chunk儲存在哪些機器上,而是由系統動態維護。這樣系統中chunkserver的增加和減少就不會影響client的使用。
GFS中的思路,採用一個master節點來儲存所有的元資料(metadata),實現chunk的位置透明性。
master的主要工作:
檔案的namespace管理
類似於傳統檔案系統中的目錄結構,維護系統中已有的檔案。
將檔案對映成chunks
每個檔案由若干個chunk組成。從client看來,chunk由0開始編號直到N。master需要將chunk的邏輯編號(0,1,...N)對映為內部的chunk handle(chunk的唯一全域性標示符)。
chunk位置管理
記錄每個chunk所屬的chunkserver的位置,每個chunk會儲存在多個chunkserver上。根據這個資訊,可以實現chunk的位置無關性。master會和每個chunkserver通訊,已得到每個chunkserver上儲存的chunk資訊。建立新的chunk時,master也會根據一定的演算法來選擇chunkserver(預設選擇3臺,存放3個備份)來儲存chunk。
容錯處理
系統執行中,可能出現chunkserver損壞的情況。master需要將這臺機器上所儲存的chunk進行重新部署(re-replicatoin)。還有隨著機器的增加,還要對chunk存放進行重新的平衡(rebalancing,chunk migration between chunk servers)。
元資料儲存和備份、恢復
上述功能的實現都依賴於metadata,metadata主要儲存在記憶體中。系統中對檔案的更改操作(mutation)都會記錄操作日誌中(operation log,這個日誌類似於關係資料庫系統中的日誌)。記憶體中的metadata也會以checkpoint的形式存放在磁碟上。根據一個checkpoint和在其上進行的operation log,就可以恢復系統的狀態(在checkpoint基礎上重放執行過的所有操作即可)。master就是將checkpoint和operation log備份到其他機器上,來實現備份恢復。
一致性模型(consistency model)
一致性指當一個client更改了檔案的內容時,其他的clients能否看到這些內容,何時看到。
GFS中採用的是強一致性(strong consistency model)模型,這個模型中,當一個client修改完成後,其他的所有clients都會立刻看到修改(不管client是從哪個備份讀)。這個和普通的單機檔案系統是一致的。GFS中沒有提供的檔案讀寫的併發控制,當多個client同時進行更改操作時,檔案內容是不確定的(undefined)
併發控制(concurrency control)
當有多個client同時執行某個操作時,要保證系統的正確性。
GFS中對檔案namespace的操作時原子操作,及多個client同時使用不會產生問題,內部有一定的併發控制策略(通過鎖lock機制實現)。但對檔案內容的讀寫沒有提供併發控制。 GFS還提供了另一種原子操作,附加記錄(Atomic Record Appends)。 總結: 這些問題在每個分散式檔案系統中都會出現,不同的系統可能有不同的解決方法。在學習的時候,可以先關注這些點。