2022-11-11
節(jié)點(diǎn) namenode zkfc
什么是HA
HA: High Availability,高可用集群,指的是集群7*24小時(shí)不間斷服務(wù)。
為什么需要HA
在HDFS中,有NameNode、DataNode和SecondaryNameNode角色的分布,客戶端所有的操作都是要與NameNode交互的,同時(shí)整個(gè)集群的命名空間信息也都保存在NameNode節(jié)點(diǎn)。但是,現(xiàn)在的集群配置中只有一個(gè)NameNode,于是就有一個(gè)問(wèn)題: 單點(diǎn)故障
那么,什么是單點(diǎn)故障呢?現(xiàn)在集群中只有一個(gè)NameNode,那么假如這個(gè)NameNode意外宕機(jī)、升級(jí)硬件等,導(dǎo)致NameNode不可用了,整個(gè)集群是不是也就不可用了?這就是單點(diǎn)故障的問(wèn)題。
為了解決這樣的問(wèn)題,就需要高可用集群了。
高可用的備份方式
●主從模式(冷備)
準(zhǔn)備兩臺(tái)服務(wù)器, 準(zhǔn)備相同的程序。 一臺(tái)服務(wù)器對(duì)外提供服務(wù), 稱為主節(jié)點(diǎn)(Active節(jié)點(diǎn)); 另外一臺(tái)服務(wù)器平時(shí)不對(duì)外提供服務(wù), 主要負(fù)責(zé)和Active節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)的同步, 稱為備份節(jié)點(diǎn)(Standby節(jié)點(diǎn)). 當(dāng)主節(jié)點(diǎn)出現(xiàn)故障, Standby節(jié)點(diǎn)可以自動(dòng)提升為Active節(jié)點(diǎn), 對(duì)外提供服務(wù)。 ZooKeeper實(shí)現(xiàn)的集群高可用, 采用的就是這種模式。
我作為一個(gè)班級(jí)的講師,在班級(jí)負(fù)責(zé)授課的工作。如果我有一天生病請(qǐng)假了,是不是咱們班級(jí)就得自習(xí)一天了?為了解決這樣的問(wèn)題,教學(xué)部安排另外一個(gè)講師,每天跟著我。我上課講課,他就在旁邊聽著;我上課提問(wèn)問(wèn)題,他就在旁邊看著;我去吃飯,他也在旁邊跟著;我去上個(gè)廁所,他也在跟著!做為我的一個(gè)影子存在著。由于這個(gè)同時(shí)每天都會(huì)跟著我,因此我的一言一行,講了什么內(nèi)容,留了什么作業(yè),吃了什么飯,抽了幾根煙,他都知道!那么,如果有一天我生病請(qǐng)假了,他是不是就可以直接替代我為班級(jí)上課呢?
●雙主互備(熱備)(了解)
準(zhǔn)備兩臺(tái)服務(wù)器, 準(zhǔn)備相同的程序. 同時(shí)對(duì)外提供服務(wù)(此時(shí), 這兩臺(tái)服務(wù)器彼此為對(duì)方的備份), 這樣, 當(dāng)一臺(tái)節(jié)點(diǎn)宕機(jī)的時(shí)候, 另外一臺(tái)節(jié)點(diǎn)還可以繼續(xù)提供服務(wù).
小明到肯德基吃飯,找服務(wù)員點(diǎn)餐,這是正常的流程。但是,如果服務(wù)員只有一個(gè),并且恰好生病了,那么小明是不是將沒(méi)有辦法正常點(diǎn)餐了。為了解決這個(gè)問(wèn)題,肯德基雇了兩個(gè)服務(wù)員,同時(shí)提供服務(wù),這樣一個(gè)服務(wù)員出問(wèn)題了,另外一個(gè)服務(wù)員依然可以提供服務(wù)。
●集群多備(了解)
基本上等同于雙主互備, 區(qū)別就在于同時(shí)對(duì)外提供服務(wù)的節(jié)點(diǎn)數(shù)量更多, 備份數(shù)量更多 肯德基覺(jué)得兩個(gè)服務(wù)員也不保險(xiǎn),有兩個(gè)同時(shí)生病的可能性,于是又多雇了幾個(gè)服務(wù)員。
高可用的實(shí)現(xiàn)
我們?cè)谶@里采用的是主從模式的備份方式,也就是準(zhǔn)備兩個(gè)NameNode,一個(gè)對(duì)外提供服務(wù),稱為Active節(jié)點(diǎn);另外一個(gè)不對(duì)外提供服務(wù),只是實(shí)時(shí)的同步Active節(jié)點(diǎn)的數(shù)據(jù),稱為Standby的節(jié)點(diǎn)。
為了提供快速的故障轉(zhuǎn)移,Standby節(jié)點(diǎn)還必須具有集群中塊位置的最新信息。為了實(shí)現(xiàn)這一點(diǎn),DataNodes被配置了兩個(gè)NameNodes的位置,并向兩者發(fā)送塊位置信息和心跳信號(hào)。也就是說(shuō),DataNode同時(shí)向兩個(gè)NameNode心跳反饋。
高可用架構(gòu)圖
ZN1ZN3ZN2ZKFAILOVERCONTROLLERZKFAILOVERCONTROLLERZKFCZKFCJN3JN1JN2NN1NN2STANDBYACTIVEDN2DN3DN1
JournalNode
●JournalNode的功能
Hadoop2.x版本之后, Clouera提出了QJM/QuromJournal Manager, 這是一個(gè)基于Paxos算法實(shí)現(xiàn)的HA的實(shí)現(xiàn)方案 1. 基本的原理就是使用2N+1臺(tái)JN存儲(chǔ)EditLog, 每次寫入數(shù)據(jù)的時(shí)候, 有半數(shù)以上的JN返回成功的信息, 就表示本次的操作已經(jīng)同步到了JN 2. 在HA中, SecondaryNameNode這個(gè)角色已經(jīng)不存在了, 保證Standby節(jié)點(diǎn)的元數(shù)據(jù)信息與Active節(jié)點(diǎn)的元數(shù)據(jù)信息一致, 需要通過(guò)若干個(gè)JN 3. 當(dāng)有任何的操作發(fā)生在Active節(jié)點(diǎn)上的時(shí)候, JN會(huì)記錄這些操作到半數(shù)以上的節(jié)點(diǎn)中. Standby節(jié)點(diǎn)檢測(cè)JN中的log日志文件發(fā)生了變化, 會(huì)讀取JN中的數(shù)據(jù)到自己的內(nèi)存中, 維護(hù)最新的目錄樹結(jié)構(gòu)與元數(shù)據(jù)信息 4. 當(dāng)發(fā)生故障的時(shí)候, Active節(jié)點(diǎn)掛掉, 此時(shí)Standby節(jié)點(diǎn)在成為新的Active節(jié)點(diǎn)之前, 會(huì)將讀取到的EditLog文件在自己的內(nèi)存中進(jìn)行推演, 得到最新的目錄樹結(jié)構(gòu). 此時(shí)再升為Active節(jié)點(diǎn), 可以無(wú)縫的繼續(xù)對(duì)外提供服務(wù).
●防止腦裂的發(fā)生
對(duì)于HA群集的正確操作至關(guān)重要,一次只能有一個(gè)NameNode處于Active狀態(tài)。否則,名稱空間狀態(tài)將在兩者之間迅速分散,從而有數(shù)據(jù)丟失或其他不正確結(jié)果的風(fēng)險(xiǎn)。為了確保該屬性并防止所謂的“裂腦情況”,JournalNode將一次僅允許單個(gè)NameNode成為作者。在故障轉(zhuǎn)移期間,變?yōu)榛顒?dòng)狀態(tài)的NameNode將僅承擔(dān)寫入JournalNodes的角色,這將有效地防止另一個(gè)NameNode繼續(xù)處于活動(dòng)狀態(tài),從而使新的Active可以安全地進(jìn)行故障轉(zhuǎn)移。 - 怎么理解腦裂? 就是Active節(jié)點(diǎn)處于網(wǎng)絡(luò)震蕩狀態(tài),假死狀態(tài),Standby就轉(zhuǎn)為Active。等網(wǎng)絡(luò)震蕩過(guò)后,就有兩個(gè)Active了,這就是腦裂。
●JournalNode集群正常工作的條件
- 至少3個(gè)Journalnode節(jié)點(diǎn) - 運(yùn)行個(gè)數(shù)建議奇數(shù)個(gè)(3,5,7等) - 滿足(n+1)/2個(gè)以上,才能正常服務(wù)。即能容忍(n-1)/2個(gè)故障。
●JournalNode的缺點(diǎn)
在這種模式下,即使活動(dòng)節(jié)點(diǎn)發(fā)生故障,系統(tǒng)也不會(huì)自動(dòng)觸發(fā)從活動(dòng)NameNode到備用NameNode的故障轉(zhuǎn)移,必須需要人為的操作才行。要是有一個(gè)能監(jiān)視Active節(jié)點(diǎn)的服務(wù)功能就好了。 這個(gè)時(shí)候,我們就可以使用zookeeper集群服務(wù),來(lái)幫助我們進(jìn)行自動(dòng)容災(zāi)了。
自動(dòng)容災(zāi)原理
如果想進(jìn)行HA的自動(dòng)故障轉(zhuǎn)移,那么需要為HDFS部署兩個(gè)新組件:ZooKeeper quorum和ZKFailoverController進(jìn)程(縮寫為ZKFC)
Zookeeper quorum
Apache ZooKeeper是一項(xiàng)高可用性服務(wù),用于維護(hù)少量的協(xié)調(diào)數(shù)據(jù),將數(shù)據(jù)中的更改通知客戶端并監(jiān)視客戶端的故障。HDFS自動(dòng)故障轉(zhuǎn)移的實(shí)現(xiàn)依賴ZooKeeper進(jìn)行以下操作:
- 故障檢測(cè) 集群中的每個(gè)NameNode計(jì)算機(jī)都在ZooKeeper中維護(hù)一個(gè)持久性會(huì)話。如果計(jì)算機(jī)崩潰,則ZooKeeper會(huì)話將終止,通知另一個(gè)NameNode應(yīng)觸發(fā)故障轉(zhuǎn)移。 - 活動(dòng)的NameNode選舉(HA的第一次啟動(dòng)) ZooKeeper提供了一種簡(jiǎn)單的機(jī)制來(lái)專門選舉一個(gè)節(jié)點(diǎn)為活動(dòng)的節(jié)點(diǎn)。如果當(dāng)前活動(dòng)的NameNode崩潰,則另一個(gè)節(jié)點(diǎn)可能會(huì)在ZooKeeper中采取特殊的排他鎖,指示它應(yīng)成為下一個(gè)活動(dòng)的NameNode。
ZKFC
ZKFailoverController(ZKFC)是一個(gè)新組件,它是一個(gè)ZooKeeper客戶端,它監(jiān)視和管理namenode的狀態(tài)。運(yùn)行namenode的每臺(tái)機(jī)器都會(huì)運(yùn)行一個(gè)ZKFC,該ZKFC負(fù)責(zé)以下內(nèi)容:
- 運(yùn)行狀況監(jiān)視 ZKFC使用運(yùn)行狀況檢查命令定期ping其本地NameNode。只要NameNode以健康狀態(tài)及時(shí)響應(yīng),ZKFC就會(huì)認(rèn)為該節(jié)點(diǎn)是健康的。如果節(jié)點(diǎn)崩潰,凍結(jié)或以其他方式進(jìn)入不正常狀態(tài),則運(yùn)行狀況監(jiān)視器將其標(biāo)記為不正常。 - ZooKeeper會(huì)話管理 當(dāng)本地NameNode運(yùn)行狀況良好時(shí),ZKFC會(huì)在ZooKeeper中保持打開的會(huì)話。如果本地NameNode處于活動(dòng)狀態(tài),則它還將持有一個(gè)特殊的“鎖定” znode。該鎖使用ZooKeeper對(duì)“臨時(shí)”節(jié)點(diǎn)的支持。如果會(huì)話到期,則鎖定節(jié)點(diǎn)將被自動(dòng)刪除。 - 基于ZooKeeper的選舉 如果本地NameNode運(yùn)行狀況良好,并且ZKFC看到當(dāng)前沒(méi)有其他節(jié)點(diǎn)持有鎖znode,則它本身將嘗試獲取該鎖。如果成功,則它“贏得了選舉”,并負(fù)責(zé)運(yùn)行故障轉(zhuǎn)移以使其本地NameNode處于活動(dòng)狀態(tài)。故障轉(zhuǎn)移過(guò)程類似于上述的手動(dòng)故障轉(zhuǎn)移:首先,如有必要,將先前的活動(dòng)節(jié)點(diǎn)隔離,然后將本地NameNode轉(zhuǎn)換為活動(dòng)狀態(tài)。
自動(dòng)容災(zāi)的過(guò)程描述
ZKFC(是一個(gè)進(jìn)程,和NN在同一個(gè)物理節(jié)點(diǎn)上)有兩只手,分別拽著NN和Zookeeper。(監(jiān)控NameNode健康狀態(tài),并向Zookeeper注冊(cè)NameNode);集群一啟動(dòng),2個(gè)NN誰(shuí)是Active?誰(shuí)又是Standby呢? 2個(gè)ZKFC先判斷自己的NN是否健康,如果健康,2個(gè)ZKFC會(huì)向zoopkeeper集群搶著創(chuàng)建一個(gè)節(jié)點(diǎn),結(jié)果就是只有1個(gè)會(huì)最終創(chuàng)建成功,從而決定active地位和standby位置。如果ZKFC1搶到了節(jié)點(diǎn),ZKFC2沒(méi)有搶到,ZKFC2也會(huì)監(jiān)控watch這個(gè)節(jié)點(diǎn)。如果ZKFC1的Active NN異常退出,ZKFC1最先知道,就訪問(wèn)ZK,ZK就會(huì)把曾經(jīng)創(chuàng)建的節(jié)點(diǎn)刪掉。刪除節(jié)點(diǎn)就是一個(gè)事件,誰(shuí)監(jiān)控這個(gè)節(jié)點(diǎn),就會(huì)調(diào)用callback回調(diào),ZKFC2就會(huì)把自己的地位上升到active,但在此之前要先確認(rèn)ZKFC1的節(jié)點(diǎn)是否真的掛掉?這就引入了第三只手的概念。 ZKFC2通過(guò)ssh遠(yuǎn)程連接NN1嘗試對(duì)方降級(jí),判斷對(duì)方是否掛了。確認(rèn)真的不健康,才會(huì)真的 上升地位之a(chǎn)ctive。所以ZKFC2的步驟是: 1.創(chuàng)建新節(jié)點(diǎn)。 2.第三只手把對(duì)方降級(jí)。 3.把自己升級(jí) 那如果NN都沒(méi)毛病,ZKFC掛掉了呢?Zoopkeeper有一個(gè)客戶端session機(jī)制,集群?jiǎn)?dòng)之后,2個(gè)ZKFC除了監(jiān)控自己的NN,還要和Zoopkeeper建立一個(gè)tcp長(zhǎng)連接,并各自獲取自己的session。只要一方的session失效,Zoopkeeper 就會(huì)刪除該方創(chuàng)建的節(jié)點(diǎn),同時(shí)另一方創(chuàng)建節(jié)點(diǎn),上升地位。
開班時(shí)間:2021-04-12(深圳)
開班盛況開班時(shí)間:2021-05-17(北京)
開班盛況開班時(shí)間:2021-03-22(杭州)
開班盛況開班時(shí)間:2021-04-26(北京)
開班盛況開班時(shí)間:2021-05-10(北京)
開班盛況開班時(shí)間:2021-02-22(北京)
開班盛況開班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開班時(shí)間:2020-09-21(上海)
開班盛況開班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開班時(shí)間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)