本文主要介紹HDFS HA特性,以及如何使用QJM(Quorum Journal Manager)特性實現(xiàn)HDFS HA。
站在用戶的角度思考問題,與客戶深入溝通,找到淥口網(wǎng)站設計與淥口網(wǎng)站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、雅安服務器托管、企業(yè)郵箱。業(yè)務覆蓋淥口地區(qū)。一、背景
HDFS集群中只有一個Namenode,這就會引入單點問題;即如果Namenode故障,那么這個集群將不可用,直到Namenode重啟或者其他Namenode接入。
有兩種方式會影響集群的整體可用性:
1、意外的突發(fā)事件,比如物理機器crash,集群將不可用,直到管理員重啟Namenode。
2、系統(tǒng)維護,比如軟件升級等,需要關閉Namenode,也會導致集群暫時性的失效。
HDFS HA特性即解決這個問題,它通過在集群中同時運行2個(redundant)Namenodes,并讓active和passive之間熱備(hot standby)。當Active Namenode故障失效后,即可快速故障轉移到新的Namenode上(passive Namenode);也可以在計劃維護期間,基于管理員發(fā)起(administrator-inited)的友好的failover。
二、Architecture
在典型的HA架構中,有兩個獨立的機器作為Namenode,任何時刻,只有一個Namenode處于Active狀態(tài),另一個處于standby狀態(tài)(passive,備份);Active Namenode用于接收Client端請求,Standy節(jié)點作為slave保持集群的狀態(tài)數(shù)據(jù)以備快速failover。
為了讓Standby Node與Active Node保持同步,這兩個Node都與一組稱為JNS的互相獨立的進程保持通信(Journal Nodes)。當Active Node上更新了namespace,它將記錄修改日志發(fā)送給JNS的多數(shù)派。 Standby noes將會從JNS中讀取這些edits,并持續(xù)關注它們對日志的變更。Standby Node將日志變更應用在自己的namespace中,當failover發(fā)生時,Standby將會在提升自己為Active之前,確保能夠從JNS中讀取所有的edits;即在failover發(fā)生之前,Standy持有的namespace應該與Active保持完全同步。
為了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。為了達到這一目的,Datanodes上需要同時配置這兩個Namenode的地址,同時和它們都建立心跳鏈接,并把block位置發(fā)送給它們。
任何時刻,只有一個Active Namenode是非常重要的,否則將會導致集群操作的混亂,那么兩個Namenode將會分別有兩種不同的數(shù)據(jù)狀態(tài),可能會導致數(shù)據(jù)丟失,或者狀態(tài)異常,這種情況通常稱為“split-brain”(腦裂,三節(jié)點通訊阻斷,即集群中不同的Datanodes卻看到了兩個Active Namenodes)。對于JNS(Journal Nodes)而言,任何時候只允許一個Namenode作為writer;在failover期間,原來的Standby Node將會接管Active的所有職能,并負責向JNS寫入日志記錄,這就阻止了其他Namenode基于處于Active狀態(tài)的問題。
三、硬件資源
為了構建HA集群架構,你需要準備如下資源:
1、Namenode機器:兩臺配置對等的物理機器,它們分別運行Active和Standby Node。
2、JouralNode機器:運行JouralNodes的機器。JouralNode守護進程相當?shù)妮p量級,它們可以和hadoop的其他進程部署在一起,比如Namenodes、jobTracker、ResourceManager等。不過為了形成多數(shù)派(majority),至少需要3個JouralNodes,因為edits操作必須在多數(shù)派上寫入成功。當然JNS的個數(shù)可以 > 3,且通常為奇數(shù)(3,5,7),這樣可以更好的容錯和形成多數(shù)派。如果你運行了N個JNS,那么它可以允許(N-1)/2個JNS進程失效并且不影響工作。
此外,在HA集群中,standby namenode還會對namespace進行checkpoint操作(繼承Backup Namenode的特性),因此,就不需要在HA集群中運行SecondaryNamenode、CheckpointNode或者BackupNode。事實上,HA架構中運行上述節(jié)點,將會出錯(不允許)。
四、部署
一) 、配置
和HDFS Federation類似,HA配置向后兼容,運行只有一個Namenode運行而無需做任何修改。新的配置中,要求集群中所有的Nodes都有相同的配置文件,而不是根據(jù)不同的Node設定不同的配置文件。
和HDFS Federation一樣,HA集群重用了“nameservice ID”來標識一個HDFS 實例(事實上它可能包含多個HA Namenods);此外,“NameNode ID”概念被添加到HA中,集群中每個Namenode都有一個不同的ID;為了能夠讓一個配置文件支持所有的Namenodes(適用與Federation環(huán)境),那么相關的配置參數(shù)都以“nameservice ID”或“Namenode ID”作為后綴。
修改hdfs-site.xml,增加如下幾個配置參數(shù),其參數(shù)的順序無關。
1、dfs.nameservices:nameservice的邏輯名稱??梢詾槿我饪勺x字符串;如果在Federation中使用,那么還應該包含其他的nameservices,以","分割。
dfs.nameservices hadoop-ha,hadoop-federation
2、dfs.ha.namenodes. [nameservice ID] :
dfs.ha.namenodes.hadoop-ha nn1,nn2
其中“hadoop-ha”需要和1)中配置的nameservice ID匹配,此處我們定義“hadoop-ha”下有2個namenode ID。
3、dfs.namenode.rpc-address. [nameservice ID] . [namenode ID]
dfs.namenode.rpc-address.hadoop-ha.nn1 machine1.example.com:8020 dfs.namenode.rpc-address.hadoop-ha.nn2 machine2.example.com:8020
其中nameservice ID需要和1)匹配,namenode ID需要和2) 匹配。配置項的值為相應namenode的hostname以及通訊端口號(Client與namenode RPC通訊端口),它和non-ha模式下“dfs.namenode.rpc-address”作用一樣。每個namenode ID都需要單獨配置。
你可以根據(jù)需要,配置“dfs.namenode.servicerpc-address”,格式和上述一致。(SNN,backup節(jié)點與Namenode通訊地址)
4、dfs.namenode.http-address.[nameservice ID].[namenode ID]
dfs.namenode.http-address.hadoop-ha.nn1 machine1.example.com:50070 dfs.namenode.http-address.hadoop-ha.nn2 machine2.example.com:50070
各個namenode的HTTP地址。它和non-ha下的"dfs.namenode.http-address"配置作用一樣。
5、dfs.namenode.shared.edits.dir:
dfs.namenode.shared.edits.dir qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/hadoop-ha
配置JNS組的url地址,Namenodes將會從JNS組中讀寫edits。這是一個共享存儲區(qū),Active Namenode寫入,Standby Node讀取,每個Namenodeservice必須配置足夠多的JNS地址(>=3,多數(shù)派),每條的格式為:“qjournal://host1:port1;host2:port2;host3:port3/journalId”
其中journalId需要和上述配置中的“nameserviceID”匹配。
dfs.journalnode.rpc-address 0.0.0.0:8485 dfs.journalnode.http-address 0.0.0.0:8480
此外,我們還需要在相應的JournalNodes上增加上述配置。
6、dfs.client.failover.proxy.provider. [nameservice ID] :
dfs.client.failover.proxy.provider.hadoop-ha org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
7、dfs.ha.fencing.methods:在failover期間用來隔離Active Namenode的腳本或者java 類列表。
雖然JNS可以確保集群中只有一個Active Node寫入edits,這對保護edits一致性很重要,但是在failover期間,有可能Acitive Node仍然存活,Client可能還與其保持連接提供舊的數(shù)據(jù)服務,我們可以通過此配置,指定shell腳本或者java程序,SSH到Active NameNode然后Kill Namenode進程。它有兩種可選值(具體參見官方文檔):
1) sshfence:SSH登錄到Active Namenode,并Kill此進程。首先當前機器能夠使用SSH登錄到遠端,前提是已經授權(rsa)。
2) shell:運行shell指令隔離Active Namenode。
dfs.ha.fencing.methods shell(/path/to/my/script.sh arg1 arg2 ...)
“()”之間為shell腳本的路徑,以及參數(shù)列表。
8、fs.defaultFS(core-site.xml):
在non-ha下,這個參數(shù)值為namenode的地址:“hdfs://namenode:8020”;不過在HA架構下,將使用namenservice名稱替代
fs.defaultFS hdfs://hadoop-ha
9、dfs.journalnode.edits.dir:
指定journalNode存儲edits文件的本地路徑。
最終,上述配置信息,需要在server和Client端同時配置才能有效的適應HA與failover特性。
二)、部署
上述配置調整完畢后,我們就可以啟動journalNodes守護進程,默認的"sbin/start-dfs.sh"腳本會根據(jù)"dfs.namenode.shared.edits.dir"配置,在相應的Datanode上啟動journalNodes。當然我們可以使用::"bin/hdfs start journalnode"分別在相應的機器上啟動。
一旦JournalNodes啟動成功,它們將會從Namenode上同步metadata。
1、如果你的HDFS集群是新建的,那么需要在每個Namenode上執(zhí)行"hdfs namenode -format"指令。
2、如果你的namenodes已經format了,或者是將non-ha轉換成ha架構,你應該在將其中一個namenode上的metadata復制到另一臺上(dfs.namenode.name.dir目錄下的數(shù)據(jù)),然后在那個沒有format的新加入的namenode上執(zhí)行"hdfs namenode -bootstrapStandby"。運行這個指令需要確保JournalNodes中持有足夠多的edits。
3、如果你將一個non-ha的Namenode(比如backup,其已經formated)切換成HA,你需要首先運行"hdfs -initializeSharedEdits",這個指令將本地Namenode中的edits初始化Journalnodes。
此后,你就可以啟動HA Namenodes??梢酝ㄟ^配置指定的HTTP地址(dfs.namenode.https-address)來查看各個Namenode的狀態(tài),Active or Standby。
三)、管理員指令
HA集群啟動后,我們可以通過一些指令來管理HDFS集群?!癰in/hdfs haadmin -DFSHAAdmin”指令,其可選參數(shù):
1、-transitionToActive
2、-failover [--forcefence] [--foreactive]
例如:"hdfs haadmin -DFSHAAdmin -failover nn1 nn2"
3、-getServiceState
4、-checkHealth
四)、自動Failover
上述介紹了如何配置手動failover,在這種模式下,系統(tǒng)不會自動觸發(fā)failover,即不會將Standby提升為Active,即使Active已經失效。接下來介紹如何實現(xiàn)自動failover。
1)、組件
Automatic Failover中,增加了2個新的組件:zookeeper集群,ZKFailoverController進程(簡稱為ZKFC)。
Zookeeper是一個高可用的調度服務,可以保存一系列調度數(shù)據(jù),當這些數(shù)據(jù)變更(notify)時可以通知Client,以及監(jiān)控(montitor)Clients失效,自動failover的實現(xiàn)將依賴于Zookeeper的幾個特性:
1、Failure delection:失效檢測,每個Namenode將會和zookeeper建立一個持久session,如果Namenode失效,那么次session將會過期失效,此后Zookeeper將會通知另一個Namenode,然后觸發(fā)Failover。
2、Active Namenode election:zookeeper提供了簡單的機制來實現(xiàn)Acitve Node選舉,如果當前Active失效,Standby將會獲取一個特定的排他鎖(lock),那么獲取(持有)鎖的Node接下來將會成為Active。
ZKFailoverControllor(ZKFC)是一個zookeeper客戶端,它主要用來監(jiān)測和管理Namenodes的狀態(tài),每個Namenode機器上都會運行一個ZKFC程序,它的職責為:
1、Health monitoring:ZKFC間歇性的使用health-check指令ping本地的Namenode,Namenode也會及時的反饋自己的health status。如果Namenode失效,或者unhealthy,或者無響應,那么ZKFS將會標記其為“unhealthy”。
2、Zookeeper session manangement:當本地Nanenode運行良好時,ZKFC將會持有一個zookeeper session,如果本地Namenode為Active,它同時也持有一個“排他鎖”(znode);這個lock在zookeeper中為“ephemeral” znode(臨時節(jié)點),如果session過期,那么次lock所對應的znode也將被刪除。(參見zookeeper特性)
3、Zookeeper-based election:如果本地Namenode運行良好,并且ZKFS沒有發(fā)現(xiàn)其他的的Namenode持有l(wèi)ock(比如Active失效后,釋放了lock),它將嘗試獲取鎖,如果獲取成功,即“贏得了選舉”,那么此后將會把本地Namenode標記為Active,然后觸發(fā)Failover:首先,調用fencing method,然后提升本地Namenode 為Active。
2)、配置
在Automatic Failover中,需要把一個重要的配置項添加到hdfs-site.xml中。
dfs.ha.automatic-failover.enabled true
此外還需要在core-site.xml中,增加如下配置:
ha.zookeeper.quorum zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181
上述zookeeper集群為即備,盡可能選擇相對平穩(wěn)的zk集群。
其中"dfs.ha.automatic-failover.enabled"可以為每個nameservice ID分別配置:dfs.ha.automatic-failover.enabled.[nameservice ID]。此外在core-site.xml中還可以配置Zookeeper Client的相關參數(shù),比如sessionTimeout,這些配置項以"ha.zookeeper"開頭,其中"dfs.ha."開頭的部分配置項可以用來設定fencing method的相關控制。
3)、初始化HA狀態(tài)
上述準備工作結束后,我們還需要在zookeeper中初始化HA的狀態(tài),通過執(zhí)行“hdfs zkfc -formatZK”,此命令將會在zookeeker中創(chuàng)建一個znode,用來保存HA或failover的數(shù)據(jù)。
4)、啟動集群
可以使用"start-dfs.sh"這個便捷的指令,它啟動了hdfs所需要的所有守護進程,當然包括ZKFC。也可以使用"hadoop-daemon.sh start zkfc"手動啟動ZKFC客戶端。
5)、檢驗Failover
一旦Automatic Failover集群啟動之后,我們需要檢測Failover是否符合預期。首先,我們需要通過命令(getServiceState)或者在Namenode的Web UI上查看各個Namenode的狀態(tài),確認兩個Namenode是否分別處于Active和Standby;此后,你可以手動關閉Active Namenode,比如使用kill -9
如果沒有按照預期failover,那么你需要檢測配置文件是否正確,zk服務是否正確。此外,我們還可以使用上述DFSHAAadmin指令多次嘗試。
五)、FAQ
1、ZKFC和Namenodes守護進程的啟動順序是否重要?
No,對于指定的Namenode,你可以在其之前或者之后啟動ZKFC均可以,ZKFC只是調度Namenode的存活狀態(tài),如果不啟動ZKFC,此Namenode將無法參與自動failover過程。
2、是否需要額外的monitoring?
你需要在Namenode機器上,添加額外的monitor用來監(jiān)控ZKFC是否運行。在某些情況下,zookeeper集群的故障可能導致ZKFC意外中斷,你需要適時的重啟ZKFC。此外,還需要監(jiān)控Zookeeper集群的運行狀況,如果Zookeeper集群失效,那么HA集群將無法failover。
3、如果Zookeeper失效,將會怎么樣?
如果zookeeper集群故障,那么Automatic Failover將不會觸發(fā),即使Namenode失效,這也意味著ZKFC無法正常運行。不過,如果Namenodes正常(即使有一個失效),那么HDFS系統(tǒng)將不會受到影響。因為HDFS Client并沒有基于zookeeper做任何事情,當zookeeper集群仍需要盡快的恢復以避免當前Active失效而造成的“split-brain”等問題。
4、是否可以在Namenodes之間指定優(yōu)先級?
NO,這是不能支持的。首先啟動的Namenode將作為Active,我們只能認為控制Namenode啟動的順序來做到“優(yōu)先級”。
5、在Automatic Failover中,手動Failover怎么做?
和普通的Failover一樣,我們總是可以通過"hdfs haadmin -DFSHAAdmin -failover"來實現(xiàn)手動Failover。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。