一、HA簡(jiǎn)介
HA(High Available)即高可用丧肴,HA的目的是為了消除單點(diǎn)故障(SPOF), 對(duì)hadoop而言蘸劈,HA包含了Hdfs的HA和Yarn的HA。配置HA后弦叶,集群中Hdfs的NameNode或Yarn的ResourceManager在宕或升級(jí)維護(hù)等場(chǎng)景下可快速進(jìn)行機(jī)器切換俊犯,保證集群可用。
二伤哺、 Hdfs的HA機(jī)制
1.1 Hdfs HA方案
為了解決Hdfs的SPOF問(wèn)題燕侠,Hadoop提供Hdfs的HA方案是:提供兩個(gè)NameNode,一個(gè)處于active狀態(tài)立莉,對(duì)位提供服務(wù)處理客戶端的讀寫(xiě)請(qǐng)求绢彤;另一個(gè)處于standby狀態(tài),不對(duì)外提供服務(wù)蜓耻,僅僅同步active的NameNode的狀態(tài)茫舶,以在其故障時(shí)快速進(jìn)行快速轉(zhuǎn)移。
基于QJM(Quorum Journal Node)的Hdfs HA方案:
集群?jiǎn)?dòng)后刹淌,standby NameNode和active NameNode同時(shí)與JournalNodes(JNS)進(jìn)程保持通信饶氏。其中,active NameNode提供服務(wù)有勾,處理客戶端和DateNode的請(qǐng)求疹启。active節(jié)點(diǎn)在namespace更新時(shí)將editlog寫(xiě)到本地和JNS(作為shared editlog)。而standby NameNode周期性的從JNS中獲取editlog并應(yīng)用到本地namespace蔼卡,在failover發(fā)生時(shí)喊崖,standby節(jié)點(diǎn)會(huì)在轉(zhuǎn)變?yōu)閍ctive之前從JNS中讀取并處理所有editlog,以此保持與active NameNode的狀態(tài)完全同步雇逞。
另一方面贷祈,為了failover后standy節(jié)點(diǎn)快速提供服務(wù),所有的DateNode節(jié)點(diǎn)同時(shí)向主備兩個(gè)NameNode報(bào)告block信息喝峦。
在任意時(shí)刻势誊,為了防止“split-brain”(腦裂),集群中保持只有一個(gè)active NameNode谣蠢,否則集群中兩個(gè)NameNode會(huì)產(chǎn)生不同的狀態(tài)數(shù)據(jù)導(dǎo)致數(shù)據(jù)丟失或異常粟耻。這里通過(guò)fencing實(shí)現(xiàn),具體表現(xiàn)為:1)每個(gè)時(shí)刻只能有一個(gè)NameNode能夠?qū)慗NS; 2)每個(gè)時(shí)刻只有一個(gè)NameNode能夠向DateNode發(fā)送更新命令眉踱。3)每個(gè)時(shí)刻只有一個(gè)NameNode響應(yīng)客戶端請(qǐng)求
為了實(shí)現(xiàn)HA的自動(dòng)failover挤忙,每個(gè)NameNode節(jié)點(diǎn)都開(kāi)啟一個(gè)FailoverController進(jìn)程,F(xiàn)ailoverController與zookeeper集群通信谈喳。FailoverController與zookeeper集群通信通過(guò)zookeeper選舉機(jī)制選出active節(jié)點(diǎn)册烈,并通過(guò)RPC發(fā)動(dòng)命令讓本機(jī)的NameNode轉(zhuǎn)換為active或standby狀態(tài)。
1.2 Hdfs HA的自動(dòng)故障轉(zhuǎn)移
上一節(jié)HA方案中的FailoverController(ZKFC)和zookeeper是為了實(shí)現(xiàn)HA的自動(dòng)failover(如果沒(méi)有需要手動(dòng)failover)婿禽∩蜕看下ZKFC的架構(gòu)設(shè)計(jì):
ZKFC和NameNode部署在同一臺(tái)宿主機(jī)器上(兩者在不同的jvm進(jìn)程)大猛,HealthMonitor、ActiveStandbyElector與ZKFailoverController處于同一個(gè)jvm進(jìn)程(zkfc)
ZKFC主要的三個(gè)組件:
HealthMonitor
定期檢查本地NameNode的狀態(tài)淀零,狀態(tài)變化時(shí)回調(diào)ZKFailoverController作相應(yīng)處理挽绩。ActiveStandbyElector
管理NameNode在zookeeper上的狀態(tài),zookeeper上對(duì)應(yīng)znode節(jié)點(diǎn)變化時(shí)回調(diào)ZKFailoverController作相應(yīng)處理驾中。ZKFailoverController
向HealthMonitor和ActiveStandbyElector注冊(cè)回調(diào)方法唉堪,接收并處理兩者的事件。
ZKFC實(shí)現(xiàn)的功能:
-
健康監(jiān)控(Health monitoring)
通過(guò)HealthMonitor定期監(jiān)控本地NameNode是否存活和健康肩民。
-
zk session管理(ZooKeeper Session Management)
當(dāng)本地NameNode是健康的時(shí)候唠亚,zkfc在zookeeper中持有一個(gè)session。如果本地NameNode正好是active節(jié)點(diǎn)持痰,zkfc還會(huì)在zookeeper中持有“ephemeral”的znode作為鎖灶搜,如果本地NameNode失效,ephemeral的znode會(huì)自動(dòng)刪除共啃。
-
基于zk選主(ZooKeeper-based election )
對(duì)active節(jié)點(diǎn),如果HealthMonitor健康到本地NameNode處于非健康狀態(tài)暂题,則先通過(guò)fence功能關(guān)閉它(關(guān)閉或不能提供服務(wù))移剪,再?gòu)膠ookeeper中刪除對(duì)應(yīng)的znode節(jié)點(diǎn);
-
對(duì)standby節(jié)點(diǎn)薪者,如果本地NameNode是健康的纵苛,zkfc發(fā)現(xiàn)沒(méi)有其它節(jié)點(diǎn)持有ephemeral獨(dú)占鎖(ActiveStandbyElector會(huì)監(jiān)控到該事件), 則嘗試去獲取獨(dú)占鎖,如果獲得該鎖則進(jìn)行failover:
1)如果需要言津,則先對(duì)之前active的NameNode進(jìn)行fence(可通過(guò)遠(yuǎn)程ssh強(qiáng)制殺死進(jìn)程)攻人;
2)將本地NameNode轉(zhuǎn)換為active狀態(tài)。
二悬槽、 Yarn的HA機(jī)制
2.1 Yarn HA方案
ResourceManager(RM)負(fù)責(zé)Yarn集群資源的跟蹤及應(yīng)用調(diào)度怀吻。Yarn的HA方案:通過(guò)active/standby架構(gòu),提供多個(gè)ResourceManager初婆,同一時(shí)刻只有一個(gè)RM處于active狀態(tài)蓬坡,其它一個(gè)或多個(gè)RM處于standby狀態(tài),以此在RM故障時(shí)快速轉(zhuǎn)移(支持手動(dòng)或自動(dòng)的方式)磅叛。
ResourceManager(RM)
啟動(dòng)后嘗試向zookeeper的/hadoop-ha節(jié)點(diǎn)寫(xiě)一個(gè)lock文件屑咳,獲取lock成功則成為active節(jié)點(diǎn),否則為standby節(jié)點(diǎn)弊琴。standby節(jié)點(diǎn)循環(huán)監(jiān)控lock是否存在兆龙,如果不存在嘗試獲取,爭(zhēng)取成為active節(jié)點(diǎn)敲董。RM負(fù)責(zé):接收client端任務(wù)請(qǐng)求紫皇,接收NodeManager節(jié)點(diǎn)的資源匯報(bào)慰安,分配和調(diào)度NM的資源,啟動(dòng)和監(jiān)控ApplicationMaster(AM)NodeManager(NM)
NM負(fù)責(zé)節(jié)點(diǎn)資源管理坝橡,啟動(dòng)container容器并運(yùn)行task泻帮,上報(bào)資源和container運(yùn)行狀態(tài)給RM,task處理狀態(tài)上報(bào)給ApplicationMaster(AM)
- RMstatestore
RM提供了多種RMstatestore的實(shí)現(xiàn)(可通過(guò)yarn.resourcemanager.store.class配置)计寇,如:MemoryRMStateStore锣杂、FileSystemRMStateStore、ZKRMStateStore番宁,后兩種實(shí)現(xiàn)是持久化的實(shí)現(xiàn)元莫,其中,ZKRMStateStore在任意時(shí)間只允許單個(gè)RM的寫(xiě)入請(qǐng)求蝶押,防止腦裂踱蠢,因此建議在HA方案中使用RMstatestore。
2.2 Yarn HA自動(dòng)故障轉(zhuǎn)移
ResourceManager中基于zookeeper的ActiveStandbyElector來(lái)選舉哪個(gè)RM作為active RM棋电。active RM關(guān)閉或故障時(shí)自動(dòng)選舉standby狀態(tài)的RM作為新的active RM接管active RM的工作茎截。
與HDFS的HA不同的是,YARN的HA方案不需要單獨(dú)的ZKFC deamon程序赶盔, 基于zk的ActiveStandbyElector作為RM內(nèi)部組件進(jìn)行故障檢測(cè)和active選舉, zkfc僅僅作為RM的一個(gè)線程存在企锌。
三、HA集群搭建
HA集群搭建于未,可參考另一篇博客:http://www.reibang.com/p/e3b0afee4390