在早期Hadoop1只有一個(gè)NameNode芯义,還有一個(gè)secondary NameNode晌纫,secondary NameNode 作為冷備份撒强,在NameNode fail的時(shí)候并不能接替NameNode的工作默蚌,即Hadoop 的單點(diǎn)問(wèn)題,因此Hadoop 2提供了NameNode 的HA機(jī)制滞诺。
什么是HA?
即NameNode有兩個(gè),每一個(gè)都有相同的職能环疼。一個(gè)是active狀態(tài)的习霹,一個(gè)是standby狀態(tài)的。當(dāng)集群運(yùn)行時(shí)炫隶,只有active狀態(tài)的NameNode是正常工作的序愚,standby狀態(tài)的NameNode是處于待命狀態(tài)的,時(shí)刻同步active狀態(tài)NameNode的數(shù)據(jù)等限。一旦active狀態(tài)的NameNode不能工作爸吮,通過(guò)手工或者自動(dòng)切換,standby狀態(tài)的NameNode就可以轉(zhuǎn)變?yōu)閍ctive狀態(tài)的望门,就可以繼續(xù)工作了形娇。這就是高可靠。
從上面描述的情況筹误,可以將HA總結(jié)出兩個(gè)功能:
1. 主備NameNode 數(shù)據(jù)同步
2. 主備NameNode 故障切換
如何做到主備NameNode數(shù)據(jù)同步桐早?
為了同步數(shù)據(jù),新HDFS采用了一種共享機(jī)制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)進(jìn)行共享哄酝。NFS是操作系統(tǒng)層面的友存,JournalNode是hadoop層面的,我們這里使用JournalNode集群進(jìn)行數(shù)據(jù)共享(這也是主流的做法)陶衅。如下圖所示屡立,便是JournalNode的架構(gòu)圖。
兩個(gè)NameNode為了數(shù)據(jù)同步搀军,通過(guò)一組稱作JournalNodes的獨(dú)立進(jìn)程進(jìn)行相互通信膨俐。當(dāng)active狀態(tài)的NameNode的命名空間有任何修改時(shí),會(huì)告知大部分的JournalNodes進(jìn)程罩句。standby狀態(tài)的NameNode有能力讀取JNs中的變更信息焚刺,并且一直監(jiān)控edit log的變化,把變化應(yīng)用于自己的命名空間门烂。standby可以確保在集群出錯(cuò)時(shí)乳愉,命名空間狀態(tài)已經(jīng)完全同步了。
在 hdfs-site.xml 添加JournalNodes的配置:
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://nn1ss:8485;nn2ss:8485;nn3ss:8485/hadoopQjournalDir</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/dfs/jn</value>
</property>
如何做到主備NameNode故障切換屯远?
對(duì)于HA集群而言蔓姚,確保同一時(shí)刻只有一個(gè)NameNode處于active狀態(tài)是至關(guān)重要的。否則氓润,兩個(gè)NameNode的數(shù)據(jù)狀態(tài)就會(huì)產(chǎn)生分歧赂乐,可能丟失數(shù)據(jù),或者產(chǎn)生錯(cuò)誤的結(jié)果咖气。為了保證這點(diǎn)挨措,這就需要利用使用ZooKeeper了。首先HDFS集群中的兩個(gè)NameNode都在ZooKeeper中注冊(cè)崩溪,當(dāng)active狀態(tài)的NameNode出故障時(shí)浅役,ZooKeeper能檢測(cè)到這種情況,它就會(huì)自動(dòng)把standby狀態(tài)的NameNode切換為active狀態(tài)伶唯。
** 自動(dòng)切換流程簡(jiǎn)介:**FailoverController ActiveFailoverController Standby 分別作為zk集群在namenode集群的代理代理人感知到namenode集群出現(xiàn)了問(wèn)題后觉既,zk集群會(huì)通過(guò)代理人FailoverController將amenode集群中standby狀態(tài)改為active
自動(dòng)切換ha集群圖如下:
FailoverController服務(wù)是zk的代理 ,內(nèi)嵌在namenode服務(wù)中乳幸,接收zk的監(jiān)督瞪讼,
當(dāng)某個(gè)namenode掛掉后,zk會(huì)通過(guò)shell腳本啟動(dòng)namenode standby節(jié)點(diǎn)變成active節(jié)點(diǎn)粹断。
在core-site.xml 中添加zk:
<property>
<name>ha.zookeeper.quorum</name> ------ 配置zk集群
<value>nn1ss:2181,nn2ss:2181,nn3ss:2181</value>
<description>
A list of ZooKeeper server addresses, separated by commas, that are
to be used by the ZKFailoverController in automatic failover.
</description>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>
Whether automatic failover is enabled. See the HDFS High
Availability documentation for details on automatic HA
configuration.
</description>
</property>
還有最重要的配置符欠,表明主備NameNode的分別為nn1、nn2:
<property>
<name>dfs.ha.namenodes.hadoop</name>
<value>nn1,nn2</value>
<description>
The prefix for a given nameservice, contains a comma-separated
list of namenodes for a given nameservice (eg EXAMPLENAMESERVICE).
</description>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoop.nn1</name>
<value>nn1ss:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoop.nn2</name>
<value>nn2ss:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoop.nn1</name>
<value>nn1ss:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoop.nn2</name>
<value>nn2ss:50070</value>
</property>
參考:
http://chengjianxiaoxue.iteye.com/blog/2174940
http://www.open-open.com/lib/view/open1436855630959.html
https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html