[HDFS Manual] CH4 HDFS High Availability Using the Quorum Journal Manager

来源:https://www.cnblogs.com/Amaranthus/archive/2018/03/22/8622941.html
-Advertisement-
Play Games

HDFS High Availability Using the Quorum Journal Manager HDFS High Availability Using the Quorum Journal Manager. 1 4.1 目的... 1 4.2 Note: Using the Quo ...


HDFS High Availability Using the Quorum Journal Manager

HDFS High Availability Using the Quorum Journal Manager. 1

4.1 目的... 1

4.2 Note: Using the Quorum Journal Manager or Conventional Shared Storage. 2

4.3 background. 2

4.4結構體系... 2

4.5 硬體資源... 2

4.6 部署... 3

4.6.1 配置概述... 3

4.6.2 詳細配置... 3

4.6.3 部署細節... 6

4.6.4 管理命令... 6

4.7 自動切換... 7

4.7.1 說明... 7

4.7.2 組件... 7

4.7.3 部署Zookeeper. 8

4.7.4 開始配置前... 8

4.7.5 配置自動故障轉移... 8

4.7.6 初始化Zookeeper中的HA狀態... 9

4.7.7 啟動start-dfs.sh. 9

4.7.8 手動啟動cluster. 9

4.7.9 Zookeeper安全訪問... 9

4.7.10 驗證自動failover. 10

4.8 自動故障轉移FAQ.. 10

4.9 啟動HAHDFS Upgrade/Finalization/Rollback. 11

 

4.1 目的

這個手冊的目的是對HDFS HA的概述,和如何配置和管理HA HDFS集群,使用Quorum Journal Manager(QJM)特性。

4.2 Note: Using the Quorum Journal Manager or Conventional Shared Storage

這裡討論如何配置和使用 QJM配置HDFS HA。使用QJMstandbyactivenamenode共用edit logHDFS HA可以使用NFS。可以查看this alternative guide.

4.3 background

之前的hadoop 2.0.0,namendeHDFS集群是單點錯誤(SPOF),如果機器或者進程不可用,整個cluster就變的不可用。

影響HDFS可用性主要有2個方面:

·         機器crash,整個namenode都不可用,整個集群就不可用。

·         計劃的維護,在namenode設備上,軟體和硬體的更新。

HDFS高可用功能可以解決以上問題。這個功能允許namenode 的機器crash的時候快速的進行切換,或者由管理員發起的切換。

4.4結構體系

在典型的HA集群,2個或者多個機器被配置為了namenode。時間點內,只有一個active狀態的namenode,其他都是standby的。Active namenode為所有client服務。Standby在需要的時候只用來做failover

為了讓standby node保持與active node同步狀態,node使用獨立的守護進程JournalNodes來交流。當任何namespace修改都是在active node上。然後會修改到多數的JNsStandby node可以從JNs中讀取editlog,並且不斷查看editlog的修改。Standby node會查看edit,然後應用到自己的namespace。如果failoverstandby會保證已經讀取了所有的editlog。保證namespacefailover之前被完全同步。

為了提供最快的failoverstandby node必須有集群block中最新的信息。為了達到,namenode被配置為location在所有的namenode,並且block location信息和心跳會發送到所有的namenode

Namenode一個時間內只能有一個active,為了避免出現腦裂JouralNodes只允許一個namenode寫入。在failover時,namenode會變成active也會替換寫入JournalNodes的角色,這樣可以防止其他namenode變成active,讓新的active進行安全的切換。

4.5 硬體資源

為了部署HA集群,你需要準備一下:

·         Namenode設備,activestandby namenode需要有一樣的設備

·         JournalNode設備,JournalNode是比較輕量的,可以和其他hadoop進程一起存在。Node:至少要有3JournalNode進程,因為edit log修改會要求寫入多數JNs。允許系統去相容單點故障。一般都適用3個進程,也可以增加,從而增加容錯。

HA集群中,standbynamenode也會執行checkpoint,因此不需要secondary nodebackup nodecheckpoint node

4.6 部署

4.6.1 配置概述

配置類似於namenode聯合,HA的允許配置已經存在的單個namenode繼續工作不需要修改。新的配置被設計成,所有clusternode都有一樣的配置,不需要為不通的設備配置不通的配置文件。

HDFS聯合一樣,HA集群使用nameserivce ID來識別一個HDFS實例,也可能是一個多個Namenode HA。另外一個新的抽象Namenode IDHA中被使用。每個不通的Namenode有一個不通的namenode id來分別。為了支持一個配置文件到處使用,有些配置使用nameservice id或者namenode id尾碼。

4.6.2 詳細配置

為了配置namenode HA,你必須增加一些選項在hdfs-site.xml裡面

這些配置的順序是不重要的,但是dfs.nameservicesdfs.ha.namenodes.[nameservice ID]的值是比較重要的。因此你需要知道這些值,才能配置後面的參數:

·         Dfs.nameservices 新的nameservice的邏輯名
nameservice選擇一個邏輯名,比如mycluster,並且使用這個邏輯名,完成後面的配置。這個名字是任意的。會用來配置和HDFS絕對路徑的組件。
註意,如果你也使用HDFS聯合,那這個配置要包含其他的namespaceHA等,使用逗號分隔。
<property>
<name>dfs.nameservices</name>
 <value>mycluster</value>
</property>

·         dfs.ha.namenodes.[nameservice ID] 用來唯一標識nameservice中的namenode
使用逗號來分割,可以讓datanode確定所有的集群中的namenode,比如你使用mycluster作為nameservice ID,使用nn1,nn2,nn3標識namenode
<property>  <name>dfs.ha.namenodes.mycluster</name>  <value>nn1,nn2, nn3</value></property>
註意:namenode的最小數量是2,但是可以配置的更多,但是不建議超過5個,推薦3個,因為有交互的壓力。

·         dfs.namenode.rpc-address.[nameservice ID].[name node ID] 設置每個namenode監聽的埠。
通過之前配置的namenode id來配置namenode監聽的埠。
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
 <value>machine1.example.com:9820</value>

</property>

<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>machine2.example.com:9820</value>

</property>

<property>
 <name>dfs.namenode.rpc-address.mycluster.nn3</name>
 <value>machine3.example.com:9820</value>

</property>

Servicerpc-address也可以差不多一樣來配置。

·         dfs.namenode.http-address.[nameservice ID].[name node ID] 配置namenode http監聽

如果啟動了hadoop的安全選項,還需要為每個namenode配置https-address

·         dfs.namenode.shared.edits.dir 設置namenode可以讀寫編輯的JNs
配置了提供shared edit storagejournalnode,由active namenode寫入,standby namenode讀取更新standby node。儘管你必須制定多個JournalNode地址,但是只需要配置一個。URI的格式如下:qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*Journal IDnameserivce的唯一標識,允許一個journalnode來自於多個聯合的namesystem。儘管不是需要的,但是使用nameservice id作為journal標識是很好的選擇。
比如journalnodes運行在“node1.example.com”, “node2.example.com”, “node3.example.com”nameservice idmycluster,可以用這些來配置了(預設埠是8485

·         dfs.ha.fencing.methods failover時,用這個腳本或者java classes來隔離活動的namenode
這在一個時間內只有一個active namenode是可取的。當使用Quorum Journal Manager,只有一個namenode允許被寫入到journalnode,那麼就有可能因為腦裂出現元數據損壞。然而當failover發生,之前的active namenode還是會服務客戶端的讀請求,當嘗試寫入journalnode的時候namenode被關閉,從而過期。對於這個原因,還是可以在使用Quorum Journal Manager的時候使用一些隔離的方法。
sshfence SSHkill活動的進程
sshfence選項SSH到目標伺服器使用fuser kill監聽埠的服務。為了讓這個隔離工作需要設置無驗證ssh到目標伺服器上。因此還需要配置dfs.ha.fencing.ssh.private-key-files,使用逗號分隔:

其他選項,因為連接可能會超時,或者指定其他用戶和埠來連接。超時單位是毫秒

shell 運行任意的shell命令來隔離活動的namenode
shell隔離方法是指定一個shell命令:

括弧裡面的值會直接被傳到bash中。

·         fs.defaultFS當沒有指定的時候,客戶端連接的預設的hadoop fs
配置啟動ha之後的uri。如果使用mycluster作為nameservice id,那麼可以作為HDFS路徑的一部分比如:

·         dfs.journalnode.edits.dir journalnode進程用來保存本地狀態的路徑
journalnode設備的絕對路徑用來保存edit和其他JNs使用的local狀態。這個配置可能只使用一個路徑。通過配置多個journalnode來冗餘

4.6.3 部署細節

一些必要的配置都配置了之後,啟動journalnode進程。使用命令hdfs --daemon start journalnode啟動journalnode

一旦journalnode被啟動之後需要做個初始化操作,磁碟上同步元數據。

·         如果你設置了HDFS集群,就需要在其中一個namenode上啟動命令

·         如果已經有了初始化有的namenode,或者已經有一個沒有啟動HA的集群要設置為啟動HA,那麼就要複製namenode的元數據目錄到其他的node中。運行hdfs namenode –bootstrapStandby在非格式化的namenode中。使用這個命令也保證了joournalnode有足夠的日誌來啟動2namenode

·         如果你轉化非HAnamenodeHA的。需要運行hdfs namenode –initializeSharedEdits,從namenode edit目錄初始化journalnode

這個時候所有的namenode就和一個namenode一樣。

你可以訪問每個namenode 的網站。然後註意HA狀態是standby還是active,當每個namenode啟動時,一開始的狀態都是standby狀態。

4.6.4 管理命令

現在HA namenode已經配置好了並且已經啟動了,那麼就會有一些額外的管理命令,

Usage: haadmin

    [-transitionToActive <serviceId>]

    [-transitionToStandby <serviceId>]

    [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]

    [-getServiceState <serviceId>]

    [-getAllServiceState]

    [-checkHealth <serviceId>]

[-help <command>]

子命令的幫助可以查看hdfs haadmin -help <command>

·         transitionToActivetransitionToStandby 轉化standbyactive的狀態。
2個子命令會導致namenode的狀態轉化。這個命令不會有隔離,因此儘量不要用。應該使用hdfs haadmin –failover命令

·         failover 2namenode之間做切換
這個子命令會導致namenode之間的failover。如果第一個namenodestandby狀態,這個命令只是把第二個node設置為active。如果第一個namenodeactive的,就會被轉化為standby。如果出現錯誤那麼隔離方法(dfs.ha.fencing.methods)就會嘗試直到成功。這個過程完了之後第二個node會變成active狀態。如果隔離方法沒有成功,第二個namenode不會被轉化為active狀態,會錯誤退出。

·         getServiceState 確定namenodeactive還是standby
連接到namenode並確定當前的狀態,standby或者active會輸出。

·         getAllServiceState 返回所有namenode的狀態
連接到配置好的namenode來決定當前的狀態,輸出standy或者active

·         checkHealth 檢查指定namenode的健康
連接到namenode來檢查健康。Namenode有能力自己診斷,包括檢查服務是否預期運行。如果返回0表示健康,否則非0。這個功能還沒實現。

4.7 自動切換

4.7.1 說明

上面描述配置手動故障轉移。如果namenode報錯也不會自動轉移。

4.7.2 組件

自動故障轉移增加了2個新的組件,zookeeper quorumZKFailoverController進程(ZKFC)

Apache Zookeeper是高可用的服務維護了少量的協作數據,通知客戶端數據的修改,並且監控客戶端的錯誤。HDFS的自動故障轉移依賴於Zookeeper:

·         錯誤診斷每個nanenodeZooKeeper中維護了一個長連接。如果機器crashZooKeeper會話會過期,通知其他namenodefailover

·         Active Namenode選舉,Zookeeper提供簡單的機制選舉一個node作為active。如果當前的active namenode crash。另外一個node會獲取一個在ZooKeeper的排他鎖,表示它會變成下一個active

ZKFailoverController(ZKFC)是一個新的組件,是一個ZooKeeper客戶端可以用來監控和管理namenode 的狀態。每個namenode都運行了ZKFC,ZKFC主要工作:

·         Health監控 ZKFC 定期的ping 本地的namenode作為健康檢查。如果namenode定期回覆那麼就認為是健康的,如果node crashfrozen或者其他原因不健康,那麼健康監控會標記為不健康。

·         ZooKeeper會話管理當本地namenode 是健康的,ZKFC會在ZooKeeper打開一個會話。如果本地namenode是活動的,會獲取一個指定的lock。這個lock會使用ZooKeeper支持的ephemeral node如果會話過期,lock node會被自動刪除。

·         ZooKeeper基於選舉如果namenode是健康的,ZKFC發現沒有lock znode,那麼就會去獲取這個鎖,如果成功,那麼就贏得了選舉,返回failover結果local namenode acitiveFailover過程和手動failover相似:第一,之前的active隔離是必要的,然後local namenode 轉化為 active

自動failover,查看HDFS-2185HDFS JIRA

4.7.3 部署Zookeeper

在通常部署,Zookeeper配置運行3個或者5nodeZookeeper自身是輕量的可以放在namenode或者standby node上。很多會部署在和Zookeeper進程會和yarn resourcemanager同一個node上。推薦把Zookeeper node保存在獨立的磁碟上,用於隔離性能問題。

4.7.4 開始配置前

在開始配置自動故障轉移前,需要先關閉集群。當在集群運行的情況下,把手動轉移轉化為自動轉移是不可能的。

4.7.5 配置自動故障轉移

為了自動故障轉移,配置2個參數,hdfs-site.xml中:

指定那些需要自動故障轉移的node,core-site.xml中:

運行了Zookeeper服務的host和埠。

這些設置可以配置在每個nameservice上,使用nameservice的首碼。比如cluster啟動了聯合,那麼就可以為某個nameservice配置自動故障轉移,配置dfs.ha.automatic-failover.enabled.my-nameservice-id

這裡還有一些其他配置自動故障,但是對大多數來說是沒必要的。

4.7.6 初始化Zookeeper中的HA狀態

配置好之後,下一步就是初始化Zookeeper的狀態。可以用一下命令在一個namenode上運行:


然後在Zookeeper中創建znode,裡面保存了自動故障轉移的數據。

4.7.7 啟動start-dfs.sh

因為自動故障轉移已經在配置文件中設置,start-dfs.sh腳本會自動啟動ZKFC進程,啟動之後會自動選擇一個namenode稱為active

4.7.8 手動啟動cluster

如果是手動管理cluster的,需要手動啟動zkfc進程。

4.7.9 Zookeeper安全訪問

如果運行了安全的cluster,也需要保證保存在Zookeeper也是安全的。這樣可以防止用戶惡意修改元數據,活導致錯誤的faliover

為了安全的Zookeeper,在core-site.xml添加一下信息:

這裡的@,配置的值不是這個值,而是指向的文件。

第一個文件列出了Zookeeper的驗證,和ZK CLI的格式一樣:

Hdfs-zkfcsZookeeper的唯一用戶名,mypassword是密碼。

下一步生成關聯到驗證的Zookeeper ACL,使用命令行如下:

然後把輸出的->之後的字元串複製到zk-acls.txt,並且帶著digest首碼:

為了讓ACL生效,需要運行zkfc –formatZK命令。

然後就可以在ZK CLI驗證ACLS

4.7.10 驗證自動failover

一旦自動故障轉移已經啟動,那麼就需要測試操作。首先定位在active namenode。可以從namenode 的網站查看namenode 的狀態。

一旦定位到活動的namenode,使用 kill -9 pid來模擬jvm崩潰,或者可以關機,或者拔網線來模擬。一旦觸發,在幾秒內其他的namenode會自動變active。發現錯誤,觸發failover的時間取決於配置,ha.zookeeper.session-timeout.ms,預設是5秒。

如果測試沒有成功,可能有配置錯誤。檢查zkfc進程和namenode進程日誌來發現問題。

4.8 自動故障轉移FAQ

·         Is it important that I start the ZKFC and NameNode daemons in any particular order?

No. On any given node you may start the ZKFC before or after its corresponding NameNode.

·         What additional monitoring should I put in place?

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 貼上內容來源https://www.cnblogs.com/Alier/p/6358447.html 1 備份原來的更新源 2 修改更新源 打開sources.list (這就是存放更新源的文件) 1.阿裡源 將下麵所有內容複製,粘貼並覆蓋sources.list文件中的所有內容 2.清華源 進入網 ...
  • 從事DBA工作多年 MYSQL源碼也是頭一次接觸 嘗試記錄下自己看MYSQL5.7源碼的歷程 目錄: 51ak帶你看MYSQL5.7源碼1:main入口函數 51ak帶你看MYSQL5.7源碼2:編譯現有的代碼 現在把剛纔在VSCODE里看到的源碼,安裝成服務。 測試機:CENTOS6 (虛機配置為 ...
  • 準備環境 官方鏈接:https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E5%AE%89%E8%A3%85 主從搭建:http://www.cnblogs.com/cypress/p/8610279.html 一、配置主從資料庫訪問連接 開啟對 ...
  • 一:什麼是索引 索引本身是一個獨立的存儲單位,在該單位裡邊有記錄著數據表某個欄位和欄位對應的物理空間。索引內部有演算法支持,可以使查詢速度非常快。 有了索引,我們根據索引為條件進行數據查詢,速度就非常快 1,索引本身有“演算法”支持,可以快速定位我們要找到的關鍵字(欄位) 2,索引欄位與物理地址有直接對 ...
  • 分割線 Thu Mar 22 14:47:41 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.4 ...
  • 嘗試一點點的記錄下 自己看MYSQL源碼的歷程 51ak帶你看MYSQL源碼1:main入口函數 ...
  • 一、Hadoop是什麼? 首次聽到hadoop這次單詞,相信很多人跟我當時是一樣,不免心中畫上一個大大的問號——這是什麼東西?Hadoop是什麼?百度百科的解釋是:Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。換句話說就是hadoop是一個能夠對大量數據進行分散式處理的軟體框架。 ...
  • 一、sql1{不管數據相同與否,排名依次排序(1,2,3,4,5,6,7.....)} 結果如下 可以看到,現在按照分數從1到9都排好序了,但是有些分數相同的用戶排名卻不一樣,這就是接下來要說的第二種sql 二、sql2{只要數據有相同的排名就一樣,排名依次排序(1,2,2,3,3,4,5..... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...