前言
hdfs對于超大文件具有超優(yōu)越的性能孝宗,這篇來看看hdfs架構(gòu)和他的高可用性基礎(chǔ),畢竟不知道原理的程序員不是好的程序箱叁。
架構(gòu)概念
namenode
從圖中可以看出,namenode是一個管理者仲翎,namenode包含了元數(shù)據(jù)和datanode存儲的數(shù)據(jù)塊的id甘磨,我們展開聯(lián)想,他就是武俠小說里那個知道事件背后的所有的秘密的人物患整,client就像是主人公拜效,每次想知道秘密都必須去詢問這個namenode。namenode本身是沒有數(shù)據(jù)的各谚,所有的數(shù)據(jù)都在datanode紧憾。namenode為了給客戶端提供良好的服務(wù),所以在內(nèi)存中也存儲了一份元數(shù)據(jù)和datanode存儲的數(shù)據(jù)塊的id昌渤。datanode
datanode就是真正的數(shù)據(jù)儲藏室赴穗,是真的數(shù)據(jù)存放的地方。hdfs面對超大文件是把大文件切割成小塊存儲膀息,所以datanode就是存儲這些小塊的地方般眉。namenode的掌控力
namenode為什么可以知道datanode的存儲了那些數(shù)據(jù)?也就是datanode與namenode之間如何的通信潜支?答案就是心跳甸赃。datanode定時會像namenode發(fā)出心跳,保證數(shù)據(jù)存儲信息同步到namenode冗酿。
架構(gòu)的危機
正如武俠小說中那個知道的秘密的人被兇手殺了埠对,一切的線索就斷了那樣络断,namenode掛了,或者namenode的數(shù)據(jù)丟失了项玛,整個hdfs就會癱瘓了妓羊。
怎么樣當(dāng)namenode掛了的時候保證hdfs的可用性
舉個例子,年事已高的皇帝稍计,為了自己百年之后國家不會大動亂躁绸,會提前立一個太子。所以這里其實是同理臣嚣,找一個替身净刮,當(dāng)namenode掛了之后,替身繼續(xù)工作硅则,這就是SecondNameNode進程淹父,在前面配置偽分布式測試環(huán)境的時候大家使用jps都會看到這個進程。那么問題來了怎虫,SecondNameNode怎么知道NameNode掛了暑认?想法如下:
- 第一種想法:心跳機制
就像太子每天去看看皇帝掛了沒有一樣,SecondNameNode定時去ping一下NameNode看看掛了沒大审。
不足之處:由于可能是網(wǎng)絡(luò)鏈路原因?qū)е滦奶煌ㄕ杭剩赃@個方法不是太可行。
- 第二種想法:磁盤心跳
就是皇帝有一個愛妃徒扶,皇帝每天都見她粮彤,然后他和太子有勾結(jié),然后太子就知道了皇帝掛了沒(太污了)姜骡。這里其實就是NameNode每天都會在磁盤上做一個標(biāo)記导坟,比如是當(dāng)前存活的時間,SecondNameNode也去這個磁盤上讀這個標(biāo)記圈澈,然后這個標(biāo)記存在而且時間不是特別久遠惫周,就認為NameNode還活著。
不足之處:愛妃掛了康栈,那么整個機器就掛了递递。
- 第三種想法:第三方的仲裁
這種方式就是太子沒有任何野心,每天等啊等啊等谅将,直到有一天朝中的幾個重臣宣讀皇帝遺旨漾狼,這時候太子上位。這里用的是ZooKeeper饥臂,這個有時間了再講ZooKeeper這個分布式神器逊躁。
怎么保證hdfs中namenode的數(shù)據(jù)不丟失
答案還是冗余,將namenode的數(shù)據(jù)放在三個節(jié)點上隅熙,三個節(jié)點同時丟失的概率就很小了稽煤。
那么現(xiàn)在整體的架構(gòu)就演變成為:
結(jié)束語
思想真的是想通的核芽,保證數(shù)據(jù)可靠性不丟失永遠是冗余,無非就是直接備份與使用一些算法減少冗余產(chǎn)生的數(shù)據(jù)的體積酵熙。這里的實時通信依舊是心跳轧简,還有判斷掛了沒就是第三方仲裁。