分布式檔案系統是分布式儲存與計算體系的基石。Google 三大論文(GFS、MapReduce、Bigtable)奠定藍圖,Hadoop 以 Java 開源實現(HDFS、MapReduce、HBase、ZooKeeper)落地生根。本文以統一中文術語,結合 GFS 論文設計哲學與 Hadoop 0.19 原始碼實作,系統剖析分布式檔案系統的架構、核心流程與容錯機制。
| 本文術語 | HDFS 術語 | GFS 術語 | 角色說明 |
|---|---|---|---|
| 主控服務器 | NameNode | Master | 檔案系統大腦:管理目錄樹、分塊對應、DataNode 心跳 |
| 數據服務器 | DataNode | ChunkServer | 存儲實際分塊資料的苦力節點 |
| 數據塊 | Block | Chunk | 檔案切分的基本儲存單元(預設 64MB) |
| 數據包 | Packet | — | 客戶端寫入時的網路傳輸單元(64KB) |
| 傳輸塊 | Chunk | — | Packet 內部的校驗單元(512 Bytes + CRC) |
| 備份主控 | SecondaryNameNode | — | 定期合併 edits log 產生新 fsimage 的輔助節點 |
sendHeartbeat)上報容量、區塊列表(blockReport),接收命令(DatanodeCommand)刪除/複製區塊。區塊在本地磁碟以 current/ 目錄樹 + blk_xxx 資料檔 + blk_xxx.meta 中繼檔 儲存。FSNamesystem:核心命名空間管理器FSDirectory:目錄樹操作(inode 增刪改查、權限、配額)INodeFile / INodeFileUnderConstruction:檔案元資料,含 BlockInfo[] 陣列記錄分塊資訊與位置EditLog (FSEditLog):操作日誌,支援多檔案同寫保證持久化FSImage:記憶體狀態的定期序列化快照FSDataset → FSVolumeSet → FSVolume → FSDir:多掛載點、多層級目錄的區塊管理體系DataStorage:支援版本升級/回滾的儲存抽象DataXceiverServer + DataXceiver 執行緒:處理客戶端讀/寫/複製/校驗等 6 類請求全由 Client → NameNode (RPC: ClientProtocol) → FSNamesystem → FSDirectory 完成。NameNode 不主動推送指令給 DataNode,而是將待刪除區塊放入 recentInvalidateSets,待 DataNode 心跳時帶走執行——拉取模式降低通訊開銷。
getBlockLocations(path, offset, length) 取得 LocatedBlocksDataXceiver 以 Packet 為單位流式回傳資料選址策略:當前實作極簡,僅選第一個存活節點,未考慮機架感知與網路拓撲。
INodeFileUnderConstruction(持有租約鎖,防併發寫入)dataQueue → DataStreamer 發送 → 移入 ackQueue 等待應答ackQueue 移除LeaseManager 申請租約(addLease),DFSClient.LeaseChecker 定期 renewLeaseLeaseManager.Monitor 掃描過期租約,強制釋放,避免 INodeFileUnderConstruction 永久佔用sendHeartbeat:高頻(秒級)上報容量、負載,帶回 DatanodeCommand 執行刪除/複製blockReport:低頻(小時級)全量上報區塊列表,NameNode 比對決定指令blockReport 結果緩存,待下次 heartbeat 統一下發,保證指令可重試EditLog(多檔同寫),定期序列化 FSImageSecondaryNameNode 定期 doCheckpoint:下載 fsimage + edits → 合併生成新 fsimage → 上傳回 NameNode → 雙端同步InterDatanodeProtocol 協調各副本截斷至最短長度——至少一份正確,截斷後必定一致ReplicationTargetChooser靜態策略:優先滿足客戶端本地寫入速度、副本分散不同機架(容災)、均衡節點負載。
Balancer (Tool 獨立進程)周期性從 NameNode 取得節點使用率,發送 OP_REPLACE_BLOCK 遷移區塊:目標節點拉取資料 → 通知 NameNode 確認 → 刪除來源副本。
recentInvalidateSetsblockReport 時由 NameNode 比對發現分布式檔案系統的核心矛盾在於單主控元資料管理與多副本資料一致性的協同。HDFS/GFS 通過「租約鎖定寫入順序、流水線複製、CRC 端到端校驗、EditLog/FSImage 斷點恢復、心跳驅動狀態同步」等機制,在商用硬體上構建出高可用、高吞吐的儲存基礎設施。理解這些機制,不僅能用好 Hadoop,更能在設計任何分布式系統時借鑑其核心思想:單點元資料、多點資料、日誌重放、心跳探活、版本向量/租約協調一致性。