Hadoop NameNode單點問題解決方案之一 AvatarNode

原文:http://weilaiyxj.iteye.com/blog/979003

翻譯自Facebook Hadoop架構師(Dhruba Borthakur)的一篇文章 

我們遇到的情況 
Hadoop NameNode存在單點問題。這個問題會影響分佈式平臺24*7運行。先說說我們的情況吧。 
我們的團隊負責管理一個1200節點的集羣(總大小12PB),目前是運行版本爲Hadoop 0.20,transaction logs寫入一個共享的NFS filer(注:NetApp NFS Filer)。 
經常遇到需要中斷服務的問題是給hadoop打補丁。 DataNode打補丁比較簡單,不會造成服務中斷,每次對其中的一部分DataNode部署新的代碼、重啓,就OK了。 問題是需要給NameNode部署新的代碼時,NodeNode重啓需要花費1個小時,這期間所有的Hadoop服務都不能運行。這是不可忍受的,所以我們就想着把NameNode有個備份。我們的解決方案可以保證在1分鐘內切換完成。  

當時HDFS BackupNode在Hadoop 0.20中還不能用,升級Hadoop 0.20也不是一個很好的選擇。這個升級部署之前,需要花費大量時間做測試。 
經過仔細的分析現狀和可能的解決方案。我們設計了一個簡單的解決方案: 
  a. 目前我們有兩個NameNode 一個Primary NameNode和一個Standby Nodenode,我們不用擔心split-brain-scenario(可以想想精神分裂) 和 IO-fencing(這個名詞不太瞭解)。OP能保證Primary NameNode完全down後,Standby NameNode才能被切換。 
  b. 我們不想修改NameNode的任何代碼,只想基於HDFS構建一個軟件層來保證HA。我們需要一個deamon來切換Primary和Standby. 
詞語“Avatar”的意思是實體的變體,所以借用這個詞,把NameNode的wrapper稱爲AvatarNode。AvatarNode完全繼承NameNode,所以NameNode的優點它都完全具備。 


AvatarNode介紹 

AvatarNode完全封裝NameNode。AvatarNode運行有兩種模式Primary Avatar或者standby Avatar. 如果啓動運行在Primary Avatar模式,那麼它就和當前NameNode功能完全一樣,其實運行的代碼就是NameNode的代碼。運行Primary Avatar模式的AvatarNode機器,保存HDFS事務日誌(editlog)到一個共享的NFS。在另外一臺機器上,啓動AvatarNode的另一個實例,運行在Standby Avatar模式。 
Standby AvatarNode封裝了NameNode和SecondaryNameNode。Standby AvatarNode持續的從共享的NFS filer中讀取HDFS editlog,並持續的把這些事務推送到Standby AvatarNode中NameNode實例。Standby AvatarNode中的NameNode運行在SafeMode。原因是不能讓它負責NameNode的工作,但是必須保持和NameNode同步的NameNode Metadata信息。 

HDFS客戶端訪問NameNode通過一個虛擬IP(Virtual IP Address,注:這塊其實可以用zookeeper來取代).當發生故障需要快速切換時,管理員會在機器M1上殺掉Primary AvatarNode進程,然後在機器M2上設置Standby AvatarNode作爲Primary Avatar。Standby AvatarNode會保證把所有提交的事務都處理完,因爲Standby AvatarNode會重新打開edit log,並處理完文件中所有的事務.這個假設是基於NFS-v3支持close-to-open cache coherency semantics。Standby AvatarNode把所有NFS filer上的事務處理完之後,退出SafeMode模式。管理員將M2的VIP換爲M1,這樣所有的HDFS客戶端的請求會提交到M2的實例上。這個failover一般情況只需要幾秒鐘。 
另外根本不需要單獨一臺SecondaryNameNode。 AvatarNode在Standby avatar模式時,可以履行SecondaryNameNode的職責。Standby AvatarNode持續的處理從Primary Avantar來的所有的事務,在處理事務日誌的空閒間隙會喚醒SecondaryNameNode進程,創建並上傳一個新的checkpoint,Copy到Primary AvatarNode, 接着再回來處理事務日誌。 

AvatarDataNode介紹
 

AvatarDataNode基於Hadoop 0.20中DataNode。AvatarDataNode需要發送block報告和block接受報告到兩個AvatarNode。AvatarDataNode不使用VIP和AvatarNode連接。(HDFS客戶端通過VIP連接AvatarNode)。另一個可選方 案是,Primary AvatarNode轉發block reports到Standby AvatarNode。沒有采用可選方案是因爲這種方法需要添加複雜代碼到Primary AvatarNode,Primary AvatarNode需要對block reports進行緩存和控制部分流 
Hadoop DataNode已經具備發送blockReceived信息到NameNode功能,我們擴展了這個功能使得發送這個消息到兩個節點(Primary and Standby AvatarNodes)。 


這個方案在切換過程中對於客戶端的影響 

HDFS客戶端讀取一個文件時,它會首先取得所有的文件塊以及copy的位置並緩存起來,這樣的話這個方案不會影響HDFS讀操作。 
當HDFS客戶端寫文件時failover發生會有什麼後果呢? 
Hadoop 0.20 NameNode的策略是當文件寫完成,關閉後纔會將新分配的塊記錄到metadata。這表明當failover發生的時候,正在寫文件會在failover成功之後拋出IO exception錯誤,這個使用了Map/Reduce的容錯能力,框架會重做任何失敗的任務。這中解決方案在HBase中也不回出問題,因爲Hbase在一個事務完成之後要有sync/hflush操作。由於map/reduce框架和Hbase的策略,使得failover事件也不會影響HDFS的寫操作。 

其他的HA方案 

大家說讓我比較一下AvatarNode HA實現和Hadoop with DRBD and Linux HA.這兩種方法都是需要主節點寫事務日誌到一個共享的硬件。不同點是,Standby AvatarNode是一個熱備而DRBD-LinuxHA是一種冷備份。AvatarNode對於5億文件的failover時間是1分鐘,但是DRBD-LinuxHA可能需要一個小時。AvatarNode可以熱備的原因就是它封裝了一個NameNode的實例並且這個實例會從DataNode接受信息,這使得metadata的狀態是最新的。 


代碼參見HDFS-976. (前提條件HDFS-966) 

注: 
1. Blog地址: http://hadoopblog.blogspot.com/2010/02/hadoop-namenode-high-availability.html 

2. 最新代碼參見: 
https://github.com/facebook/hadoop-20-warehouse/tree/master/src/contrib/highavailability 

3. Dhruba回答的部分問題 
Dhruba關於NameNode啓動過程所需要時間的一個參考: 
our clyster has 2000 nodes. The fsimage is about 12 GB(70 million files and directories). The cluster has a total of around 90 milliosn blocks. It takes about 6 minutes to read and process the fsimage file. Then it takes another 35 minutes to process block reports from all datanodes. 

AvatarNode和ZooKeeper整合(解決VIP問題) 
We are in the process of open-sourcing the AvatarNode integration with zookeeper. We will post this patch as part of HDFS-976 very soon. 

有關NFS延遲 
I agree that NFS is not the fastest way to read/access that transaction log. However, it is not really NFS but rather the NFS implementation that could be an issue. We use a NetApp NFS Filer and the filer's uptime and latencies are hard to beat! Also, we depend on NFS close-to-open cache coherency semantics: http://nfs.sourceforge.net/ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章