1、背景
在Hadoop 2.0.0之前,NameNode是HDFS集羣中的單點故障(SPOF)。每個羣集都有一個NameNode,如果該機器或進程變得不可用,整個羣集將無法使用,直到NameNode重新啓動或在單獨的計算機上啓動。
這在兩個主要方面影響了HDFS集羣的總體可用性:
-
對於計劃外事件(例如計算機崩潰),在操作員重新啓動NameNode之前,羣集將不可用。
-
計劃維護事件(如NameNode計算機上的軟件或硬件升級)將導致羣集停機時間窗口。
2、原因
普通的完全分佈式集羣只有一個主節點,它的namenode存在單節點故障,如果namenode一旦出現故障,整個集羣將處於癱瘓狀態。爲了解決這個問題便出現了HA集羣,HA又稱爲hdfs的高可用性。
高可用性的簡介:
a.只有兩臺獨立的計算機配置爲NameNode,其中一個NameNode處於活動狀態(active),另外一個Namenode只是充當從屬服務器(Standby)
b.在集羣中配置一組"journalnode",記錄活躍Namenode的編輯信息,同時傳給備份Namenode,並防止"腦裂情景"的發生(JournalNodes只允許一個NameNode一次成爲一個writer)
c.datanode要向兩個Namenode進行心態反饋
3、硬件需求
---->一個主節點master
----->三個及三個以上的從節點slave1、slave2、slave3
4、配置文件(注:我的主節點是master,要在salve1上配置namenode)
(1)在< hdfs-site.xml> 中
a.配置名稱服務的暱稱(也就是另外一個namenode的名稱)
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
b.爲名稱服務配置相應的ID唯一標識符:用逗號分開,注意:目前,每個名稱服務最多隻能配置兩個NameNode。
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
c.爲名稱服務的唯一標識符,配置獨立完整的rpc地址
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
d.配置webui的訪問地址
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
f.指定journalnode守護進程所在的機器,及其指定目錄(即重用名稱服務的值)
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;slave2:8485;slave3:8485/mycluster</value>
</property>
g.配置client用於聯繫ActiveNamenode的java類型
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
h.配置防護方式:sshfence,讓journalnode守護進程防止腦裂的產生,還必須配置無密碼登陸
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hyxy/.ssh/id_rsa</value>
</property>
(2)在<core-site.xml>中
a.配置默認的namenode的請求路徑
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
b.配置journalnode所產生的目錄的具體路徑(說明:mycluster目錄的位置)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hyxy/apps/hadoop/tmp</value>
</property>
5、配置具體步驟
a.配置文件完成後,首先啓動相應節點上的journalnode守護進程(因爲我要在slave1上配置namenode,所以我要在另外三個節點上先啓動journalnode)
命令如下:
hadoop-daemon.sh start journalnode
b.同步元數據
此時會有兩種情況:
情況1、如果是新搭建的集羣,選擇其中一個namonde所在的機器進行格式化。
]$ hdfs namenode -format
情況2、將已經格式化的namenode的元數據同步到另外一個未格式化的namenode上,目的就是在另一個未格式化的機器上
生成${hadoop.tmp.dir}/dfs/name,存儲最新的鏡像文件:步驟如下-->
--1.開啓格式化好的namenode(也就是開啓master的namenode)
hadoop-daemon.sh start namenode
--2.在未格式化的namenode上,運行如下命令,同步元數據(也就是在你的slave1上開啓)
hdfs namenode -bootstrapStandby
c.將本地的元數據初始化到journalnode裏(在master中)
--1.關閉namenode
hahadoop-daemon.sh stop namenode
--2.初始化,注意,journalnode必須是開啓的(n-1/2)
hdfs namenode -initializeSharedEdits
d.開啓HA集羣
start-dfs.sh
註釋:此時在master和slave1中都顯示是standby
e.把一個namenode變成活躍節點(此時把master變成活躍節點)
hdfs haadmin -transitionToActive nn1
6、測試
a.查看兩個namenode的50070的狀態信息
c. 上傳文件/創建目錄到HA