HA工作機制


HA工作機制

HA:高可用(7*24小時不中斷服務) 主要的HA是針對集群的master節點的,即namenode和resourcemanager,畢竟DataNode掛掉之后影響 不是特別大,重啟就好了。

HDFS的HA

HDFS HA功能通過配置Active/Standby兩個NameNodes實現在集群中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一台機器。

兩個namenode,暫且將其標記為active和standby,active為當前工作的機器,standby為替補,直接讓二者之間直接通過網絡通訊同步數據不太穩定,因為網絡一旦斷了,另一邊節點就數據不完整。因此找到一個可靠的第三方,兩個namenode都可以訪問,因此效率高。
這樣Active一直往這個第三方寫數據,standby從這個第三方讀數據就可以了。
我們想要實現的就是,如果active掛掉了,自動通知standby來頂替ative去運行。那么這個時候又需要一個可靠的第三方來負責通知,即ZooKeeper。

首先active在ZooKeeper中注冊一個臨時節點,另一個名稱節點(standby)在ZooKeeper中看到ZooKeeper中有active的這個臨時節點后,知道自己不能再是active節點了,所以現在他自己的角色就是standby,但是它會在ZooKeeper中注冊監聽,它會時刻監聽着active這個節點,一旦active節點掛掉,ZooKeeper中注冊的active就會消失,由於standby注冊了監聽,所以ZooKeeper會在第一時間通知standby節點,“告知”其active節點掛掉了。然后standby節點就“上位”成為active主namenode節點。

其中active其實並不是直接和ZooKeeper溝通,而是通過一個新進程——ZooKeeper客戶端:ZooKeeper Failover controller(Zkfc)來進行溝通。Zkfc負責把主節點namenode的數據(狀態信息)寫入到ZooKeeper中。

那直接讓namenode和ZooKeeper直接通信就好,為什么要加個Zkfc來負責namenode與ZooKeeper的通信呢?因為HA高可用是在hadoop2.x之后出現的,這個時候Hadoop代碼經過多年的迭代,有着較高的健壯性,而如果讓namenode直接和ZooKeeper通信,需要去修改hadoop的代碼,這樣會降低hadoop代碼的健壯性,所以為了不破壞hadoop代碼的健壯性,在hadoop2.x的時代,就單獨寫了個進程:ZooKeeper Failover controller(Zkfc),但是這個進程本質上就是把原來打算讓namenode自己完成的事情單獨寫成了一個進程,所以Zkfc這個進程是和namenode綁定的,換句話說就是,有namenode的地方就有Zkfc。Zkfc維持着active這個namenode和ZooKeeper之間的會話。另一邊standby同理,也是通過另一個Zkfc來維持着standby和ZooKeeper之間的通信。

具體工作過程為:
如果Zkfc檢測到active掛掉,Zkfc會把ZooKeeper中的臨時節點釋放掉,另外一邊standby的Zkfc進程從ZooKeeper服務端接收到active掛掉的通知后,首先強行殺死之前的active節點(ssh kill -9 namenode節點號或者調用用戶自定義的腳本),以防腦裂,然后將standby節點變為active節點。

說完ZooKeeper的通知機制之后,那么,active和standby讀寫數據的第三方是什么呢?

Quorum Journal Manager

大多數日志管理
其管理的就是hadoop的元數據,即edits.log

QJM也是一個集群,該集群也是單數台機器,寫數據的時候也進行投票,其管理的是edits.log這個元數據。

和ZooKeeper集群類似,QJM集群中只要有一半以上的機器就不會掛。

namenode向QJM寫數據的流程:

來一條寫請求,然后寫到edits里面,然后active會把edits寫到
QJM集群里面,QJM這邊同意寫入,active才會將edits寫入,(這里注意:QJM為了提高效率,只要超過半數的機器同意即可寫入,這樣以來QJM集群中不必所有機器都要求同步。)如果沒有HA的時候,hadoop集群中2nn幫助namenode整合Fsimage,如果有了HA之后,就不需要2nn了,standby節點在監聽active節點的同時,standby實時將active寫入QJM集群中的edits讀出到自己的內存中,這樣保證了active一旦掛掉,standby這個節點可以隨時頂上去接替active繼續工作,然后standby定期把內存中的edits合成Fsimage,然后發送給active,所以說standby這個節點比2nn功能更強大,可以代替2nn。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM