非HA的Namenode架構
一個HDFS集群只存在一個Namenode,Datanode只向一個Namenode匯報 ,Namenode的edit log存儲在本地目錄
HA架構:
包含兩個Namenode,主(active)與備(standby),ZKFC(Zookeeper Failover Controller),ZK, share editlog(可以是NFS和QJM)
editlog
Namenode記錄了HDFS的目錄文件等元數據,客戶端每次對文件的增刪改等操作,Namenode都會記錄一條日志,叫做editlog
ZKFC
Zookeeper故障轉移控制器控制Namenode故障轉移過程,每個Namenode對應一個ZKFC
NFS: Network File System
NameNode之間通過NAS進行元數據同步,有一定局限性
QJM: Quorum Journal Manager
(Quorum一致性:w+r>n r>n-w)
由JournalNode(JN)組成,一般是奇數個節點。JournalNode保存共享的編輯日志。每個JournalNode對外有一個簡易的RPC接口,以供NameNode讀寫EditLog到JN本地。
流程:
集群啟動后,一個Namenode處于active狀態,并提供服務,處理客戶端和datanode請求,并把editlog寫到share editlog(JournalNode)和本地。
另一個Namenode處于Standby狀態,它啟動時從fsimage(File System Image)(保存了HDFS中文件名稱,目錄結構,文件權限等信息)加載HDFS元數據到內存,然后周期性地從share editlog(JournalNode)獲取editlog,保持與active的狀態同步。
為了實現standby在active掛掉后迅速提供服務,需要Datanode同時向兩個Namenode發送心跳(block report 塊狀態報告)(健康狀態和塊位置),因為Namenode啟動中最費時的工作是處理所有的datanode的block report。
ZKFC與ZK通信,通過ZK選主,ZKFC通過RPC讓Namenode轉換為active或standby。
防止腦裂
使用QJM實現共享同存儲的fencing,以確保只有一個Namenode能寫成功
Datanode fencing,只有一個Namenode能命令Datanode
客戶端fencing,確保只有一個Namenode能相應客戶端請求,讓訪問standby的Namennode的客戶端直接失敗。