被這個問題困擾很久,網上也查不到類似的問題;因此記錄下來希望幫到其他小伙伴
當然也是因為我話多/困擾太久/解決后太興奮/想嘚瑟/想鍛煉下表述能力/加深理解/整理思路/記性太差怕忘記等諸多原因。。。
第一次寫,寫得不好還請見諒(當然這是我的托辭,下次要是還寫不好我也能找出其他理由)
另外,如果有錯誤或表述不清的地方還請指正;
所以我們現在開始正題:
hadoop集群結構:
Cluser結構;兩臺namenode;一主一備
使用JournalNode+zookeeper(※)實現HA
※:
JournalNode:
用于同步namenode(active&standby)間的數據;
Zookeeper:
用于監控namenode狀態;若發現active節點異常;則將standby狀態切換到active狀態
錯誤現象:
將主備namenode都啟動;kill掉active機上的namenode進程后;standby主機的狀態并沒有變成active
即active節點崩壞后,standby并沒有被自動切換為active
調查過程:
首先想到可能是負責實現HA的以下兩個應用出了問題:
1)JournalNode(比如某些原因導致standby無法獲得active的數據)
2)Zookeeper
于是清空hadoop安裝目錄下的日志;重現了一下錯誤現象;
1)hadoop安裝目錄下并無日志產生(active和standby均沒有)
因此可以排除是journalnode同步失敗引起(journalnode同步有錯的話會報在該日志中)
2)zookeeper下沒有事務日志產生
(PS:事務日志產生在配置文件zoo.cfgd的dataLogDir下,而安裝目錄下的log中產生的是運行日志);
3)輸入命令zkCli.sh連接zookeeper Server命令行輸入ls /,確認是否有hadoop ha目錄生成(--有)
4)2),3)可以排除故障并非zookeeper不作為引起
調查陷入膠著狀態;
于是轉而繼續研究hadoop HA的實現原理,希望能獲得些思路;
調查過程中發現hadoop進行HA切換時會有一種避免腦裂(brain split)的機制:
以下援引博客中查到的相關信息:
[4.如何在狀態切換時避免brain split(腦裂)?
腦裂:active namenode工作不正常后,zkfc在zookeeper中寫入一些數據,表明異常,這時standby namenode中的zkfc讀到異常信息,并將standby節點置為active。但是,如果之前的active namenode并沒有真的死掉,出現了假死(死了一會兒后又正常了,哈哈,是不是很搞笑),這樣,就有兩臺namenode同時工作了。這種現象稱為腦裂。
解決方案:standby namenode感知到主用節點出現異常后并不會立即切換狀態,zkfc會首先通過ssh遠程殺死active節點的 namenode進程(kill -9 進程號)。但是(這樣還不行,驚訝),如果kill指令沒有執行成功咋辦??如果在一段時間內沒有收到執行成功的回執,standby節點會執行一個自定義腳本,盡量保證不會出現腦裂問題!這個機制在hadoop中稱為fencing(包括ssh發送kill指令,執行自定義腳本兩道保障)]
從解決方案中可知;當發生active節點崩壞時;hadoop會進行以下兩個操作:
1)通過ssh kill掉active節點的namenode進程
2)執行自定義腳本
于是查看目前hadoop集群的配置文件hdfs-site.xml中相關屬性
dfs.ha.fencing.methods
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
只配置上述解決方案中的2)自定義腳本;于是猜測是否為缺少ssh相關配置;導致防腦裂機制的流程有誤因此standby沒有被拉起來
于是追加了ssh相關設置:
重新進行kill active上的namenode試驗;成功;
active掛掉后standby可自動被拉起成active節點;實現了高可用性
呃……當然為什么這么修改之后問題就解決了;究竟后臺運作是什么機制,是不是就如同我的設想其實我也不是特別明白。。。
但可以肯定的是問題點就在這里;重新配置后問題解決了。。。。。
有知道的小伙伴還請不吝指教~