Hadoop HA

HA 概述

  • 所謂HA(High Available),即高可用(7*24小時不中斷服務)
  • 實現高可用最關鍵的策略是消除單點故障,HA 嚴格來講應該分紅各個組件的 HA 機制:HDFS 的 HA 和 YARN 的 HA
  • Hadoop2.0 以前,在 HDFS 集羣中 NameNode 存在單點故障(SPOF)
  • NameNode 主要在如下兩個方面影響 HDFS 集羣
    • NameNode 機器發生意外,如宕機,集羣將沒法使用,直到管理員重啓
    • NameNode 機器須要升級,包括軟件、硬件升級,此時集羣也將沒法使用
  • HDFS HA 功能經過配置 Active/Standby 兩個 NameNodes 實如今集羣中對 NameNode 的熱備來解決上述問題,若是出現故障,如機器崩潰或機器須要升級維護,這時可經過此種方式將 NameNode 很快的切換到另一臺機器

    2 HDFS-HA 工做機制

    經過雙 NameNode 消除單點故障node

    2.1 HDFS-HA 工做要點

    元數據的管理方式須要改變:apache

  • 內存中各自保存一份元數據
  • Edits 日誌只有 Active 狀態的 NN 能夠作寫操做
  • 兩個 NN 均可以對 Edits 作讀操做
  • 共享的 Edits 放在一個共享存儲中管理(qjournal)

須要一個狀態管理功能模塊:bootstrap

  • 實現了一個 zkfailover,常駐在每個 NN 所在的節點,每個zkfailover 負責監控本身所在 NN 節點,利用 zk 進行狀態標識,當須要進行狀態切換時,由 zkfailover 來負責切換,切換時須要防止 brain split 現象的發生。

必須保證兩個 NN 之間可以 ssh 無密碼登陸服務器

隔離(Fence),即同一時刻僅僅有一個 NN 對外提供服務網絡

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

Hadoop HA
自動故障轉移爲 HDFS 部署增長了兩個新組件:ssh

  • ZooKeeper:維護少許協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務,HA 的自動故障轉移依賴於 ZooKeeper 的如下功能:
    • 故障檢測:急羣中的每一個 NN 在 ZooKeeper 中維護了一個持久會話,若是宕機,會話也將終止,此時 ZooKeeper 通知另外一個 NN 須要觸發故障轉移
    • 現役 NN 選擇:ZooKeeper 提供了一個簡單的機制用於惟一的選擇一個節點爲active 狀態,若是目前現役 NN 宕機,另外一個節點可能從 ZooKeeper 得到特殊的排外鎖以代表它應該成爲現役 NN
  • ZKFC 是自動故障轉移中的另外一個新組件,是 ZooKeeper 的客戶端,也監視和管理 NN 的狀態,每一個運行 NN 的主機也運行了一個 ZKFC 進程,ZKFC 負責:分佈式

    • 健康監測:ZKFC 使用一個健康檢查命令按期 ping 與其在相同主機的 NN,只要 NN 及時回覆健康狀態,ZKFC 認爲該節點是健康的,若是該節點宕機、凍結或進入不健康狀態,健康監視器會表示該節點爲非健康的
    • ZooKeeper 會話管理:當 NN 是健康的,ZKFC 保持一個在 ZooKeeper 中打開的會話,若是該 NN 是 active 狀態,ZKFC 也保持一個特殊的 Znode 鎖,該鎖使用了 ZooKeeper 對短暫節點的支持,若是會話終止,鎖節點將自動刪除
    • 基於 ZooKeeper 的選擇:若是本地 NN 是健康的,且 ZKFC 發現沒有其它的節點當前持有 Znode 鎖,它將爲本身獲取該鎖,若是成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地 NN 爲 active,故障轉移進程與前面描述的手動故障轉移類似,首先若是必要保護以前的現役 NN,而後本地 NN 轉換爲 active 狀態

      3 HDFS-HA 集羣配置

      3.1 集羣規劃

      hadoop102 hadoop103 hadoop104
      NameNode NameNode
      JournalNode JournalNode JournalNode
      DataNode DataNode DataNode
      ZK ZK ZK
      ResourceManager
      NodeManager NodeManager NodeManager

      3.2 配置 Zookeeper 集羣

      一、集羣規劃ide

  • 在 hadoop10二、hadoop103 和 hadoop104 三個節點上部署 ZooKeeper

二、ZooKeeper 分發oop

  • 同步 /opt/module/zookeeper-3.4.10 目錄內容到 hadoop10三、hadoop104

三、配置服務器編號代理

  • 在/opt/module/zookeeper-3.4.10/zkData 目錄下建立一個 myid 的文件,添加與 server 對應的編號

四、配置 zoo.cfg 文件

  • 添加以下配置
# 2是第幾號服務器
# hadoop102是這個服務器的地址
# 2888是Follower與Leader交換信息的端口
# 3888是服務器通訊端口
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
  • 同步 zoo.cfg

五、分別啓動 ZooKeeper

3.3 配置 HDFS-HA 集羣

一、將/opt/module/下的 hadoop-2.7.2 拷貝到/opt/module/ha 目錄下
二、配置 core-site.xml

<configuration> 
  <property> 
  <!-- 把兩個NN的地址組裝成一個集羣mycluster -->
    <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> 
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
  </property>
</configuration>

三、配置 hdfs-site.xml

<configuration>
    <!-- 徹底分佈式集羣名稱 -->
    <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>hadoop102:9000</value>
    </property>

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

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

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

    <!-- 指定NameNode元數據在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104: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>/home/djm/.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>
</configuration>

四、將修改後的配置分發到其餘主機

3.4 啓動 HDFS-HA 集羣

一、在各個 JournalNode 節點上,輸入如下命令啓動 journalnode 服務

sbin/hadoop-daemon.sh start journalnode

二、在[nn1]上,對其進行格式化,並啓動

bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode

三、在[nn2]上,同步 nn1 的元數據信息

bin/hdfs namenode -bootstrapStandby

四、啓動[nn2]

sbin/hadoop-daemon.sh start namenode

五、在[nn1]上,啓動全部 datanode

sbin/hadoop-daemons.sh start datanode

六、將[nn1]切換爲 Active

bin/hdfs haadmin -transitionToActive nn1

七、查看是否 Active

bin/hdfs haadmin -getServiceState nn1

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

一、在 hdfs-site.xml 中增長 以下配置:

<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服務:

sbin/stop-dfs.sh

四、啓動Zookeeper集羣:

bin/zkServer.sh start

五、初始化HA在Zookeeper中狀態:

bin/hdfs zkfc -formatZK

六、啓動HDFS服務:

sbin/start-dfs.sh

七、驗證

  • 將 Active NameNode 進程 kill
    kill -9 15031
  • 將 Active NameNode 機器斷開網絡
    service network stop
相關文章
相關標籤/搜索