一、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.我們採用3個journalnode節點存儲元數據,這是他們的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:50070和http://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