hadoop namenode 高可用(HA)搭建指南 QJM方式

一、HDFS的高可用性

1.概述

         本指南提供了一個HDFS的高可用性(HA)功能的概述,以及如何配置和管理HDFS高可用性(HA)集羣。本文檔假定讀者具有對HDFS集羣的組件和節點類型具有一定理解。有關詳情,請參閱Apache的HDFS的架構指南。

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html

2.背景

         CDH4之前,在HDFS集羣中NameNode存在單點故障(SPOF)。對於只有一個NameNode的集羣,如果NameNode機器出現故障,那麼整個集羣將無法使用,直到NameNode重新啓動。

NameNode主要在以下兩個方面影響HDFS集羣:

(1). NameNode機器發生意外,比如宕機,集羣將無法使用,直到管理員重啓NameNode

(2). NameNode機器需要升級,包括軟件、硬件升級,此時集羣也將無法使用

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

3.架構

         HDFSHA的解決方案可謂百花齊放,Linux HA, VMware FT, sharedNAS+NFS, BookKeeper, QJM/Quorum Journal Manager, BackupNode等等。目前普遍採用的是shard NAS+NFS,因爲簡單易用,但是需要提供一個HA的共享存儲設備。而社區已經把基於QJM/Quorum Journal Manager的方案merge到trunk了,clouderea提供的發行版中也包含了這個feature,這種方案也是社區在未來發行版中默認的HA方案。

         在HA具體實現方法不同的情況下,HA框架的流程是一致的。不一致的就是如何存儲和管理日誌。在Active NN和Standby NN之間要有個共享的存儲日誌的地方,Active NN把EditLog寫到這個共享的存儲日誌的地方,Standby NN去讀取日誌然後執行,這樣Active和Standby NN內存中的HDFS元數據保持着同步。一旦發生主從切換Standby NN可以儘快接管Active NN的工作(雖然要經歷一小段時間讓原來Standby追上原來的Active,但是時間很短)。

         說到這個共享的存儲日誌的地方,目前採用最多的就是用共享存儲NAS+NFS。缺點有:1)這個存儲設備要求是HA的,不能掛掉;2)主從切換時需要fencing方法讓原來的Active不再寫EditLog,否則的話會發生brain-split,因爲如果不阻止原來的Active停止向共享存儲寫EditLog,那麼就有兩個Active NN了,這樣就會破壞HDFS的元數據了。對於防止brain-split問題,在QJM出現之前,常見的方法就是在發生主從切換的時候,把共享存儲上存放EditLog的文件夾對原來的Active的寫權限拿掉,那麼就可以保證同時至多隻有一個Active NN,防止了破壞HDFS元數據。

         Clouera爲解決這個問題提出了QJM/Qurom Journal Manager,這是一個基於Paxos算法實現的HDFS HA方案。QJM的結構圖如下所示:

         QJM的基本原理就是用2N+1臺JournalNode存儲EditLog,每次寫數據操作有大多數(>=N+1)返回成功時即認爲該次寫成功,數據不會丟失了。當然這個算法所能容忍的是最多有N臺機器掛掉,如果多於N臺掛掉,這個算法就失效了。這個原理是基於Paxos算法的,可以參考http://en.wikipedia.org/wiki/Paxos_(computer_science)

         用QJM的方式來實現HA的主要好處有:1)不需要配置額外的高共享存儲,這樣對於基於commodityhardware的雲計算數據中心來說,降低了複雜度和維護成本;2)不在需要單獨配置fencing實現,因爲QJM本身內置了fencing的功能;3)不存在Single Point Of Failure;4)系統魯棒性的程度是可配置的(QJM基於Paxos算法,所以如果配置2N+1臺JournalNode組成的集羣,能容忍最多N臺機器掛掉);5)QJM中存儲日誌的JournalNode不會因爲其中一臺的延遲而影響整體的延遲,而且也不會因爲JournalNode的數量增多而影響性能(因爲NN向JournalNode發送日誌是並行的)。


 

二、HDFS(HA)軟硬件配置

1.硬件

NameNode 機器,Active 、Standby 應該具有相同的硬件

2.軟件

(1)core-site.xml

<property>

      <name>fs.defaultFS</name>

      <value>hdfs://mycluster</value>

</property>

<property>

      <name>ha.zookeeper.quorum</name>

      <value>master,slave1,slave2,pcmk104,pcmk108</value>

</property>

(2)hdfs-site.xml

1. dfs.nameservices注意與core-site.xml中的fs.defaultFS中的value保持一致

<property>

     <name>dfs.nameservices</name>

     <value>mycluster</value>

</property>

 

2. dfs.ha.namenodes.mycluster每個namenode在名稱服務中的唯一標識

<property>

     <name>dfs.ha.namenodes.mycluster</name>

     <value>nn1,nn2</value>

</property>

 

3.兩個結點的rpc地址

<property>

     <name>dfs.namenode.rpc-address.mycluster.nn1</name>

     <value>master:54310</value>

</property>

<property>

     <name>dfs.namenode.rpc-address.mycluster.nn2</name>

     <value>pcmk104:54310</value>

</property>

 

4. servicerpc地址

<property>

        <name>dfs.namenode.servicerpc-address.mycluster.nn1</name>

        <value>master:53310</value>

   </property>

<property>

        <name>dfs.namenode.servicerpc-address.mycluster.nn2</name>

        <value>pcmk104:53310</value>

</property>

 

5.http通信地址

<property>

     <name>dfs.namenode.http-address.mycluster.nn1</name>

     <value>master:50070</value>

</property>

<property>

     <name>dfs.namenode.http-address.mycluster.nn2</name>

     <value>pcmk104:50070</value>

</property>

 

6.我們採用3journalnode節點存儲元數據,這是他們的IP與端口

<property>

     <name>dfs.namenode.shared.edits.dir</name>

     <value>qjournal://master:8485;pcmk104:8485;slave1:8485/mycluster</value>

</property>

 

7. journaldata的存儲路徑

<property>

      <name>dfs.journalnode.edits.dir</name>

      <value>/home/hadoop/journaldata/</value>

</property>

 

8.該類用來判斷哪個namenode處於生效狀態

<property>

    <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

 

9.打開自動切換namenode的功能

   <property>

        <name>dfs.ha.automatic-failover.enabled</name>

        <value>true</value>

   </property>

 

 

10. 運行腳本實現安全機制

   <property>

        <name>dfs.ha.fencing.methods</name>

        <value>shell(/bin/true)</value>

    </property>

 

三、HDFS(HA)初始化

1.格式化NameNode

設定所有的必要配置項後,必須首先同步兩個NameNode上的元數據。如果是新建的HDFS 集羣,則應首先格式化一個NameNode

(1)在格式化NameNode之前先啓動journalnode服務

進入bin目錄執行 ./hdfs journalnode

注意:在每一臺journalnode機上都需要啓動該服務。

檢查服務是否正常可以訪問master:8480,slave1:8480,pcmk104:8480來驗證。啓動後若出現異常,格式化NameNode之後就好了。

(2)格式化NameNode

進入bin目錄執行 ./hdfs namenode –format

2啓動hadoop

sbin目錄下執行 ./start-dfs.sh啓動hadoop集羣。

查看頁面http://pcmk104:50070http://master:50070/應該一個處於active狀態一個處於standby狀態。


 

四、參考文獻

[1].apache HighAvailability With QJM部分

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html

[2]. http://yanbohappy.sinaapp.com/?p=205

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章