Hadoop系列-HDFS HA高可用叢集
前言:
在HDFS叢集的時候我們知道,NameNode只有一個,如果現在NameNode掛掉了,或者NameNode需要硬體或者軟體的升級,那麼勢必就有單點問題。那麼HDFS HA就是來解決這個問題的。
HA架構圖:
叢集需要考慮的問題:
1 我們要考慮兩個NM之間的元資料是共享或者同步的
NM啟動的時候,會去讀取fsimage和 edits檔案,那麼備份NM也需要讀取這兩個檔案
而且隨著ActiveNM會記錄元資料的變化,那麼StandbyNM也需要隨時同步元資料的變化
2 必須保證日誌檔案的安全
方案討論:
解決方案【一】
在以前我們可能找一些質量比較好的機器,儲存相關的資料或者檔案
然後ActiveNM 負責寫,然後StandbyNM負責讀,也能實現同步,但是成本太高
解決方案【二】
Cloudera公司提出分散式儲存日誌檔案,日誌備份數目(2n+1)
解決方案【三】
使用Zookeeper+Journalnode
另外我們不在需要SecondaryNM,因為啟用SecondaryNM的目的是合併NameNode的fsimage和 edits檔案,以便節省下一次NM啟動的時候減少啟動時間
現在有了StandbyNM 它和ActiveNM是實時同步的,所以就不需要SecondaryNM
一 搭建HA叢集
搭建HadoopHA叢集,可能有很多種方法,我們這裡採用官方文件所提供的使用QJM (QuorumJournal Manager)仲裁日誌管理的方式。
1.1 首先檢查hadoop-env.shmapred-env.sh,yarn-env.sh的JAVA_HOME路徑是否設定好
1.2 修改core-site.xml檔案
1.3 修改hdfs-site.xml
首先因為不需要SecondaryNM,所以相關的配置需要去掉。
1.4 配置yarn-site.xml
1.5 配置mapred-site.xml
1.6 分發配置到各個節點
建立目錄:
/opt/app/hadoop-2.5.0/data/tmp/dfs/journal
mkdir -p /opt/app/hadoop-2.5.0/data/tmp/dfs/journal
scp -r hadoop-2.5.0/
scp -r hadoop-2.5.0/ [email protected]:/opt/app
1.7 啟動各個節點的Journal Node
/opt/app/hadoop-2.5.0/sbin/hadoop-daemon.sh start journalnode
如果啟動成功應該有一個JournalNodejava程序
1.8 然後格式化Active NameNode,並啟動NameNode
我們規劃hadoop-cluster-01為ActiveNameNode;然後http://hadoop-cluster-02為StandbyNameNode
/opt/app/hadoop-2.5.0/bin/hdfsnamenode -format
另外一臺機器不需要格式化,因為他們管理的是同一份元資料。如果元資料都不相同,那麼主備也就沒什麼意思呢。
啟動ActiveNameNode:
/opt/app/hadoop-2.5.0/sbin/hadoop-daemon.sh start namenode
1.9 在Standby NameNode同步元資料,並啟動StandbyNM
/opt/app/hadoop-2.5.0/bin/hdfs namenode -bootstrapStandby
啟動StandbyNameNode:
/opt/app/hadoop-2.5.0/sbin/hadoop-daemon.sh start namenode
1.10 然後啟動2臺namenode和 各個節點的datanode
這時候當我們訪問:
都還是standby狀態,因為這時候都是待機狀態,所以需要我們指定ActiveNameNode切換Active狀態
/opt/app/hadoop-2.5.0/bin/hdfs haadmin -transitionToActive
namenode100
這時候ActiveNameNode 狀態就是Active了,如圖示:
1.11 啟動各個節點DN,看Active是否工作正常
./hdfs dfs -mkdir -p /var/hadoop/input
./hdfs dfs -put /opt/shell/hadoop.sh /var/hadoop/input
./hdfs dfs -cat /var/hadoop/input/hadoop.sh
1.12 然後測試兩個NameNode是否是共享的
先殺掉ActiveNameNode程序
kill -9 10223
然後把Standby狀態強制轉換成Active
/opt/app/hadoop-2.5.0/bin/hdfs haadmin -transitionToActive
namenode101--forceactive
./hdfs dfs -cat /var/hadoop/input/hadoop.sh
二 自動故障轉移
根據之前的配置,我們知道,如果ActiveNM掛了,那麼Standby是需要我們手動切換才能轉移狀態,然後才對外提供服務的。
那如果是半夜宕機了,我們怎麼辦呢,所以我們需要一種自動故障轉移的需求。
這時候需要使用到2個新的元件:
ZooKeeperquorum 和 ZKFailoverControllerprocess.
ZKFC是一個新的元件,它是一個ZooKeeper客戶端,能夠監視和管理NameNode的狀態。每一臺NameNode節點 都會執行一個ZKFC.負責:
HealthMonitoring: 健康監視,ZKFC會定期的用一個健康檢查命令去ping本地的NameNode,只要NameNode即使做出響應,就被認為事實健康的。如果NameNode掛掉,假死或者其他原因造成不健康的狀態,健康監視器它會標記為不健康狀態
ZooKeepersession management: Zookeeper 會話管理。當本地NameNode是健康的,ZKFC在Zookeeper會持有一個session,如果ActiveNameNode是健康的,他會持有一個鎖 znode,如果session到期,這個lockznode將會自動釋放
ZooKeeper-basedelection:基於ZooKeeper的選舉。如果本地NameNode是健康的,他會去檢視是不是沒有其他node在持有鎖,他自己會去詢問這個鎖,如果成功,他將贏得選舉。
2.1 配置core-site.xml
我們需要在core-site追加如下配置:
<!--指定執行zookeeper的節點資訊,多個用逗號分割-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-cluster-01:2181,hadoop-cluster-02:2181,hadoop-cluster-03:2181
</value>
</property>
2.2 配置hdfs-site.xml
我們需要在hdfs-site.xml追加以下的配置:
<!--安裝automiaticfailover-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
2.3 初始化在ZooKeeper的狀態
初始化會在Zookeeper生成一個hadoop-ha的znode.
/opt/app/hadoop-2.5.0/bin/hdfs zkfc -formatZK
只需要一臺機器初始化就行。
在zookeeper檢視是否建立叢集成功
/opt/app/zookeeper-3.4.6/bin/zkCli.sh
然後ls / 如果成功會看到/hadoop-ha節點
2.4停止所有hdfs程序然後重啟
/opt/app/hadoop-2.5.0/sbin/stop-dfs.sh
/opt/app/hadoop-2.5.0/sbin/start-dfs.sh
這時候你會發現每一個namenode都起了一個這樣的程序:
DFSZKFailoverController
如果你沒發現有這樣的程序啟動,你也是可以手動啟動的:
/opt/app/hadoop-2.5.0/sbin/hadoop-daemon.sh start zkfc
2.5 測試自動故障轉移
殺掉ActiveNameNode 程序
kill-9 11708
現在檢視StandbyNameNode: