1、 Hadoop 的高可用性
1. 概論
本指南提供了一個HDFS 的高可用性(HA )功能的概述,以及如何配置和管理HDFS 高可用性(HA) 集羣。本文檔假定讀者具備對HDFS 集羣的組件和節點類型具備必定理解。有關詳情,請參閱Apache 的HDFS 的架構指南。
http://hadoop.apache.org/common/docs/current/hdfs_design.htmlhtml
2. 背景
CDH4 以前,在HDFS 集羣中NameNode 存在單點故障(SPOF )。對於只有一個NameNode 的集羣,若是NameNode 機器出現故障,那麼整個集羣將沒法使用,直到NameNode 從新啓動。
NameNode 主要在如下兩個方面影響HDFS 集羣:
(1). NameNode 機器發生意外,好比宕機,集羣將沒法使用,直到管理員重啓NameNode
(2). NameNode 機器須要升級,包括軟件、硬件升級,此時集羣也將沒法使用
HDFS 的HA 功能經過配置Active/Standby 兩個NameNodes 實如今集羣中對NameNode 的熱備來解決上述問題。若是出現故障,如機器崩潰或機器須要升級維護,這時可經過此種方式將NameNode 很快的切換到另一臺機器。java
3. 架構
在 一個典型的HDFS(HA) 集羣中,使用兩臺單獨的機器配置爲NameNodes 。在任什麼時候間點,確保NameNodes 中只有一個處於Active 狀態,其餘的處在Standby 狀態。其中ActiveNameNode 負責集羣中的全部客戶端操做,StandbyNameNode 僅僅充當備機,保證一旦ActiveNameNode 出現問題可以快速切換。
爲了保證Standby 節點與Active 節點的狀態保持同步,目前是經過兩個節點同時訪問一個共享的存儲設備( 如NFS) 來實現的,在之後的版本中可能會作進一步的改進。
當Active 節點的namespace 發生改變時,存儲在共享目錄中的日誌文件也會被修改,Standby 節點監測到日誌變化後,將其做用到自身的namespace 。當Active 節點發生故障須要進行切換時,Standby 節點由Standby 狀態轉換爲Active 狀態前將會把全部未讀日誌做用到自身的namespace 以確保自身的namespace 與主節點的namespace 保持一致。
爲了實現快速切換,Standby 節點獲取集羣的最新文件塊信息也是頗有必要的。爲了實現這一目標,DataNode 須要配置NameNodes 的位置,並同時給他們發送文件塊信息以及心跳檢測。
任 意時間只有一個ActiveNameNode 對於HDFS(HA) 集羣的正常運行相當重要,不然二者的namespace 將不能保持同步,面臨數據丟失和其它問題的危險性。爲了防止出現這種狀況,管理員必須爲共享存儲配置至少一個安全機制。這種機制應該保證: 在切換期間,若是不能證明當前Active 節點已經改變了狀態,那麼此機制應切斷當前Active 節點對共享存儲的訪問,這樣能夠防止在切換期間當前Active 節點繼續對namespace 進行修改,確保新的Active 節點可以安全的切換。
注意:
此版本只支持手動切換,這意味着集羣並不能自動檢測Active 節點發生故障。node
2、 HDFS(HA) 的硬件配置
爲了部署一個HA 羣集,你應該準備如下幾點:
1.NameNode 機器,Active 、Standby 應該具備相同的硬件
2. 共享存儲,須要有一個可以保證全部NameNode 讀寫的共享目錄。一般,這應該是一個遠程文件系統,支持NFS 和掛載在每一個NameNode 機器上。在此版本中,只有一個對共享可編輯目錄的支持。這個共享可編輯目錄的可用性頗有限,所以,爲了消除單點故障,必須提升此存儲設備的可用性。一個高 品質的專用NAS 設備要好過經過一個簡單的Linux 服務器提供NFS 服務的方式。
注意:
在HDFS(HA) 集羣中,Standby 節點還執行着對namespace 狀態的checkpoint 功能,所以沒有必要再運行SecondaryNameNode 、CheckpointNode 、BackupNode 。shell
3、 HDFS(HA) 的軟件配置
1. 配置概述
對於使用一個NameNode 的集羣,HA 的配置與HDFS 的Federation 機制是兼容的,新的配置項被設計用在集羣中的全部相同類型的節點具備相同的配置,不須要爲相同類型節點的不一樣機器部署不一樣的配置文件。
HDFS(HA) 集羣使用NameServiceID 來標示NameNode ,做爲NameNode 的編號。apache
2. 現有的配置參數
下面的配置參數發生了變化:
core-site.xml
(1)fs.defaultFS - 若是沒有配置則使用fs.default.name
Xml代碼
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property> 安全
3. 新增的配置參數
hdfs-site.xml
(1)dfs.federation.nameservices --- federation 服務名
Xml代碼
<property>
<name>dfs.federation.nameservices</name>
<value>mycluster</value>
</property>
(2) 若是同時還使用HDFS 的Federation 機制,則應該使用逗號分隔nameservices 列表
Xml代碼
<property>
<name>dfs.federation.nameservices</name>
<value>mycluster,mycluster1</value>
</property>
(3)dfs.ha.namenodes.[nameservice ID] --- 每一個NameNode 在名稱服務中的惟一標識, 此版本最大隻支持兩個NameNode
Xml代碼
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
(4)dfs.namenode.rpc-address.[nameservice ID] --- rpc 通訊地址
Xml代碼
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
(5)dfs.namenode.http-address.[nameservice ID] --- http 通訊地址
Xml代碼
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:50070</value>
</property>
(6)dfs.namenode.shared.edits.dir --- 共享存儲目錄位置
Xml代碼
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>file:///mnt/filer1/dfs/ha-name-dir-shared</value>
</property> 服務器
4. 客戶端故障轉移配置
(1)dfs.client.failover.proxy.provider.[nameservice ID] --- HDFS 客戶端與Active 節點通訊的java 類,使用其肯定Active 節點是否活躍
Xml代碼
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property> 架構
5. 安全配置
dfs.ha.fencing.methods --- 用於在Active 節點切換期間的安全機制,確保在任什麼時候間都只有一個NameNode 處於活躍狀態。在故障切換期間,haadmin 命令確保在將其它NameNode 轉換爲Active 狀態以前Active 節點處在Standby 狀態,或其進程已被終止。
至少應該配置一個,由於沒有默認配置,所以若是配置則HA 機制將會失效。
若是要實現自定義的安全機制,參照org.apache.hadoop.ha.NodeFencer
(1)sshfence 方式
經過SSH 鏈接到ActiveNameNode 殺死監聽服務端TCP 監聽的進程
Xml代碼
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/exampleuser/.ssh/id_rsa</value>
</property>
或者配置非標準的用戶名和端口以及超時時間
Xml代碼
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value> 60000</value>
</property>
(2)shell 方式
運行腳本實現安全機制
Xml代碼
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property> ssh
4、 HDFS (HA) 的初始化
設 定全部的必要配置項後,必須首先同步兩個NameNode 上的元數據。若是是新建的HDFS 集羣,則應首先格式化一個NameNode ,或者想把非HA 集羣轉換爲HA 集羣,按照dfs.namenode.name.dir 、dfs.namenode.edits.dir 的配置把當前NameNode 節點的元數據目錄複製到另外一個NameNode. 還應該確保共享存儲目錄下(dfs.namenode.shared.edits.dir ) 包含NameNode 全部的元數據。ide
5、 HDFS(HA) 的管理
sbin/start-dfs.sh
默認以HA 方式啓動集羣,啓動後爲Standby 狀態,使用以下命令設置Active 節點
# bin/hdfs haadmin –DFSHAadmin –transitionToActive nn1
若是讓nn2 成爲變爲active nn1 變爲standby ,則
# bin/hdfs haadmin -DfSHAadmin -failover nn1 nn2
若是失敗(is not ready to become active) 則
# bin/hdfs haadmin -DfSHAadmin -failover --forceactive nn1 nn2
Usage: DFSHAAdmin [-ns <nameserviceId>]
[-transitionToActive <serviceId>]
[-transitionToStandby <serviceId>]
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>]
[-checkHealth <serviceId>]
[-help <command>]