前言:

在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/ [email protected]:/opt/app

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: