【Hadoop】基于QJM的HDFS高可用系列二 - 部署

官方文檔翻譯冯遂,官方鏈接蕊肥。
翻譯水平有限,且以學習為主蛤肌,請諒解和提意見晴埂。
轉(zhuǎn)載請注明出處!Q岸ā儒洛!

接著上一篇發(fā)布的文章繼續(xù)翻譯。這次從部署章節(jié)開始狼速。

部署

配置概述

類似聯(lián)邦的配置琅锻,HA的配置向后兼容,且允許不改變現(xiàn)有的單NameNode配置集群的配置向胡。如此設(shè)計新的配置恼蓬,以致于在集群所有節(jié)點可以使用相同的配置,不需要基于此類型的節(jié)點部署不同的配置文件到不同的機器上僵芹。
像HDFS聯(lián)邦機制一樣处硬,HA集群重用nameservice ID來標識一個單獨的HDFS實例,該實例實際上由多個NameNode組成拇派。另外荷辕,被稱為NameNode ID新的抽象加入到HA凿跳。在集群中每個不同的NameNode都有一個不同的NameNode ID以示區(qū)別。對于所有的NameNode支持單一的配置文件疮方,相關(guān)的配置參數(shù)使用nameservice ID為后綴控嗜,與NameNode ID等同。

配置細節(jié)

配置HA NameNode骡显,必須增加幾個配置項到hdfs-site.xml配置文件中疆栏。
對于你設(shè)置這些配置的順序并不重要,但是對于dfs.nameservices和dfs.ha.namenodes選項所選擇的值是重要的惫谤。[nameservice ID]將決定后面那些配置項的key壁顶。因此,設(shè)置剩下的配置項前溜歪,你將要決定這些值若专。

  • dfs.nameservices - 新的nameservice的邏輯名
    為這個nameservice定義一個邏輯名,例如“mycluster”痹愚,且這個配置項的值即是這個邏輯名。這個名字可以任意定義蛔糯。它將被用于配置和在集群中作為絕對HDFS路徑的認證組件拯腮。
    注意:如果同時使用了HDFS聯(lián)邦機制,這個配置將被設(shè)置成包括其它nameservices蚁飒、HA或其它的一個列表动壤,以逗號分割的列表。
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
  • dfs.ha.namenodes.[nameservice ID] - 對于在nameservice中的每個Namenode的唯一標識
    使用逗號分隔的NameNode ID列表進行配置淮逻。這是DataNode確定集群中所有的NameNode琼懊。例如,如果之前你使用“mycluster”定義了nameservice ID爬早,且可以使用“nn1”和“nn2”作為各自的NameNode ID哼丈,將配置如下:
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>

注意:目前,可以為每個nameservice配置最多兩個NameNode筛严。

  • dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 每個Name Node的RPC地址和監(jiān)聽端口
    對于之前配置的NameNode ID的兩個配置醉旦,設(shè)置全地址和NameNode進程的IPC端口。注意是兩個對立的配置項桨啃。例如:
<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>
  • dfs.namenode.http-address.[nameservice ID].[name node ID] - 每個NameNode的HTTP地址和監(jiān)聽端口
    類似上面RPC地址车胡,設(shè)置NameNode的HTTP服務(wù)的地址和端口號。例如:
<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使用安全特性照瘾,可以為每個NameNode配置HTTPS匈棘。

  • dfs.namenode.shared.edits.dir - 標識JNs(NameNode將讀/寫的編輯記錄存入JNs)組的URI
    JournalNode提供共享編輯存儲,有Active NameNode寫入析命,Standby NameNode讀取且保持更新有Active NameNode作出的所有文件系統(tǒng)的變化主卫,這里配置一個所有JournalNode地址的地址串逃默。雖然必須指定幾個JournalNode地址,僅配置一個URI串队秩。如下形式:
qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*

對于這個nameservice笑旺,這個Journal ID是唯一的標識,允許一個單一的JournalNode集為聯(lián)邦命名系統(tǒng)提供存儲馍资。雖然不是必須的筒主,但是為journal ID重用nameservice ID是個好建議。
例如鸟蟹,對于這個集群JournalNode運行在“node1.example.com”,“node2.example.com”和“node3.example.com”機器上乌妙,且nameservice ID是“mycluster”,可以使用如下的值進行配置建钥。JournalNode默認端口是8485藤韵。

<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
  • dfs.client.failover.proxy.provider.[nameservice ID] - HDFS客戶端聯(lián)系A(chǔ)ctive NameNode的Java類
    配置Java類名,該類將有DFS客戶端使用熊经,決定哪個NameNode是當前Active的泽艘,因此此NameNode是當前正在服務(wù)于客戶端請求。當前Hadoop唯一實現(xiàn)是ConfiguredFailoverProxyProvider镐依,因此使用這個匹涮,除非進行自定。例如:
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
  • dfs.ha.fencing.methods - 腳本或Java類的列表槐壳。在故障轉(zhuǎn)移期間然低,將用于fence這個Active NameNode。
    對于理想狀態(tài)的系統(tǒng)來說务唐,在任意時刻有且僅有一個NameNode是在Active狀態(tài)下雳攘。重要的是,當時用QJM枫笛,永遠僅有一個NameNode將被允許寫入JNs吨灭,因此沒有可能由于腦裂現(xiàn)象破環(huán)文件系統(tǒng)元數(shù)據(jù)。但是刑巧,當故障轉(zhuǎn)移發(fā)生時沃于,原Active NameNode到客戶端的讀請求服務(wù)仍然可能,這可能是過時的海诲,因為直到NameNode停止的這段時間繁莹,NameNode仍嘗試向JNs寫入√蒯#基于這個原因咨演,當時用QJM時仍然需要配置一些fencing方法。然而蚯斯,在fencing機制失敗事件中提高系統(tǒng)可用性薄风。配置一個fencing方法最明智是在fencing方法列表最后確保返回成功饵较。注意如果沒有選擇沒有實際fencing方法,還必須配置一些設(shè)置遭赂,比如:“shell(/bin/true)”循诉。
    fencing方法配置一個以回車分割的列表,將按順序執(zhí)行撇他,直至一個fencing明確返回成功茄猫。hadoop提供兩種方法:shellsshfence。對于自定義fencing方法的實現(xiàn)困肩,參看org.apache.hadoop.ha.NodeFencer類划纽。
    1)sshfence - SSH到Active NameNode并kill掉這個進程
    sshfence選項SSH到目標節(jié)點,使用fuser殺掉在TCP端口監(jiān)聽的服務(wù)進程锌畸。為了可以讓這個fencing選項能夠工作勇劣,必須可以在沒有密碼的情況下,SSH到目標節(jié)點潭枣。因此比默,必須配置一個dfs.ha.fencing.ssh.private-key-files配置項,逗號分隔的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>

可選命咐,可以配置一個非標準帶用戶名和端口執(zhí)行SSH,也可以配置超時蚣抗,單位ms侈百;對于SSH瓮下,fencing方法過時后翰铡,將被認為失敗。配置如下:

<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>

2)shell - 運行一個shell腳本讽坏,fence這個Active NameNode
Shell fencing方法運行一個任意的shell腳本锭魔,配置如下:

<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>

“(”和“)”之間的字符串直接傳遞到bash shell,中間不能包含任何關(guān)閉括號路呜。
shell命令運行在一個包含所有當前Hadoop配置的環(huán)境里迷捧,使用配置鍵時使用'_'替換'.'。
另外胀葱,如下變量引用目標機器執(zhí)行fencing:

變量名 說明
$target_host 被fencing的節(jié)點主機名
$target_port 被fencing的節(jié)點的IPC端口
$target_address 包含上述兩個變量漠秋,形如:host:port
$target_nameserviceid 被fencing的NN的nameservice ID
$target_namenodeid 被fencing的NN的namenode ID

這些環(huán)境變量也可以使用shell命令本身的替換。例如:

<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
</property>

如果shell命令返回退出碼0抵屿,fencing被確定為成功庆锦。如果返回其它退出碼,這個fencing沒有成功轧葛,在列表中的下一個fencing將被執(zhí)行搂抒。
注意:fencing方法沒有實現(xiàn)任何超時艇搀。如果超時是必須的,應(yīng)該在shell腳本中實現(xiàn)(例如通過子shell殺掉父進程的秒數(shù))求晶。

  • fs.defaultFS - 當沒有給定時焰雕,Hadoop FS客戶端使用的默認路徑前綴
    可選,現(xiàn)在可以使用HA邏輯URI配置默認的Hadoop客戶端路徑芳杏。比如之前使用"mycluster"定義的nameservice ID矩屁,定義為HDFS路徑認證部分的值。在core-site.xml文件中形如:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
  • dfs.journalnode.edits.dir - JournalNode進程存儲它的本地狀態(tài)的路徑
    這是在JournalNode節(jié)點機器上的絕對路徑蚜锨,編輯日志和其它本地狀態(tài)將本存儲在這個路徑下档插。可以使用單一路徑作為配置亚再。這些數(shù)據(jù)的冗余是由索格JN提供的郭膛,或者把這個目錄配置在本地的RAID上。例如:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>

部署細節(jié)

在準備好所有必須的配置項后氛悬,必須啟動JournalNode守護進程则剃。使用hadoop-daemon.sh start journalnode命令啟動,并等待每個相關(guān)的機器上的進程啟動完成如捅。
一旦JournalNode已經(jīng)啟動完成棍现,必須初始化同步兩個NameNode在磁盤的元數(shù)據(jù)。

  • 如果是設(shè)置一個新的HDFS集群镜遣,需要首先在其中一個NameNodes運行如下命令:
hdfs namenode -format
  • 如果已經(jīng)格式化了NameNode己肮,或是轉(zhuǎn)換一個非HA集群到HA集群,需要將現(xiàn)有的NameNode元數(shù)據(jù)復(fù)制到其它未格式化的NameNode上悲关,要在未格式化的NameNode運行如下命令:
hdfs namenode -bootstrapStandby

運行該命令谎僻,確保JN(由dfs.namenode.shared.edits.dir作為配置)包含足夠的編輯記錄事務(wù)支持兩個NameNode啟動。

  • 如果轉(zhuǎn)換一個非HA的NameNode成為HA的NameNode寓辱,需要運行如下命令:
hdfs namenode -initializeSharedEdits

這個命令將從本地NameNode編輯記錄目錄初始化JN使用的編輯記錄數(shù)據(jù)艘绍。
現(xiàn)在可以啟動兩個HA的NameNode,就像啟動一般的NameNode秫筏。
可以分別通過配置的HTTP地址訪問每個NameNode的web頁面诱鞠。將注意到配置地址顯示NameNode的HA狀態(tài)('active' 或'standby')。HA的NameNode初始狀態(tài)任何時候都是Standby这敬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末航夺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崔涂,更是在濱河造成了極大的恐慌阳掐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锚烦,居然都是意外死亡觅闽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門涮俄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛉拙,“玉大人,你說我怎么就攤上這事彻亲≡谐” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵苞尝,是天一觀的道長畸肆。 經(jīng)常有香客問我,道長宙址,這世上最難降的妖魔是什么轴脐? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮抡砂,結(jié)果婚禮上大咱,老公的妹妹穿的比我還像新娘。我一直安慰自己注益,他們只是感情好碴巾,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丑搔,像睡著了一般厦瓢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啤月,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天煮仇,我揣著相機與錄音,去河邊找鬼顽冶。 笑死欺抗,一個胖子當著我的面吹牛售碳,可吹牛的內(nèi)容都是我干的强重。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贸人,長吁一口氣:“原來是場噩夢啊……” “哼间景!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艺智,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤倘要,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體封拧,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡志鹃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泽西。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曹铃。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捧杉,靈堂內(nèi)的尸體忽然破棺而出陕见,到底是詐尸還是另有隱情,我是刑警寧澤味抖,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布评甜,位于F島的核電站,受9級特大地震影響仔涩,放射性物質(zhì)發(fā)生泄漏忍坷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一熔脂、第九天 我趴在偏房一處隱蔽的房頂上張望承匣。 院中可真熱鬧,春花似錦锤悄、人聲如沸韧骗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袍暴。三九已至,卻和暖如春隶症,著一層夾襖步出監(jiān)牢的瞬間政模,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工蚂会, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淋样,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓胁住,卻偏偏與公主長得像趁猴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子彪见,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容