設計預期每每針對系統的應用場景,是系統在不一樣選擇間作balance的重要依據,對於理解GFS在系統設計時爲什麼作出現有的決策相當重要。因此咱們應重點關注:緩存
GFS主要由如下三個系統模塊組成:服務器
因爲GFS主要面向大文件存儲和大規模讀寫操做,因此其選擇了遠大於通常文件系統的64MB的Chunk尺寸。網絡
好處:架構
壞處:併發
可能的解決方案:負載均衡
Master存儲的元數據包括:命名空間、文件和Chunk的對應關係、Chunk位置信息。分佈式
命名空間、文件和Chunk的對應關係的存儲方式:優化
Chunk位置信息的存儲方式:設計
系統啓動和新Chunk服務器加入時從Chunk服務器獲取。避免了Master與ChunkServer之間的數據同步,只有Chunk服務器才能最終肯定Chunk是否在它的硬盤上。3d
命名空間修改:原子性和正確性
文件數據修改(以後詳細解釋):
最小化全部操做與Master的交互。
最小化讀取操做與Master的交互:
客戶端訪問Chunk前從Master獲取元數據的過程當中,會預取和緩存部分Chunk的元數據,從而減小與Master的交互。
最小化變動操做與Master的交互:
Master收到變動操做請求後
數據推送與控制操做同時進行。
數據流:管道方式按最優化的Chunk服務器鏈推送,以最大化帶寬,最小化延時(全雙工交換網絡,每臺機器進出帶寬最大化);
控制流:
一次寫入數據過大,可能被客戶端分爲多個寫操做,這些寫操做序號可能不連續,被其餘併發寫操做打斷或覆蓋,出現數據一致但未定義的狀態。
追加寫時GFS推薦的寫入方式,應重點研究。
a. 原子記錄追加:客戶端指定寫入數據,GFS返回真實寫入偏移量。
b. 追加寫的過程:
c. 追加結果:失敗的追加操做可能致使Chunk間字節級別不一致,但當最終追加成功後,全部副本在返回的偏移位置一致已定義,以後的追加操做不受影響。以下圖所示:
d. 冗餘數據處理:對於追加寫產生的冗餘數據
可在插入數據時附帶記錄級別的Checksum或惟一標識符,在客戶端讀取數據時進行校驗過濾。
使用COW技術,瞬間完成。快照實現的過程:
多操做並行,名稱空間鎖保證執行順序,文件操做需得到父目錄讀鎖和目標文件/目錄寫鎖。
Chunk跨機架分佈:
好處 -
壞處 - 寫操做需跨機架通訊。
a. 建立操做,主要考慮:
b. 重複制,即有效副本不足時,經過複製增長副本數。優先考慮:
Chunk進行重複制。策略與建立相似。
c. 重負載均衡,經過調整副本位置,平衡格機負載。策略與建立相似。新ChunkServer將被逐漸填滿。
惰性回收空間:刪除操做僅在文件名後添加隱藏標記,Master在常規掃描中刪除超時隱藏文件的元數據,並通知對應ChunkServer刪除Chunk。
好處 -
壞處 - 不便於用戶進行存儲空間調優。
解決方案 - 再次刪除加速回收,不一樣命名空間不一樣複製回收策略。
過時檢測:Master維護Chunk級別版本號,新租約增長Chunk版本號,並通知全部副本更新版本號,過時Chunk會因版本號過舊被檢測。
主要的提升可用性的機制:
ChunkServer獨立維護CheckSum檢驗副本完整性。緣由:
Chunk讀取和Chunk服務器空閒時,進行CheckSum校驗,發現損壞Chunk上報Master,進行重複制。
Checksum校驗的開銷:
但總體開銷能夠接受,特別是對追加寫操做。
覆蓋寫與追加寫的Checksum計算開銷比較。二者的關鍵區別在於不完整塊的CheckSum計算:
本文是我在閱讀論文《The Google File System》時記下的筆記,對論文的各部份內容進行了梳理。
系統設計過程每每就是在各類因素間根據目標需求權衡利弊的過程。分佈式系統設計須要權衡的問題存在許多共性,GFS在設計過程當中基於分佈式環境的特色,作的許多重要決策對於其餘分佈式系統開發具備指導性的意義。
因此,我盡力把以爲有趣的設計要點進行了提煉,並對重要細節進行了重點分析,特別是各類權衡帶來的好處和壞處,以及針對最終選擇帶來的壞處的彌補方案。
若是這篇文章在梳理本身思路的同時,能爲感興趣的朋友們提供一點點幫助,那也算作了件有意義的事情了!