Haddop:HA高可用

一、HA概述

HAHigh Available)即高可用(7*24小時不中斷服務),實現高可用最關鍵的策略就是消除單點故障。HA嚴格地來說應該分成各個組件的HA機制,HDFSHAYARNHA

Hadoop2.0之前,在HDFS集羣中NameNode存在單點故障(SPOF)。NameNode主要在以下兩個方面影響HDFS集羣:

  1. NameNode機器發生意外,如宕機,集羣將無法使用,直到管理員重啓
  2. NameNode機器需要升級,包括軟件、硬件升級,此時集羣也將無法使用

HDFS HA功能通過配置Active/Standby兩個NameNodes實現在集羣中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一臺機器。

二、HDFS-HA工作機制

通過雙NameNode消除單點故障

2.1 HDFS-HA工作要點

  1. 元數據管理方式需要改變
    內存中各自保存一份元數據,Edit日誌只有Active狀態的NameNode節點纔可以做寫操作,兩個NameNode都可以讀取Edits。共享的Edits放在一個共享存儲中管理(qjournalNFS兩個主流實現)
  2. 需要一個狀態管理功能模塊
    實現了一個zkfailover常駐在每一個NameNode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,利用ZooKeeper進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split現象的發生。
  3. 必須保證兩個NameNode之間能夠ssh無密碼登錄
  4. 隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務

2.2 HDFS-HA自動故障轉移工作機制

使用命令hdfs haadmin failover手動進行故障轉移,在該模式下,即使現役NameNode已經失效,系統也不會自動從現役NameNode轉移到待機NameNode,下面學習如何配置部署HA自動進行故障轉移。

自動故障轉移爲HDFS部署增加了兩個新組件:ZooKeeperZKFailoverControllerZKFC)進程。

如圖所示:ZooKeeper是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的以下功能:

①故障檢測 :集羣中的每個NameNodeZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個DataNode需要觸發故障轉移。

②現役NameNode選擇ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點爲active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該稱爲現役NameNode

ZKFC是自動故障轉移的另一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個運行NameNode的主機也運行一個ZKFC進程,ZKFC負責:

①健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認爲該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點爲非健康的。

②ZooKeeper會話管理: 當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支持,如果會話終止,鎖節點將自動刪除。

③基於ZooKeeper的選擇: 如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將爲自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地NameNodeActive。故障轉移進程與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然後本地NameNode轉換爲Active狀態。
在這裏插入圖片描述

三、HDFS-HA集羣配置

3.1 環境基礎

ZooKeeper集羣和完全分佈運行模式Hadoop集羣的搭建。

3.2 集羣規劃

JournalNode:兩個NameNode爲了數據同步,會通過一組稱作JournalNodes的獨立進程進行相互通信。

hadoop100 hadoop101 hadoop1042
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZooKeeper ZK ZK
ResourceManager ResourceManager SecondaryNameNode
NodeManager NodeManager NodeManager

3.3 配置HDFS-HA集羣

①拷貝之前的Hadoop文件到HA文件夾

[root@hadoop100 hadoop-2.7.2]# cp -r hadoop-2.7.2/ /opt/module/HA/

②配置core-site.xml

<!-- 指定HDFS中NameNode的地址 -->
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://mycluster</value>
</property>

<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>
</property>

③配置hdfs-site.xml

<!-- 完全分佈式集羣名稱 -->
<property>
	<name>dfs.nameservices</name>
	<value>mycluster</value>
</property>

<!--指定NameNode節點的名稱-->
<property>
	<name>dfs.ha.namenodes.mycluster</name>
	<value>nn1,nn2</value>
</property>

<!-- nn1的RPC通信地址 -->
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn1</name>
	<value>hadoop100:9000</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn2</name>
	<value>hadoop101:9000</value>
</property>

<!-- nn1的http通信地址 -->
<property>
	<name>dfs.namenode.http-address.mycluster.nn1</name>
	<value>hadoop100:50070</value>
</property>

<!-- nn2的http通信地址 -->
<property>
	<name>dfs.namenode.http-address.mycluster.nn2</name>
	<value>hadoop101:50070</value>
</property>


<!-- 指定NameNode元數據在JournalNode上的存放位置 -->
<property>
	<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/mycluster</value>
</property>


<!-- 配置隔離機制,即同一時刻只能有一臺服務器對外響應 -->
<property>
	<name>dfs.ha.fencing.methods</name>
	<value>sshfence</value>
</property>

<!-- 使用隔離機制時需要ssh無祕鑰登錄-->
<property>
	<name>dfs.ha.fencing.ssh.private-key-files</name>
	<value>/root/.ssh/id_rsa</value>
</property>

<!-- 聲明journalnode服務器存儲目錄-->
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/opt/module/HA/hadoop-2.7.2/data/jn</value>
</property>

<!-- 關閉權限檢查-->
<property>
	<name>dfs.permissions.enable</name>
	<value>false</value>
</property>


<!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
<property>
 		<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

④分發HA

[root@hadoop100 HA]# xsync ./HA/

3.4 啓動HDFS-HA集羣

①在各個節點上啓動JournalNode服務

[root@hadoop100 hadoop-2.7.2]# sbin/hadoop-daemon.sh start journalnode

②在nn1上,對其進行格式化並啓動

[root@hadoop100 hadoop-2.7.2]# bin/hdfs namenode -format
[root@hadoop100 hadoop-2.7.2]# sbin/hadoop-daemon.sh start namenode

③在nn2上,同步nn1的元數據信息

[root@hadoop101 hadoop-2.7.2]# bin/hdfs namenode -bootstrapStandby

④啓動nn2

[root@hadoop101 hadoop-2.7.2]# sbin/hadoop-daemon.sh start namenod

⑤將nn1切換爲Active

[root@hadoop100 hadoop-2.7.2]# bin/hdfs haadmin -transitionToActive nn1

⑥查看是否Active

[root@hadoop100 hadoop-2.7.2]# bin/hdfs haadmin -getServiceState nn1

在這裏插入圖片描述
在這裏插入圖片描述

3.5 配置HDFS-HA自動故障轉移

①具體配置
hdfs-site.xml

<!--配置HDFS-HA自動故障轉移-->
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>

core-site.xml

<property>
	<name>ha.zookeeper.quorum</name>
	<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>

②關閉所有HDFS服務

[root@hadoop100 hadoop-2.7.2]# sbin/stop-dfs.sh

③啓動ZooKeeper集羣

[root@hadoop100 hadoop-2.7.2]# bin/zkServer.sh start
[root@hadoop100 hadoop-2.7.2]# cat zkServer.sh
#!/bin/bash

if (($#==0))
then
    exit 1;
fi
for i in hadoop100 hadoop101 hadoop102
do
    echo Starting zk in $i
    ssh $i "source /etc/profile && /opt/module/zookeeper-3.4.10/bin/zkServer.sh $1" > /dev/null
done

④初始化HAZookeeper中狀態

[root@hadoop100 hadoop-2.7.2]# bin/hdfs zkfc -formatZK

⑤啓動HDFS服務

[root@hadoop100 hadoop-2.7.2]# sbin/start-dfs.sh

⑥驗證:殺死NameNode進程

[root@hadoop100 hadoop-2.7.2]# kill -9 2883

殺死nn1後,此時NamaNode已經切換爲nn2
在這裏插入圖片描述

3.6 故障轉移失敗

通過查看zkfc的日誌,可以發現沒有fuser命令,安裝fuser命令後重啓HDFS後即能完成故障轉移
在這裏插入圖片描述

四、YARN-HA配置

4.1YARN-HA工作機制

在這裏插入圖片描述

4.2配置YARN-HA集羣

規劃集羣

hadoop100 hadoop101 hadoop1042
NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZooKeeper ZK ZK
ResourceManager ResourceManager SecondaryNameNode
NodeManager NodeManager NodeManager

具體配置:

①配置【yarn-site.xml

<!-- Reducer獲取數據的方式 -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

<!--啓用resourcemanager ha-->
<property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
</property>

<!--聲明兩臺resourcemanager的地址-->
<property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>cluster-yarn1</value>
</property>

<property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
</property>

<property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hadoop100</value>
</property>

<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hadoop101</value>
</property>

<!--指定zookeeper集羣的地址--> 
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>hadoop100:2181,hadoop101:2181,hadoop102:2181</value>
</property>

<!--啓用自動恢復--> 
<property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
</property>

 <!--指定resourcemanager的狀態信息存儲在zookeeper集羣--> 
<property>
    <name>yarn.resourcemanager.store.class</name>    
	<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>	

②同步更新其他節點的配置信息

③啓動YARN

[root@hadoop100 hadoop-2.7.2]# sbin/start-yarn.sh
[root@hadoop101 hadoop-2.7.2]# sbin/yarn-daemon.sh start resourcemanager
[root@hadoop101 hadoop-2.7.2]# bin/yarn rmadmin -getServiceState rm1
active
[root@hadoop101 hadoop-2.7.2]# bin/yarn rmadmin -getServiceState rm2
standby
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章