Hadoop中NameNode單點(diǎn)故障解決方案
Hadoop 1.0內(nèi)核主要由兩個(gè)分支組成:MapReduce和HDFS,這兩個(gè)系統(tǒng)的設(shè)計(jì)缺陷是單點(diǎn)故障,即MR的JobTracker和HDFS的NameNode兩個(gè)核心服務(wù)均存在單點(diǎn)問(wèn)題,這里只討論HDFS的NameNode單點(diǎn)故障的解決方案踢匣。
[問(wèn)題]
HDFS仿照google GFS實(shí)現(xiàn)的分布式存儲(chǔ)系統(tǒng)痒蓬,由NameNode和DataNode兩種服務(wù)組成忱详,其中NameNode是存儲(chǔ)了元數(shù)據(jù)信息(fsimage)和操作日志(edits)涩笤,由于它是唯一的贸桶,其可用性直接決定了整個(gè)存儲(chǔ)系統(tǒng)的可用性匣吊。因?yàn)榭蛻舳藢?duì)HDFS的讀儒拂、寫操作之前都要訪問(wèn)name node服務(wù)器寸潦,客戶端只有從name node獲取元數(shù)據(jù)之后才能繼續(xù)進(jìn)行讀、寫社痛。一旦NameNode出現(xiàn)故障见转,將影響整個(gè)存儲(chǔ)系統(tǒng)的使用。
[解決方案]
Hadoop官方提供了一種quorum journal manager來(lái)實(shí)現(xiàn)高可用褥影,在高可用配置下池户,edit log不再存放在名稱節(jié)點(diǎn),而是存放在一個(gè)共享存儲(chǔ)的地方凡怎,這個(gè)共享存儲(chǔ)由若干Journal Node組成校焦,一般是3個(gè)節(jié)點(diǎn)(JN小集群), 每個(gè)JN專門用于存放來(lái)自NN的編輯日志统倒,編輯日志由活躍狀態(tài)的名稱節(jié)點(diǎn)寫入寨典。
要有2個(gè)NN節(jié)點(diǎn),二者之中只能有一個(gè)處于活躍狀態(tài)(active)房匆,另一個(gè)是待命狀態(tài)(standby)耸成,只有active節(jié)點(diǎn)才能對(duì)外提供讀寫HDFS服務(wù),也只有active態(tài)的NN才能向JN寫入編輯日志浴鸿;standby的名稱節(jié)點(diǎn)只負(fù)責(zé)從JN小集群中的JN節(jié)點(diǎn)拷貝數(shù)據(jù)到本地存放井氢。另外,各個(gè)DATA NODE也要同時(shí)向兩個(gè)NameNode節(jié)點(diǎn)報(bào)告狀態(tài)(心跳信息岳链、塊信息)花竞。
一主一從的2個(gè)NameNode節(jié)點(diǎn)同時(shí)和3個(gè)JN構(gòu)成的組保持通信,活躍的NameNode節(jié)點(diǎn)負(fù)責(zé)往JN集群寫入編輯日志掸哑,待命的NN節(jié)點(diǎn)負(fù)責(zé)觀察JN組中的編輯日志,并且把日志拉取到待命節(jié)點(diǎn)(接管Secondary NameNode的工作)约急。再加上兩節(jié)點(diǎn)各自的fsimage鏡像文件,這樣一來(lái)就能確保兩個(gè)NN的元數(shù)據(jù)保持同步苗分。一旦active不可用厌蔽,standby繼續(xù)對(duì)外提供服。架構(gòu)分為手動(dòng)模式和自動(dòng)模式摔癣,其中手動(dòng)模式是指由管理員通過(guò)命令進(jìn)行主備切換奴饮,這通常在服務(wù)升級(jí)時(shí)有用,自動(dòng)模式可降低運(yùn)維成本择浊,但存在潛在危險(xiǎn)拐云。這兩種模式下的架構(gòu)如下。
[手動(dòng)模式]
模擬流程:
1. 準(zhǔn)備3臺(tái)服務(wù)器分別用于運(yùn)行JournalNode進(jìn)程(也可以運(yùn)行在date node服務(wù)器上)近她,準(zhǔn)備2臺(tái)namenode服務(wù)器用于運(yùn)行NameNode進(jìn)程(兩臺(tái)配置 要一樣)叉瘩,DataNode節(jié)點(diǎn)數(shù)量不限。
2. 分別啟動(dòng)3臺(tái)JN服務(wù)器上的JournalNode進(jìn)程粘捎,分別在date node服務(wù)器啟動(dòng)DataNode進(jìn)程薇缅。
3. 需要同步2臺(tái)name node之間的元數(shù)據(jù)危彩。具體做法:從第一臺(tái)NN拷貝元數(shù)據(jù)到放到另一臺(tái)NN,然后啟動(dòng)第一臺(tái)的NameNode進(jìn)程,再到另一臺(tái)名稱節(jié)點(diǎn)上做standby引導(dǎo)泳桦。
4. 把第一臺(tái)名節(jié)點(diǎn)的edit日志初始化到JN節(jié)點(diǎn)汤徽,以供standby節(jié)點(diǎn)到JN節(jié)點(diǎn)拉取數(shù)據(jù)。
5. 啟動(dòng)standby狀態(tài)的NameNode節(jié)點(diǎn)灸撰,這樣就能同步fsimage文件谒府。
6. 模擬故障,手動(dòng)把a(bǔ)ctive狀態(tài)的NN故障浮毯,轉(zhuǎn)移到另一臺(tái)NameNode完疫。
[自動(dòng)模式]
模擬流程:
在手動(dòng)模式下引入了ZKFC(DFSZKFailoverController)和zookeeper集群
ZKFC主要負(fù)責(zé): 健康監(jiān)控、session管理债蓝、leader選舉
zookeeper集群主要負(fù)責(zé):服務(wù)同步
1-6步同手動(dòng)模式
7. 準(zhǔn)備3臺(tái)主機(jī)安裝zookeeper壳鹤,3臺(tái)主機(jī)形成一個(gè)小的zookeeper集群.
8. 啟動(dòng)ZK集群每個(gè)節(jié)點(diǎn)上的QuorumPeerMain進(jìn)程
9. 登錄其中一臺(tái)NN, 在ZK中初始化HA狀態(tài)
10. 模擬故障:停掉活躍的NameNode進(jìn)程,提前配置的zookeeper會(huì)把standby節(jié)點(diǎn)自動(dòng)變?yōu)閍ctive,繼續(xù)提供服務(wù)饰迹。
腦裂
腦裂是指在主備切換時(shí)芳誓,由于切換不徹底或其他原因,導(dǎo)致客戶端和Slave誤以為出現(xiàn)兩個(gè)active master啊鸭,最終使得整個(gè)集群處于混亂狀態(tài)锹淌。解決腦裂問(wèn)題,通常采用隔離(Fencing)機(jī)制赠制。
共享存儲(chǔ)fencing:確保只有一個(gè)Master往共享存儲(chǔ)中寫數(shù)據(jù)葛圃,使用QJM實(shí)現(xiàn)fencing。
Qurom Journal Manager憎妙,基于Paxos(基于消息傳遞的一致性算法),Paxos算法是解決分布式環(huán)境中如何就某個(gè)值達(dá)成一致曲楚。
[原理]
a. 初始化后厘唾,Active把editlog日志寫到JN上,每個(gè)editlog有一個(gè)編號(hào)龙誊,每次寫editlog只要其中大多數(shù)JN返回成功(過(guò)半)即認(rèn)定寫成功抚垃。
b.? Standby定期從JN讀取一批editlog,并應(yīng)用到內(nèi)存中的FsImage中趟大。
c. NameNode每次寫Editlog都需要傳遞一個(gè)編號(hào)Epoch給JN鹤树,JN會(huì)對(duì)比Epoch,如果比自己保存的Epoch大或相同逊朽,則可以寫罕伯,JN更新自己的Epoch到最新,否則拒絕操作叽讳。在切換時(shí)追他,Standby轉(zhuǎn)換為Active時(shí)坟募,會(huì)把Epoch+1,這樣就防止即使之前的NameNode向JN寫日志邑狸,也會(huì)失敗懈糯。
客戶端fencing:確保只有一個(gè)Master可以響應(yīng)客戶端的請(qǐng)求。
[原理]
在RPC層封裝了一層单雾,通過(guò)FailoverProxyProvider以重試的方式連接NN赚哗。通過(guò)若干次連接一個(gè)NN失敗后嘗試連接新的NN,對(duì)客戶端的影響是重試的時(shí)候增加一定的延遲硅堆∮齑ⅲ客戶端可以設(shè)置重試此時(shí)和時(shí)間
Slave fencing:確保只有一個(gè)Master可以向Slave下發(fā)命令。
[原理]
a. 每個(gè)NN改變狀態(tài)的時(shí)候硬萍,向DN發(fā)送自己的狀態(tài)和一個(gè)序列號(hào)扩所。
b. DN在運(yùn)行過(guò)程中維護(hù)此序列號(hào),當(dāng)failover時(shí)朴乖,新的NN在返回DN心跳時(shí)會(huì)返回自己的active狀態(tài)和一個(gè)更大的序列號(hào)祖屏。DN接收到這個(gè)返回是認(rèn)為該NN為新的active。
b. 如果這時(shí)原來(lái)的active(比如GC)恢復(fù)买羞,返回給DN的心跳信息包含active狀態(tài)和原來(lái)的序列號(hào)袁勺,這時(shí)DN就會(huì)拒絕這個(gè)NN的命令。