HA背景
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計、網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)巴州,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
對于HDFS、YARN的每個角色都是一個進程,
比如HDFS:NN/SNN/DN? ?老大是NN
YARN:RM/NM? ?老大是RM
對于上面,都會存在單點故障的問題,假如老大NN或者RM掛了,那么就不能提供對外服務(wù)了,會導致整個集群都不能使用。
大數(shù)據(jù)幾乎所有的組建都是主從架構(gòu)(master-slave)。比如hdfs的讀寫請求都是先經(jīng)過NN節(jié)點。(但是hbase的讀寫請求不是經(jīng)過老大的master)。
hdfs:由NN/SNN/DN組成,SNN每小時會做一次checkpoint的操作,如果NN掛了,只能恢復到上次checkpoint的那一刻,不能實時?,F(xiàn)在如果把SNN的角色再提升一個等級,讓它和NN一樣,如果NN掛了,SNN能立即切換過來就好了。
HDFS HA 架構(gòu) 有兩個NN節(jié)點,一個是active活躍狀態(tài),一個是standby準備狀態(tài),Active NameNode對外提供服務(wù),比如處理來自客戶端的RPC請求,而Standby NameNode則不對外提供服務(wù),僅同步Active NameNode的狀態(tài),對Active NameNode進行實時備份,以便能夠在它失敗時快速進行切換。
HA介紹
HDFS High Availability (HA)?
假定:
NN1 active? ? ? ?ip1
NN2 standby? ? ip2
假如說在我們代碼或者shell腳本里,寫了:hdfs dfs -ls hdfs://ip1:9000/? ?,那么如果NN1掛了,NN2切換到active狀態(tài)了,但是在腳本里還是ip1,這個時候不可能手動去修改。肯定有問題。那么該怎么解決?
用命名空間來解決。命名空間不是進程。比如:命名空間的名稱為:ruozeclusterg7
腳本里可以這樣寫:hdfs dfs -ls hdfs://ruozeclusterg7/
當代碼執(zhí)行到這一行時,它會去core-site.xml、hdfs-site.xml里面查找。在這兩個配置文件里面,配置了ruozeclusterg7命名空間下掛了NN1和NN2。當它找到NN1,它會嘗試著連接第一個機器NN1,如果發(fā)現(xiàn)它不是active狀態(tài),它會嘗試著連接第二個機器NN2,如果發(fā)現(xiàn)NN1是active狀態(tài),就直接用了。
?
HA 進程:(假定我們現(xiàn)在有三臺機器)
hadoop001:ZK? ? NN? ZKFC? JN? ? DN
hadoop002:ZK? ? NN? ZKFC? JN? ? DN
hadoop003:ZK? ? ? ? ? ? ? ? ? ? ? ?JN? ? DN
NN節(jié)點有fsimage、editlog(讀和寫請求的記錄)兩個文件,有專門的進程去管理的,這個進程是JN(journalnode)日志節(jié)點,要保證NN1和NN2能實時同步,需要JN這個角色。
如果NN1掛了,需要把NN2從standby狀態(tài)切換到active狀態(tài),那它是怎么切換的呢?需要ZKFC。
ZKFC: 是單獨的進程,它監(jiān)控NN健康狀態(tài),向zk集群定期發(fā)送心跳,使得自己可以被選舉;當自己被zk選舉為active的時候,zkfc進程通過RPC協(xié)議調(diào)用使NN節(jié)點的狀態(tài)變?yōu)閍ctive。對外提供實時服務(wù),是無感知的。
所以在上面,需要在三臺機器上都部署一下zookeeper,作為一個集群,ZK集群,是用于做選舉的。選舉誰來做老大(active),誰做standby。集群中ZK的個數(shù)是2n+1,這樣能投票保證最后有一個勝出。
生產(chǎn)上zookeeper部署的個數(shù)經(jīng)驗:如果集群中有20臺節(jié)點,那么可以在5臺上部署zk。如果總共有七八臺,也部署5臺zk。如果總共有20~100臺節(jié)點,可以部署7臺/9臺/11臺 zk。如果大于100臺,可以部署11臺zk。如果有很多,比如上萬臺那看情況可以多部署幾臺。但是,不是說zk節(jié)點越多越好。因為做投票選舉動作的時候,投票誰做active,誰做standby是需要時間的,時間間隔太長會影響對外服務(wù),對外服務(wù)會很慢,對于即時性 的服務(wù)來說,這是不允許的。
他們的集群有很多臺,比如幾百臺幾千臺,zk部署的機器上就它一個進程,不部署其它進程了。在這里是學習或者機器很少,所以一臺機器上部署多個進程。如果幾百臺節(jié)點,任務(wù)很重,如果部署zk的機器上有其它進程,那么它會消耗很多機器上的資源(無外乎cpu、內(nèi)存、文件數(shù)、進程數(shù)),這都會影響zk響應(yīng)的速度,所以一般都會把它獨立出來。但是如果機器是256G內(nèi)存,但是zk只用到32G,那其他的就浪費了,那么買機器的時候,可以單獨給zk買32G內(nèi)存的機器就可以了。
zk是最底層的,如果zk太繁忙,就可能導致standby狀態(tài)不能切換到active狀態(tài),這個時候機器可能就會夯住。所以當機器夯住,standby不能切換到active的時候,有可能就是zk出問題了。
關(guān)于HA 架構(gòu)的官方文檔https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
Architecture
翻譯:
一個典型的HA集群,NameNode會被配置在2臺或更多 獨立的機器上,在任何時間上,一個NameNode處于活動狀態(tài),而另一個NameNode處于備份狀態(tài),活動狀態(tài)的NameNode會響應(yīng)集群中所有的客戶端,備份狀態(tài)的NameNode只是作為一個副本,保證在必要的時候提供一個快速的轉(zhuǎn)移。
為了讓Standby Node與Active Node保持同步,這兩個Node都與一組稱為JNS的互相獨立的進程保持通信(Journal Nodes)。當Active Node上更新了namespace,它將記錄修改日志發(fā)送給JNS的多數(shù)派。Standby noes將會從JNS中讀取這些edits,并持續(xù)關(guān)注它們對日志的變更。Standby Node將日志變更應(yīng)用在自己的namespace中,當failover發(fā)生時,Standby將會在提升自己為Active之前,確保能夠從JNS中讀取所有的edits,即在failover發(fā)生之前Standy持有的namespace應(yīng)該與Active保持完全同步。
為了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。為了達到這一目的,DataNodes上需要同時配置這兩個Namenode的地址,同時和它們都建立心跳鏈接,并把block位置發(fā)送給它們。
任何時刻,只有一個Active NameNode是非常重要的,否則將會導致集群操作的混亂,那么兩個NameNode將會分別有兩種不同的數(shù)據(jù)狀態(tài),可能會導致數(shù)據(jù)丟失,或者狀態(tài)異常,這種情況通常稱為“split-brain”(腦裂,三節(jié)點通訊阻斷,即集群中不同的Datanodes卻看到了兩個Active NameNodes)。對于JNS而言,任何時候只允許一個NameNode作為writer;在failover期間,原來的Standby Node將會接管Active的所有職能,并負責向JNS寫入日志記錄,這就阻止了其他NameNode基于處于Active狀態(tài)的問題。
首先要部署三臺zk,然后要兩臺NN節(jié)點,然后三臺DN節(jié)點。兩個NN節(jié)點之間的編輯日志需要jn來維護,做共享數(shù)據(jù)存儲。
journalnode(jn): 部署多少合適?取決于HDFS請求量及數(shù)據(jù)量,比如說BT級的數(shù)據(jù)量,或者小文件很多,讀寫請求很頻繁,那么journalnode就部署多一點,如果HDFS很悠閑,那就部署少一點,比如7個、9個這樣,可以大致和zk部署的保持一致(見上面)。具體要看實際情況。(也是2n+1,可以看官網(wǎng)上介紹)
ZKFC:zookeeperfailovercontrol
客戶端或者程序代碼在提交的時候,去namespace找,找NN節(jié)點,如果第一次找的NN節(jié)點就是active,那么就用這個節(jié)點,如果發(fā)現(xiàn)它是standby,就到另外一臺機器。
比如說客戶端現(xiàn)在執(zhí)行put、get、ls、cat命令,這些操作命令的記錄,active NN節(jié)點會寫到自己的edit log日志里面。這些操作記錄,NN自己會寫一份,同時,它會把這些操作記錄,寫給journalnode的node集群。
而另外的,standby NN節(jié)點,會實時的讀journalnode的node集群,讀了之后會把這些記錄應(yīng)用到自己的本身。這個大數(shù)據(jù)的專業(yè)名詞叫做:重演。 相當于standby NN節(jié)點把active NN節(jié)點的active狀態(tài)的操作記錄在自己身上重演一遍。
journalnode:它是一個集群,就是用于active NN節(jié)點和standby NN節(jié)點之間同步數(shù)據(jù)的。它是單獨的進程。
NN和ZKFC在同一臺機器上面。
整個過程描述:當通過client端提交請求的時候,無論讀和寫,我們是通過命名空間RUOZEG6,去找誰是active狀態(tài),找到了就在那臺機器上面,提交請求,然后就是HDFS的讀寫流程,讀和寫的操作記錄,edit log,它自己會寫一份,同時會把讀寫請求的操作記錄,寫一份到j(luò)ournalnode集群日志,進行同步之后,另外一個節(jié)點,standby 節(jié)點會把它拿過來實時的應(yīng)用到自己的本身。專業(yè)的名稱叫重演。同時每個DataNode會向NameNode節(jié)點發(fā)送心跳的塊報告(心跳的間隔時間3600s,就是1小時,參數(shù)是什么(面試))。當active NN節(jié)點掛了,通過zk集群選舉(它存儲了NN節(jié)點的狀態(tài)),通知ZKFC,把standby NN節(jié)點切換到active狀態(tài)。ZKFC會定期的發(fā)送心跳。
ps:
HA是為了解決單點故障問題。
通過journalnode集群共享狀態(tài),也就是共享hdfs讀和寫的操作記錄。
通過ZKFC集群選舉誰是active。
監(jiān)控狀態(tài),自動備援。
DN: 同時向NN1 NN2發(fā)送心跳和塊報告。
ACTIVE NN: 讀寫的操作記錄寫到自己的editlog
? ? ? ? ? ? ? ? ? ? ?同時寫一份到JN集群
? ? ? ? ? ? ? ? ? ? ?接收DN的心跳和塊報告
STANDBY NN: 同時接收JN集群的日志,顯示讀取執(zhí)行l(wèi)og操作(重演),使得自己的元數(shù)據(jù)和active nn節(jié)點保持一致。
? ? ? ? ? ? ? ? ? ? ? ? 接收DN的心跳和塊報告
JounalNode: 用于active nn和 standby nn節(jié)點的數(shù)據(jù)同步, 一般部署2n+1
ZKFC: 單獨的進程
? ? ? ? ? ?監(jiān)控NN監(jiān)控健康狀態(tài)
? ? ? ? ? ?向zk集群定期發(fā)送心跳,使得自己可以被選舉;
? ? ? ? ? ?當自己被zk選舉為active的時候,zkfc進程通過RPC協(xié)議調(diào)用使NN節(jié)點的狀態(tài)變?yōu)閍ctive,只有是
active狀態(tài)才能對外提供服務(wù)。
? ? ? ? ? ?對外提供實時服務(wù),是無感知的,用戶是感覺不到的。
總結(jié)
HDFS HA架構(gòu)圖 以三臺機器 為例
HA使用active NN,standby NN兩個節(jié)點解決單點問題。
兩個NN節(jié)點通過JN集群,共享狀態(tài),
通過ZKFC選舉active,監(jiān)控狀態(tài),自動備援。
DN會同時向兩個NN節(jié)點發(fā)送心跳
active nn:
接收client的rpc請求并處理,同時自己editlog寫一份,也向JN的共享存儲上的editlog寫一份。
也同時接收DN的block report,block location updates 和 heartbeat
standby nn:
同樣會接受到從JN的editlog上讀取并執(zhí)行這些log操作,使自己的NN的元數(shù)據(jù)和activenn的元數(shù)據(jù)是同步的,
使用說standby是active nn的一個熱備。一旦切換為active狀態(tài),就能夠立即馬上對外提供NN角色的服務(wù)。
也同時接收DN的block report,block location updates 和 heartbeat
jn:
用于active nn,standby nn 的同步數(shù)據(jù),本身由一組JN節(jié)點組成的集群,奇數(shù),CDH3臺起步,是支持Paxos協(xié)議。
保證高可用
ZKFC作用:
1.監(jiān)控NameNode狀態(tài),ZKFC會定期向ZK發(fā)送心跳,使自己被選舉,當自己被ZK選舉為主時,我們的ZKFC進程通過rpc調(diào)用,讓nn轉(zhuǎn)換為active狀態(tài)。