一、完全分布式存在的問題
NameNode單點(diǎn)故障,難以應(yīng)用于在線場景
NameNode壓力過大,且內(nèi)存受限,影響系統(tǒng)擴(kuò)展性
二、高可用結(jié)構(gòu)圖


三、圖例詳解
1、JN實(shí)現(xiàn)主備NN 間的數(shù)據(jù)共享(解決單點(diǎn)故障)
主NameNode對外提供服務(wù),備NameNode同步主NameNode元數(shù)據(jù),以待切換,所有DataNode同時(shí)向兩個(gè)NameNode匯報(bào)數(shù)據(jù)塊信息(位置)
standby:備用namenode,完成了edits.log文件的合并產(chǎn)生新的fsimage,推送回ActiveNN
2、基于Zookeeper自動切換方案
ZooKeeper Failover Controller(zkfc):監(jiān)控NameNode健康狀態(tài),并向Zookeeper注冊NameNode,當(dāng)主NameNode掛掉后,ZKFC(備)為NameNode競爭鎖,獲得ZKFC(備)鎖的NameNode(備)變?yōu)閍ctive。
3、ZKFC的作用
健康檢測:zkfc會周期性的向它監(jiān)控的namenode(只有namenode才有zkfc進(jìn)程,并且每個(gè)namenode各一個(gè))發(fā)生健康探測命令,從而鑒定某個(gè)namenode是否處于正常工作狀態(tài),如果機(jī)器宕機(jī),心跳失敗,那么zkfc就會標(biāo)記它處于不健康的狀態(tài);
會話管理:如果namenode是健康的,zkfc機(jī)會保持在zookeeper中保持一個(gè)打開的會話,如果namenode是active狀態(tài)的,那么zkfc還會在zookeeper中占有一個(gè)類型為短暫類型的znode,當(dāng)這個(gè)namenode掛掉時(shí),這個(gè)znode將會被刪除,然后備用的namenode得到這把鎖,升級為主的namenode,同時(shí)標(biāo)記狀態(tài)為active,當(dāng)宕機(jī)的namenode,重新啟動,他會再次注冊zookeeper,發(fā)現(xiàn)已經(jīng)有znode了,就自動變?yōu)閟tandby狀態(tài),如此往復(fù)循環(huán),保證高可靠性,但是目前僅支持最多配置兩個(gè)namenode.
master選舉:如上所述,通過在zookeeper中維持一個(gè)短暫類型的znode,來實(shí)現(xiàn)搶占式的鎖機(jī)制,從而判斷哪個(gè)namenode為active狀態(tài)。