HDFS 架構解析
本文以 Hadoop 提供的分佈式文件系統(HDFS)爲例來進一步展開解析分佈式存儲服務架構設計的要點。
架構目標
任何一種軟件框架或服務都是爲了解決特定問題而產生的。還記得我們在 《分佈式存儲 - 概述》一文中描述的幾個關注方面麼?分佈式文件系統屬於分佈式存儲中的一種面向文件的數據模型,它需要解決單機文件系統面臨的容量擴展和容錯問題。
所以 HDFS 的架構設計目標就呼之欲出了:
- 面向超大文件或大量的文件數據集
- 自動檢測局部的硬件錯誤並快速恢復
基於此目標,考慮應用場景出於簡化設計和實現的目的,HDFS 假設了一種 write-once-read-many 的文件訪問模型。這種一次寫入並被大量讀出的模型在現實中確實適應很多業務場景,架構設計的此類假設是合理的。正因爲此類假設的存在,也限定了它的應用場景。
架構總攬
下面是一張來自官方文檔的架構圖:
從圖中可見 HDFS 的架構包括三個部分,每個部分有各自清晰的職責劃分。
- NameNode
- DataNode
- Client
從圖中可見,HDFS 採用的是中心總控式架構,NameNode 就是集羣的中心節點。
NameNode
NameNode 的主要職責是管理整個文件系統的元信息(Metadata),元信息主要包括:
- File system namesapce
HDFS 類似單機文件系統以目錄樹的形式組織文件,稱爲 file system namespace
- Replication factor
文件副本數,針對每個文件設置
- Mapping of blocks to DataNodes
文件塊到數據節點的映射關係
在上面架構圖中,指向 NameNode 的 Metadata ops 主要就是針對文件的創建、刪除、讀取和設置文件的副本數等操作,所以所有的文件操作都繞不過 NameNode。除此之外 NameNode 還負責管理 DataNode,如新的 DataNode 加入集羣,舊的 DataNode 退出集羣,在 DataNode 之間負載均衡文件數據塊的分佈等等。更多關於 NameNode 的設計實現分析,後面會單獨成文詳解。
DataNode
DataNode 的職責如下:
- 存儲文件塊(block)
- 服務響應 Client 的文件讀寫請求
- 執行文件塊的創建、刪除和複製
從架構圖上看到有個 Block ops 的操作箭頭從 NameNode 指向 DataNode,會讓人誤以爲 NameNode 會主動向 DataNode 發出指令調用。實際上 NameNode 從不調用 DataNode,僅僅是通過 DataNode 定期向 NameNode 發送心跳來攜帶回傳的指令信息。
架構圖上專門標記了 Rack1 和 Rack2,表明了 HDFS 在考慮文件數據塊的多副本分佈時針對機架感知作了專門設計,細節我們這裏先不展開,更多關於 DataNode 的設計實現分析,後面會單獨成文詳解。
Client
考慮到 HDFS 交互過程的複雜性,所以特地提供了針特定編程語言的 Client 以簡化使用。Client 的職責如下:
- 提供面向應用編程語言的一致 API,簡化應用編程
- 改善訪問性能
Client 之所以能夠改善性能是因爲針對讀可以提供緩存(cache),針對寫可以通過緩衝(buffer)批量方式,細節我們這裏也先不展開,更多關於 Client 的設計實現分析,後面會單獨成文詳解。
總結
本來想在一篇文章裏寫完 HDFS 架構解析的,寫着寫着發現不太可能。作爲分佈式系統中最複雜的分佈式存儲類系統,每一個架構設計權衡的實現細節點,都值得好好推敲,一旦展開此文感覺就會長的沒完沒了,所以這裏先總體過一下,針對每個部分的設計實現細節再以主題文章來詳細解析。
參考
[1]Hadoop Documentation. HDFS
Architecture.
[2]Robert Chansler, Hairong Kuang, Sanjay Radia, Konstantin Shvachko, and Suresh Srinivas. The Hadoop Distributed File System
轉載自:http://www.cnblogs.com/mindwind/p/4833102.html