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