您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關hdfs如何保證高可用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
從上圖中我們可以看到,啟動的時候,主備選舉是利用 zookeeper 來實現的, hdfs namenode節點上的 ZKFailoverController 進程, 主要負責控制主備切換,監控 namenode進程是否還活著, 連接 zookeeper進行選舉,并且控制本機的 namenode 的行為,如果發現zookeeper的鎖節點還沒有被搶占創建,就創建鎖節點,并把本機的 namenode 變成 active 節點, 如果發現鎖節點已經創建,就把 本機的namenode變成standby節點。
如果 ZKFailoverController 發現本機的 namenode 已經掛掉了, 就刪除zookeeper上的節點,standby 上的ZKFailoverController感知到刪除事件, 就升級本機的namenode成為主節點。
如果 active節點超過 Zookeeper Session Timeout 參數配置的時間沒有連接 zookeeper, 同樣被認為主節點已經掛了, standby 節點也會升級成為主節點
與單機文件系統相似,HDFS對文件系統的目錄結構也是按照樹狀結構維護,Namespace保存了目錄樹及每個目錄/文件節點的屬性。除在內存常駐外,這部分數據會定期flush到持久化設備上,生成一個新的FsImage文件,方便NameNode發生重啟時,從FsImage及時恢復整個Namespace。
上圖我們可以看到基于 journalnode 進行共享元數據, jounalnode中保存著 editlog,也就是對文件元數據的操作日志,比如用戶(hdfs dfs rm /a.txt)刪除一個文件, 就產生了一條操作日志,作用到命名空間后,a.txt 這個文件就被干掉了,這個日志就類似于數據庫中的 redo 日志, standby節點 周期性的從journalnode中拉取 editlog, 然后從上一次checkpoint的位置開始重放,在內存中將操作結果合并到老的fsimage(命名空間), 并更新checkpoint位置。 最后把合并后的fsimage 上傳到 active namenode 保存替換老的fsimage文件,
NameNode 處于 active和standby狀態時候,扮演的角色是很不同的,
active 角色, 把用戶對命名空間的操作作為 editlog 寫入 journalnode 集群
standby 角色,EditLogTailer 線程 從 journalnode 上拉取 editlog日志, StandbyCheckpointer 線程把 editlog合并到 fsimage, 然后把 fsimage 文件上傳到 active namenode 節點
active 掛的時候, standby 感知后, 轉換為 active 角色, 生成一個新的 epoch(就是每次主備切換就加一, 表明現在誰是老大,在誰的任期內),因為 standby 是階段性拉取 editlog的,所以肯定最新的一段editlog還沒有作用于 fsimage, 需要拉取重放, 因為寫 editlog 到 journal的時候, 只要大多數(比如總5個點,要成功寫入3個點,總共3個點,要成功寫入2個點)寫入成功就認為成功了, 這樣在拉取恢復的時候,各個journalnode 節點上的數據有可能不一致, 這時候就必須找到大多數里面 事務id最大的點作為基準, 這個事務id就類似于數據庫中的 Log sequence number(簡稱LSN), 簡單來講, 就是要把 上一次checkpoint 的(LSN) 到 redo 日志里面最大的 (LSN)這之間的 日志進行重放redo,合并到fsimage。
假設一種情況, 老的active節點,是因為網絡問題,連接不上 zookeeper, 然后被認為已經死了,其實是假死,這時候網絡恢復了, 還認為自己是 leader, 往 journalnode里面寫editlog日志, 發現現在已經是別人的天下了(epoch number已經加1了),自己的epoch number已經過時了,就把自己降級為 standby,做standby 角色該干的事情。
為什么要在 secondnamnode 上合并, 主要是為了減輕 namenode的壓力, namenode有很多其他的事情要干呢。
hadoop-daemon.sh start journalnode, 啟動 journalnode 集群,會根據你配置文件里面配置的機器上去啟動 journalnode 集群
hdfs namenode -format, 格式化 namenode 命名空間
hadoop-daemon.sh start namenode,nn1 上啟動 namenode
hdfs namenode -bootstrapStandby, nn2 同步nn1的元數據信息, 會把主節點上的 fsimage editlog目錄拷貝過來
hadoop-daemon.sh start namenode, nn2 上啟動 namenode
啟動 zk 集群 hdfs zkfc -formatZK 格式化 zkfc zk 中的目錄 hadoop-daemon.sh start zkfc 各個namenode節點上啟動dfszk failover controller, 先在哪臺機器上啟動,哪臺就是active namenode
hadoop-daemon.sh start datanode 上傳文件 測試 讀寫文件
測試 ha 將 active namenode進程kill, jps 進程號, kill, 將active namenode機器斷開網絡 service network stop
我們對集群進行以上的測試, 觀察日志,會發現hdfs干的事情基本上就是前面描寫的流程。
關于“hdfs如何保證高可用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。