【Hadoop】SNN與HA的區別
在Hadoop的最初發布版本,遇到的單點故障及資源的利用率問題,而針對於單點問題,系統是怎麼解決的呢?
H1版本:NameNode+SNN(Secondary NameNode);
H2版本:NameNode+HANameNode;
H3版本:NameNode+NameNode+NameNode;
在H2及以上的版本,通過NameNode的standby的方式,成功的解決了單點問題。以下來看看SNN與HA的工作機制。
先來了解 NameNode 的工作機制
NameNode 用來儲存metadata資訊,主要有兩個部分:
1. fsimage:NN啟動時,對整個檔案系統的快照。
2. edit logs:NN啟動後,對檔案系統的改動序列。
SNN工作機制
1.定時到NN去獲取edit logs,並更新到fsimage上(SNN自己的fsimage)。
2. 一旦SNN有了新的fsimage檔案,它將其拷貝回NN中。
3.NN在下次重啟時會使用這個新的fsimage檔案,從而減少重啟的時間。
SNN解決了fsimage資訊及時同步問題,加速了NameNode的啟動,在遇到故障是,可以加速NameNode 的恢復程式。但是,沒法解決NN掛掉後的接管問題。這就是H1的單點問題。
HA工作機制
Active和Standby兩個NameNode之間的資料互動流程為:
1. NameNode在啟動後,會先載入FSImage檔案和共享目錄上的EditLog Segment檔案;
2. Standby NameNode會啟動EditLogTailer執行緒和StandbyCheckpointer執行緒,正式進入Standby模式;
3. Active NameNode把EditLog提交到JournalNode叢集;
4. Standby NameNode上的EditLogTailer 執行緒定時從JournalNode叢集上同步EditLog;
5. Standby NameNode上的StandbyCheckpointer執行緒定時進行Checkpoint,並將Checkpoint之後的 FSImage檔案上傳到Active NameNode。
(在Hadoop 2.0中不再有Secondary NameNode這個角色了, StandbyCheckpointer執行緒的作用其實是為了替代 Hadoop 1.0版本中的Secondary NameNode的功能)
Active NameNode和Standby NameNode之間是通過一組JournalNode(數量是奇數,可以是3,5,7…,2n+1)來共享資料。Active NameNode把最近的edits檔案寫到2n+1個JournalNode上,只要有n+1個寫入成功就認為這次寫入操作成功了,然後Standby NameNode就可以從JournalNode上讀取了。可以看到,QJM方式有容錯機制,可以容忍n個JournalNode的失敗。
Hadoop HA高可用的NamaNode主備切換
主備NameNode的自動切換需要配置Zookeeper。Active NameNode和Standby NameNode把他們的狀態實時記錄到Zookeeper中,Zookeeper監視他們的狀態變化。當Zookeeper發現Active NameNode掛掉後,會自動把Standby NameNode切換成Active NameNode。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70017085/viewspace-2892907/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hadoop HA叢集 與 開發環境部署Hadoop開發環境
- hadoop1.0 和 Hadoop 2.0 的區別Hadoop
- Hadoop雙namenode配置搭建(HA)Hadoop
- hadoop和spark的區別HadoopSpark
- 4.7 Hadoop+zookeeper實現HAHadoop
- Hadoop-HA節點介紹Hadoop
- Hadoop HA叢集簡單搭建Hadoop
- Hadoop2之NameNode HA詳解Hadoop
- Hadoop 和 GBase 8a 的區別Hadoop
- BigData~03:Hadoop05 ~ HA叢集搭建Hadoop
- hadoop發行版本之間的區別Hadoop
- Q:Spark和Hadoop的架構區別SparkHadoop架構
- hadoop實戰3(web管理介面介紹及NN,DN,SNN介紹)HadoopWeb
- ??與?:的區別
- Hadoop 及Spark 分散式HA執行環境搭建HadoopSpark分散式
- const與static的區別
- HTTP 與 HTTPS 的區別HTTP
- getAttribute() 與 attr() 的區別
- @import與<link> 的區別Import
- Postgresql與MySQL的區別MySql
- HashSet與HashMap的區別HashMap
- HashTable與ConcurrentHashMap的區別HashMap
- maven與ant的區別Maven
- __new()__ 與 __init()__的區別
- @Autowired 與@Resource的區別
- gulp與webpack的區別Web
- free 與 CFRelease 的區別
- post與get的區別
- Git與GitHub的區別Github
- Comparable與Comparator的區別
- volatile與synchronized的區別synchronized
- Javascript中“==”與“===”的區別JavaScript
- ICMP與IGMP的區別
- UDP與TCP的區別UDPTCP
- WebApp與NativeApp的區別WebAPP
- mysql與Oracle的區別MySqlOracle
- Synchronized 與 ReentrantLock 的區別synchronizedReentrantLock
- let與var的區別