HDFS HA介绍及配置理解
1、HDFS HA介紹
相比于Hadoop1.0,Hadoop 2.0中的HDFS增加了兩個重大特性,HA和Federaion。HA即為High Availability,用于解決NameNode單點故障問題,該特性通過熱備的方式為主NameNode提供一個備用者,一旦主NameNode出現(xiàn)故障,可以迅速切換至備NameNode,從而實現(xiàn)不間斷對外提供服務(wù)。Federation即為“聯(lián)邦”,該特性允許一個HDFS集群中存在多個NameNode同時對外提供服務(wù),這些NameNode分管一部分目錄(水平切分),彼此之間相互隔離,但共享底層的DataNode存儲資源。
在一個典型的HDFS HA場景中,通常由兩個NameNode組成,一個處于active狀態(tài),另一個處于standby狀態(tài)。Active NameNode對外提供服務(wù),比如處理來自客戶端的RPC請求,而Standby NameNode則不對外提供服務(wù),僅同步active namenode的狀態(tài),以便能夠在它失敗時快速進行切換。
為了能夠?qū)崟r同步Active和Standby兩個NameNode的元數(shù)據(jù)信息(實際上editlog),需提供一個共享存儲系統(tǒng),可以是NFS、QJM(Quorum Journal Manager)或者Bookeeper,Active Namenode將數(shù)據(jù)寫入共享存儲系統(tǒng),而Standby監(jiān)聽該系統(tǒng),一旦發(fā)現(xiàn)有新數(shù)據(jù)寫入,則讀取這些數(shù)據(jù),并加載到自己內(nèi)存中,以保證自己內(nèi)存狀態(tài)與Active NameNode保持基本一致,如此這般,在緊急情況下standby便可快速切為active namenode。
Hadoop0.23.2版本之前, NameNode是HDFS集群的單點故障點,每一個集群只有一個NameNode,如果這個機器或進程不可用,整個集群就無法使用,直到重啟NameNode或者新啟動一個NameNode節(jié)點。影響HDFS集群不可用主要包括以下兩種情況:
1)第一種情況是如機器宕機這樣的意外情況,將導(dǎo)致集群不可用,只有在重啟NameNode之后才可使用。
2)第二種情況是計劃內(nèi)的軟件或硬件升級(NameNode節(jié)點),將導(dǎo)致集群在短時間范圍內(nèi)不可用。
?
HDFS的HA就是為了解決上述問題,通過提供選擇運行在同一集群中的一個熱備用的“主/備”兩個冗余NameNodes。這允許在機器宕機或系統(tǒng)維護的時候,快速的轉(zhuǎn)移到另一個NameNode.
一個典型的HA集群,兩個單獨的機器配置為NameNodes,在任何時候,一個NameNode處于活動狀態(tài),另一個處于待機狀態(tài),活動的NameNode負責(zé)處理集群中所有客戶端的操作,待機時僅僅作為一個slave,保持足夠的狀態(tài),如果有必要提供一個快速的故障轉(zhuǎn)移.
為了保持備用節(jié)點與活動節(jié)點狀態(tài)的同步,目前的實現(xiàn)需要兩個節(jié)點同時訪問一個共享存儲設(shè)備(例如從NASNFS掛載)到一個目錄。將有可能在未來的版本中放寬此限制。當(dāng)活動節(jié)點對命名空間進行任何修改,它將把修改記錄寫到共享目錄下的一個日志文件,備用節(jié)點會監(jiān)聽這個目錄,當(dāng)發(fā)現(xiàn)更改時,它會把修改內(nèi)容同步到自己的命名空間。備用節(jié)點在故障轉(zhuǎn)移時,它將保證已經(jīng)讀取了所有共享目錄內(nèi)的更改記錄,保證在發(fā)生故障前的狀態(tài)與活動節(jié)點保持完全一致。
為了提供快速的故障轉(zhuǎn)移,必須保證備用節(jié)點有最新的集群中塊的位置信息,為了達到這一點,Datanode節(jié)點需要配置兩個nameNode的位置,同時發(fā)送塊的位置信息和心跳信息到兩個nameNode。
任何時候只有一個namenode處于活動狀態(tài),對于HA集群的操作是至關(guān)重要的,否則兩個節(jié)點之間的狀態(tài)就會產(chǎn)生沖突,數(shù)據(jù)丟失或其它不正確的結(jié)果,為了達到這個目的或者所謂的“裂腦場景”出現(xiàn),管理員必須為共享存儲配置至少一個(fencing)方法。在宕機期間,如果不能確定之間的活動節(jié)點已經(jīng)放棄活動狀態(tài),fencing進程負責(zé)中斷以前的活動節(jié)點編輯存儲的共享訪問。這可以防止任何進一步的修改命名空間,允許新的活動節(jié)點安全地進行故障轉(zhuǎn)移。
注:目前,只有手動故障轉(zhuǎn)移支持。這就意味著HA nameNode不能自動檢測活動nameNode的失敗,而是通過手動啟動故障轉(zhuǎn)移。自動故障檢測和故障轉(zhuǎn)移將在未來的版本中實現(xiàn)。
2、HA部署硬件資源
為了部署一個HA集群環(huán)境,您需要準備以下資源:
1)NameNode 機器:運行活動節(jié)點和備用節(jié)點的機器和非HA環(huán)境的機器需要有同相的硬件配置。
2)共享存儲:需要有一個主備namenode節(jié)點都是可讀寫的共享目錄,通常情況,這是一個遠程的文件管理器,它支持使用NFS掛載到每個namenode節(jié)點。目前只支持一個可編輯目錄。因此,系統(tǒng)的是否可用將受限于共享目錄是否可用,因此,為了消除所有單點故障,需要對共享目錄再加冗余,具體來說,多個網(wǎng)絡(luò)路徑的存儲需要實現(xiàn)存儲系統(tǒng)自身的冗余。因為這個原因,建議共享存儲服務(wù)器是一個高品質(zhì)的專用NAS設(shè)備,而不是一個簡單的Linux服務(wù)器。、
注:在HA集群環(huán)境里,備用的namenode還要執(zhí)行檢測命名空間的狀態(tài),因此,沒有必要再運行Secondary NameNode,CheckpointNode,BackupNode。事實上,這樣做將會報錯,這也允許在從非集群環(huán)境到集群環(huán)境的重新配置時,重新利用之前的Secondary NameNode的硬件資源。
3、HA部署配置簡介
類似聯(lián)邦配置,HA配置向后兼容,允許在不改變當(dāng)前單節(jié)點的情況下配置成集群環(huán)境,新的配置方案確保了在集群環(huán)境中的所有節(jié)點的配置文件都是相同的,沒有必要因為節(jié)點的不同而配置不同的文件。
和聯(lián)邦配置一樣,HA集群環(huán)境重復(fù)使用名稱服務(wù)ID來確定一個單一的HDFS實例,實際上可能包括多個HA namenodes.此外,一個新的namenode增加到HA,集群中的每一個nameNode都有一個不同的ID來標識它,為了支持所有namenode有同一個配置文件,所有的配置參數(shù)都以命名服務(wù)ID和nameNodeID為后綴。配置HA nameNodes,您需要增加一些配置選項到 hdfs-site.xml 配置文件。
配置選項的順序不重要,但dfs.federation.nameservices和dfs.ha.namenodes.[nameserviceID]的值將決定下面配置的Key值。因此,在配置其它選項前,需要確定這兩個選項的值。
1)dfs.federation.nameservices一個新的名稱服務(wù)的邏輯名稱。為名稱服務(wù)選擇一個邏輯名稱,如“mycluster”,使用這個邏輯名稱作為這個配置項的值。這個名稱可以是隨意的,它將用于配置和集群環(huán)境中HDFS絕對路徑的認證組件。
注:如果您還使用HDFS聯(lián)邦,這個配置項應(yīng)該包括其它的名稱服務(wù)列表,HA或者其它,用逗號進行分隔。
<property>
<name>dfs.federation.nameservices</name>
?<value>mycluster</value>
</property>
2)dfs.ha.namenodes.[nameservice ID]在名稱服務(wù)中每一個nameNode的唯一標識符配置一個逗號分隔的NameNode的ID的列表,DataNode會用它來確定在集群中的所有namenode.如我們前面使用"mycluster"作為我們名稱服務(wù)的ID,你如果使用nn1和nn2作為namenode的ID,你應(yīng)該這樣配置:
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
注:當(dāng)前一個名稱服務(wù)最多只允許配置兩個namenode。
3)dfs.namenode.rpc-address.[nameservice ID].[name node ID]每一個namenode監(jiān)聽的標準RPC地址對于前面配置的兩個namenode的ID,設(shè)置namenode節(jié)點詳細的地址和端口,注意,這個配置項將在兩個單獨的配置項里配置,如:
<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>
注:如果你愿意,你可以配置相同的RPC地址。
4)dfs.namenode.http-address.[nameservice ID].[namenode ID]每一個namenode監(jiān)聽的標準HTTP地址和RPC地址一樣,設(shè)置兩個namenode監(jiān)聽的http地址,如:
<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>
注:如果你啟用了hadoop的安全功能,你也可以同樣設(shè)置成https地址。
5)dfs.namenode.shared.edits.dir共享存儲目錄的位置這是配置備份節(jié)點需要隨時保持同步活動節(jié)點所作更改的遠程共享目錄,你只能配置一個目錄,這個目錄掛載到兩個namenode上都必須是可讀寫的,且必須是絕對路徑。如:
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>file:///mnt/filer1/dfs/ha-name-dir-shared</value>
</property>
6)dfs.client.failover.proxy.provider.[nameserviceID]HDFS客戶端用來和活動的namenode節(jié)目聯(lián)系的java類配置的java類是用來給HDFS客戶端判斷哪個namenode節(jié)點是活動的,當(dāng)前是哪個namenode處理客戶端的請求,當(dāng)前hadoop唯一的實現(xiàn)類是ConfiguredFailoverProxyProvider,除非你自己定義了一個類,否則都將使用這個類。如:
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
7)dfs.ha.fencing.methods將用于停止活動NameNode節(jié)點的故障轉(zhuǎn)移期間的腳本或Java類的列表任何時候只有一個namenode處于活動狀態(tài),對于HA集群的操作是至關(guān)重要的,因此,在故障轉(zhuǎn)移期間,在啟動備份節(jié)點前,我們首先要確保活動節(jié)點處于等待狀態(tài),或者進程被中止,為了達到這個目的,您至少要配置一個強行中止的方法,或者回車分隔的列表,這是為了一個一個的嘗試中止,直到其中一個返回成功,表明活動節(jié)點已停止。hadoop提供了兩個方法:shell和sshfence,要實現(xiàn)您自己的方法,請看org.apache.hadoop.ha.NodeFencer類。
sshfence 通過ssh連接活動namenode節(jié)點,殺掉進程。為了實現(xiàn)SSH登錄殺掉進程,還需要配置免密碼登錄的SSH密匙信息,如下所示:
<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>
另外,也可以配置一個用戶名和SSH端口。也可以為SSH設(shè)定一個超時,以毫秒為單位,它可以像這樣配置:
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>34</value>
</property>
shell -執(zhí)行任意的shell命令來終止活動namenode節(jié)點,配置如下:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sharg1arg2 ...)</value>
</property>
shell腳本將會運行在包括所有hadoop配置參數(shù)變量的環(huán)境中,只需將配置key的.換成_即可。如dfs_namenode_rpc-address。除此之外,還包括以下的變量:
$target_host需要中止的服務(wù)器hostname
$target_port需要中止的服務(wù)器端口
$target_address上面兩個參數(shù)的組合
$target_nameserviceid需要中止的名稱服務(wù)ID
$target_namenodeid
需要中止的namenode的ID
這些變量也可以直接在shell腳本中使用,如:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh--nameservice=$target_nameserviceid$target_host:$target_port)</value>
</property>
如果腳本返回0表示中止成功,返回其它值表示失敗,同時將嘗試列表中的其它中止方法。
注:這個方法沒有實現(xiàn)超時設(shè)置,所有超時設(shè)置都取決于腳本自身。
8)fs.defaultFS當(dāng)FS客戶端沒有設(shè)置時的默認路徑的前綴。另外,您可以配置為hadoop客戶端配置HA集群的URI作為默認路徑。如果你使用"mycluster"作為名稱服務(wù)ID,那么在core-site.xml文件中將配置為:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
?
4、HA部署詳情
所有配置完成后,最初必須同步兩個HAnamenode磁盤上的元數(shù)據(jù)。如果您是全新安裝一個HDFS集群,那么您需要在其中一個namenode運行格式化命令(hdfsnamenode -format),如果你已經(jīng)格式化過namenode或者是從一個非HA環(huán)境轉(zhuǎn)換到HA環(huán)境,那么你需要使用scp或類似的命令把namenode上的元數(shù)據(jù)目錄復(fù)制到另一個namenode。通過配置 dfs.namenode.name.dir 和dfs.namenode.edits.dir兩個選項到包含namenode元數(shù)據(jù)目錄的位置。在這個時候,你必須保證之前配置的共享目錄包括在您namenode元數(shù)據(jù)目錄下的最近的編輯文件信息。然后,您可以和平時啟動namenode一樣,啟動兩個HA namenode。
您可以通過配置的HTTP web地址訪問兩個namenode,你會看到兩個HAnamenode當(dāng)前的狀態(tài)(主/備),當(dāng)namenode啟動的時候,它的最被狀態(tài)都是“備”狀態(tài)。
5、HA管理命令
現(xiàn)在完成了配置和啟動,你可以執(zhí)行其它的命令來管理你的HA集群。具體來說,你應(yīng)該熟悉所有hdfs haadmin下的所有命令。不加任何參數(shù)的情況下,將顯示如下信息:
Usage:DFSHAAdmin [-ns<nameserviceId>]
[-transitionToActive<serviceId>]
?[-transitionToStandby<serviceId>]
?[-failover [--forcefence][--forceactive]<serviceId> <serviceId>]
?[-getServiceState<serviceId>]
?[-checkHealth<serviceId>]
?[-help <command>]
本指南將介紹這此子命令的高級別用法,每個命令的詳細使用幫助,您可以運行如下命令來查看:
hdfs haadmin -help<command> transitionToActive和transitionToStandby就是把指定的namenode轉(zhuǎn)換到主/備狀態(tài)。
注:這個命令把指定的namenode轉(zhuǎn)換到主/備狀態(tài),但這個命令不會試圖去停止活動節(jié)點,所以,盡量少使用它,可以使用hdfs haadmin -failover來代替。
failover- 在兩個namenode之間做故障轉(zhuǎn)移。此命令將會把故障從第一個轉(zhuǎn)移到第二個namenode,如果第一個namenode是“備”狀態(tài),這個命令會成功的將第二個namenode轉(zhuǎn)換到“主”狀態(tài),如果第一個namenode是“主”狀態(tài),它將會嘗試把它轉(zhuǎn)換到“備”狀態(tài),它會使用在之前配置的 dfs.ha.fencing.methods 所有方法列表中從第一個開始,只到成功為止,它才會把第二個namenode轉(zhuǎn)換成“主”狀態(tài)。如果所有方法都不能把第一個namenode轉(zhuǎn)換到“備”狀態(tài),那么第二個namenode也不能轉(zhuǎn)換成“主”狀態(tài),它將返回一個錯誤信息。
getServiceState- 獲取指定namenode的狀態(tài)。連接到指定的namenode去確定它當(dāng)前的狀態(tài),并打印出出它的狀態(tài)(主或備)。根據(jù)namenode不同的狀態(tài),這個命令會使用cron作業(yè)或監(jiān)控腳本來執(zhí)行。
checkHealth- 檢查指定namenode的健康狀態(tài)。連接到指定的namenode去檢查它的健康狀態(tài),namenode能夠?qū)ψ陨磉M行一些診斷,包括檢查內(nèi)部服務(wù)是否按預(yù)期運行。如果namenode運行正常,它將返回0,否則返回非0的值。這個命令的唯一用途就是進行監(jiān)測。
注: 當(dāng)前這個命令還沒有實現(xiàn), 除非namenode完成宕機,否則它總是返回成功.
總結(jié)
以上是生活随笔為你收集整理的HDFS HA介绍及配置理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop2常用Shell命令
- 下一篇: (转载)hadoop2.2.0集群的HA