1. 程式人生 > >大數據(3) - 高可用 HDFS HA

大數據(3) - 高可用 HDFS HA

hdf ice 宕機 val 裏的 功能 響應 clas address

HDFS HA高可用

1 HA概述

1)所謂HA(high available),即高可用(7*24小時不中斷服務)。

2)實現高可用最關鍵的策略是消除單點故障。HA嚴格來說應該分成各個組件的HA機制:HDFS的HA和YARN的HA。

3)Hadoop2.0之前,在HDFS集群中NameNode存在單點故障(SPOF)。

4)NameNode主要在以下兩個方面影響HDFS集群

NameNode機器發生意外,如宕機,集群將無法使用,直到管理員重啟

NameNode機器需要升級,包括軟件、硬件升級,此時集群也將無法使用

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

2 HDFS-HA工作機制

1)通過雙namenode消除單點故障

2.1 HDFS-HA工作要點

1)元數據管理方式需要改變:

內存中各自保存一份元數據;

Edits日誌只有Active狀態的namenode節點可以做寫操作;

兩個namenode都可以讀取edits;

共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現);

2)需要一個狀態管理功能模塊

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

3)必須保證兩個NameNode之間能夠ssh無密碼登錄。

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

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

前面學習了使用命令hdfs haadmin -failover手動進行故障轉移,在該模式下,即使現役NameNode已經失效,系統也不會自動從現役NameNode轉移到待機NameNode,下面學習如何配置部署HA自動進行故障轉移。自動故障轉移為HDFS部署增加了兩個新組件:ZooKeeper和ZKFailoverController(ZKFC)進程。ZooKeeper是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的以下功能:

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

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

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

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

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

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

3 HDFS-HA集群配置 -- 手動轉移

3.1.將hadoop2.7.2 復制到 modules/HA裏面

cd /home/admin/modules

mkdir HA

cp -r hadoop-2.7.2/ Ha/

  

3.2 配置,修改core-site.xml 與 hdfs-site.xml 文件

cd /home/admin/modules/HA/hadoop-2.7.2/etc/hadoop

vim core-site.xml

<configuration>
        <!-- 把兩個NameNode)的地址組裝成一個集群mycluster -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://mycluster</value>
        </property>

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


        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/admin/modules/HA/hadoop-2.7.2/jn/mycluster</value>
        </property>

</configuration>

  

 vim 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>linux01:8020</value>
        </property>

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

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

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

     <!-- 指定NameNode元數據在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://linux01:8485;linux02:8485;linux03: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/admin/.ssh/id_rsa</value>
        </property>

        <!-- 指定數據冗余分數 -->
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>

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

        
        <property>
                <name>dfs.webhdfs.enable</name>
                <value>true</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.3.分發到linux02和linux03中

scp -r HA/ linux02:/home/admin/modules/

scp -r HA/ linux03:/home/admin/modules/

  

3.4啟動三臺機器的journalnode(分別在三臺機器上面執行且jps查看是否執行成功)

sbin/hadoop-daemon.sh start journalnode 

  

3.5格式化linux01的namenode節點

bin/hdfs namenode -format

  

3.6啟動剛格式化的namenode

sbin/hadoop-daemon.sh start namenode

  

3.7備用namenode同步主namenode的元數據信息,(在linux02中執行)

bin/hdfs namenode -bootstrapStandby

  

3.8啟動被namenode(在linux02中執行)

sbin/hadoop-daemon.sh start namenode

  

3.9啟動所有datanode(分別在三臺機器執行,並用jps查看是否執行成功)

註意,有時datanode會啟動失敗,原因:

當時“再來一次”,又重新執行了格式化命令(hdfs namenode -format),這時namenode的clusterID會重新生成,而datanode的clusterID 保持不變。

所以,解決辦法也很簡單了,把name/current/VERSION裏面的clusterID復制下來,依次替換data/current/VERSION裏的clusterID,再執行:

sbin/hadoop-daemon.sh start datanode

  

3.10兩個namenode目前都處於standby狀態,所以是都沒有辦法Browse Directory (瀏覽目錄的),必須手動激活其中一個namenode的

狀態為active才可以,如果想把nn2設置為active狀態,必須先把nn1設置為standby狀態

轉變為active狀態
bin/hdfs haadmin -transitionToActive nn1

轉變為standby狀態
bin/hdfs haadmin -transitionToStandby nn1

  

3.11重點:把處於active狀態的nn1手動關掉,看會發生什麽事

關掉linux01的namenode
sbin/hadoop-daemon.sh stop namenode

  

結論:關掉以後,想去把nn2設置為active狀態,但是不成功,這是防止腦裂機制決定的,只能強制切換:

bin/hdfs haadmin -transitionToActive nn2 --forceactive

  

大數據(3) - 高可用 HDFS HA