1. 程式人生 > >HAWQ技術解析(十四) —— 高可用性

HAWQ技術解析(十四) —— 高可用性

一、HAWQ高可用簡介

        HAWQ作為一個傳統數倉在Hadoop上的替代品,其高可用性至關重要。通常硬體容錯、HAWQ HA、HDFS HA是保持系統高可用時需要考慮並實施的三個層次。另外實時監控和定期維護,也是保證叢集所有元件健康的必不可少的工作。
        總的來說,HAWQ容錯高可用的實現方式包括:
  • 硬體冗餘
  • master映象
  • 雙叢集

1. 硬體級別的冗餘(RAID和JBOD)

        硬體元件的正常磨損或意外情況最終會導致損壞,因此有必要提供備用的冗餘硬體,當一個元件發生損壞時,不中斷服務。某些情況下,冗餘的成本高於使用者所能容忍的服務中斷。此時,目標是保證所有服務能夠在一個預期的時間範圍內被還原。
        雖然Hadoop叢集本身是硬體容錯的,但HAWQ有其特殊性。HAWQ master的資料是儲存在主機本地硬碟上的,是一個單點。作為最佳實踐,HAWQ建議在部署時,master節點應該使用RAID,而segment節點應該使用JBOD。這些硬體級別的系統為單一磁碟損壞提供高效能冗餘,而不必進入到資料庫級別的容錯。RAID和JBOD在磁碟級別提供了低層次的冗餘。

2. master映象

        高可用叢集中的master節點有兩個,一個主一個從。和master節點與segment節點分開部署類似,master的主和從也應該部署到不同的主機,以容忍單一主機失效。客戶端連線到主master節點並且查詢只能在主master節點上執行。從master節點保持與主master節點的實時同步,這是通過將預寫日誌從主複製到從實現的。

3. 雙叢集

        可以通過部署兩套HAWQ叢集,儲存相同的資料,從而增加另一級別的冗餘。有兩個主要方法用於保持雙叢集的資料同步,分別是雙ETL和備份/還原。
        雙ETL提供一個與主叢集資料完全相同的備用叢集。ETL(抽取、裝換與裝載)指的是一個數據清洗、轉換、驗證和裝載進資料倉庫的過程。通過雙ETL,將此過程並行執行兩次,每次在一個叢集中執行。應該在兩個叢集上都進行驗證,以確保雙ETL執行成功。這種做法是最徹底的冗餘,需要部署兩套HAWQ叢集與ETL程式。該方法帶來的一個附加好處是應用利用雙叢集,能夠同時在兩個叢集上查詢資料,將查詢吞吐量增加一倍。
        用備份/還原方法維護一個雙叢集,需要建立一個主叢集的備份,並在備用叢集上還原。這種方法與雙ETL策略相比,備用節點資料同步的時間要長的多,但優點是隻需要開發更少的應用邏輯。如果資料修改和ETL執行的頻率是每天或更低的頻率,同時備份/還原時間又在可接受的範圍內,那麼用備份生成資料是比較理想的方式。注意,備份/還原方法不適用於要求資料實時同步的情況。

二、master節點映象

        在HAWQ中配置一主一從兩個master節點,客戶端連線點主master節點,並只能在主master節點上執行查詢。從master是一個純粹的容錯節點,只作為主master出現問題時的備用。如果主master節點不可用,從master節點作為熱備。可以在主master節點聯機時,從它建立一個從master節點。
        當主master節點持續為使用者提供服務時,HAWQ可以生成主master節點例項的事務快照。除了生成事務快照並部署到從master節點外,HAWQ還記錄主master節點的變化。在HAWQ在從master節點部署了快照後,HAWQ會應用更新以將從master節點與主master節點資料同步。
        主從master節點初始同步後,HAWQ分別在主、從節點上啟動WAL Send和WAL Redo伺服器程序,保持主從實時同步。它們是基於預寫日誌(Write-Ahead Logging,WAL)的複製程序。WAL Redo是一個從master節點程序,WAL Send是主master節點程序。這兩個程序使用基於WAL的流複製保持主從同步。
        因為master節點不儲存使用者資料,只有系統目錄表在主從master節點間被同步。當這些系統表被更新時(如DDL所引起),改變自動拷貝到從master節點保持它與當前的主master節點資料一致。
        HAWQ中的master節點映象架構如圖1所示。
圖1
        如果主master節點失效,複製程序停止。此時管理員需要使用命令列工具或者Ambari,手工執行master切換,指示從master節點成為新的主master節點。在啟用從master節點後,複製的日誌重構主master節點在最後成功提交事務時的狀態。當從master節點初始化後,被啟用的從作為HAWQ的主節點,在指定埠接收連線請求。
        可以為主、從配置同一個虛IP地址,這樣在主從切換時,客戶端程式就不需要連線到兩個不同的網路地址。如果主機失效,虛IP可以自動交換到實際活動的主節點。虛IP可能需要額外的軟體支援,如Keepalived等。

1. 配置從master節點

        hdp2為現有的主master節點,下面過程將hdp3配置為hdp2的從master節點。

(1)前提配置
        確保hdp3上已經安裝了HAWQ並進行了以下配置:
  • 建立了gpadmin系統使用者。
  • 已安裝了HAWQ二進位制包。
  • 已設定了HAWQ相關的環境變數。
  • 已配置主、從master的SSH免密碼登入。
  • 已建立了master資料目錄。
(2)初始化從master節點
        登入hdp3,清空master資料目錄。
[[email protected] ~]# rm -rf /data/hawq/master/*
        登入hdp2,初始化從master節點
[[email protected] ~]$ . /usr/local/hawq/greenplum_path.sh
[[email protected] ~]$ hawq init standby -s hdp3

(3)檢查HAWQ叢集狀態
  • 通過在hdp2上執行下面的命令檢查HAWQ叢集的狀態,結果如圖2所示。主master狀態應該是Active,從master狀態是Passive。
    [[email protected] ~]$ hawq state
圖2
  • 查詢gp_segment_configuration表驗證segment已經註冊到主master節點,查詢結果如圖3所示,可以看到hdp2與hdp3的角色分別是‘m’和‘s’。
    [[email protected] ~]$ psql -c 'SELECT * FROM gp_segment_configuration;'
圖3
  • 查詢gp_master_mirroring系統檢視檢查主節點映象的狀態。該檢視提供了關於HAWQ master節點的WAL Send程序的使用資訊。查詢結果如圖4所示,可以看到主、從master資料已經同步。
    [[email protected] ~]$ psql -c 'SELECT * FROM gp_master_mirroring;'
圖4

2. 手工執行失敗切換

        當主master不可用時,需要手工執行切換,將從master啟用為主master。
(1)保證系統中已經配置從master節點主機。
(2)啟用從master節點。
        登入到HAWQ從master節點並激活它,之後從master成為了HAWQ的主master。
[[email protected] ~]$ hawq activate standby

3. 配置一個新的從master節點(可選但推薦)

        手工切換master後,最好配置一個新的從master節點,繼續保持master的高可用性,配置過程參考“1. 配置從master節點”。

4. 重新同步主、從節點

        如果主、從之間的日誌同步程序停止或者落後,從master可能變成過時狀態。如果遇到這種情況,查詢gp_master_mirroring檢視時,會看到summary_state欄位輸出中顯示Not Synchronized。為了將從與主重新進行同步,在主master節點上執行下面的命令:
[[email protected] ~]$ hawq init standby -n
        該命令停止並重啟主master節點,然後同步從master節點。

三、HAWQ檔案空間與HDFS高可用

        如果在初始化HAWQ時沒有啟用HDFS的高可用性,可以使用下面的過程啟用它。
  1. 配置HDFS叢集高可用性。
  2. 收集目標檔案空間的資訊。
  3. 停止HAWQ叢集,並且備份系統目錄。
  4. 使用命令列工具遷移檔案空間。
  5. 重新配置${GPHOME}/etc/hdfs-client.xml和${GPHOME}/etc/hawq-site.xml,然後同步更新所有HAWQ節點的配置檔案。
  6. 啟動HAWQ叢集,並在遷移檔案空間後重新同步從master節點。

1. 配置HDFS叢集高可用性

(1)HDFS HA概述
        HDFS中的NameNode非常重要,其中儲存了DataNode上資料塊儲存位置的相關關係。它主要維護兩個對映,一個是檔案到塊的對應關係,一個是塊到節點的對應關係。如果NameNode停止工作,就無法知道資料所在的位置,整個HDFS將陷入癱瘓,因此保證NameNode的高可用性是非常重要的。
        在Hadoop 1時代,只有一個NameNode。如果該NameNode資料丟失或者不能工作,那麼整個叢集就不能恢復了。這是hadoop 1中的單點故障問題,也是hadoop 1不可靠的表現。圖5是hadoop 1的架構圖。


圖5


        為了解決hadoop 1中的單點問題,hadoop 2中支援兩個NameNode,每一個都有相同的職能。一個是active狀態的,一個是standby狀態的。當叢集執行時,只有active狀態的NameNode是正常工作的,standby狀態的NameNode處於待命狀態,時刻同步active狀態NameNode的資料。一旦active狀態的NameNode不能工作,通過手工或者自動切換,將standby狀態的NameNode轉變為active狀態,就可以繼續工作了。
        Hadoop 2中,兩個NameNode的資料是實時共享的。新HDFS採用了一種共享機制,通過Quorum Journal Node(JournalNode)叢集或者Network File System(NFS)進行共享。NFS是作業系統層面的,JournalNode是hadoop層面的(主流做法)。圖6為JournalNode的架構圖。


圖6


        兩個NameNode為了資料同步,會通過一組稱作JournalNodes的獨立程序進行相互通訊。當active狀態的NameNode的名稱空間有任何修改時,會告知JournalNodes程序。standby狀態的NameNode有能力讀取JNs中的變更資訊,並且一直監控edit log的變化,把變化應用於自己的名稱空間。standby可以確保在叢集出錯時,名稱空間狀態已經完全同步。
        對於HA叢集而言,確保同一時刻只有一個NameNode處於active狀態是至關重要的。否則,兩個NameNode的資料狀態就可能產生分歧,或造成資料丟失,或產生錯誤的結果。為了保證這點,需要利用ZooKeeper。首先HDFS叢集中的兩個NameNode都在ZooKeeper中註冊,當active狀態的NameNode出故障時,ZooKeeper能檢測到這種情況,然後它就會自動把standby狀態的NameNode切換為active狀態。

(2)使用Ambari啟用HDP的高可用性(參考How To Configure NameNode High Availability)。
  • 檢查Hadoop叢集,確保叢集中至少有三臺主機,並且至少執行三個ZooKeeper伺服器。
  • 檢查Hadoop叢集,確保HDFS和ZooKeeper服務不是在維護模式中。在啟用NameNode HA時,這些服務需要重啟,而維護模式阻止啟動和停止。如果HDFS或者ZooKeeper服務處於維護模式,NameNode HA嚮導將不能完全成功。
  • 在Ambari Web裡,選擇Services > HDFS > Summary。
  • 在Service Actions中選擇Enable NameNode HA,如圖7所示。
圖7
  • 出現Enable HA嚮導。這個嚮導描述了配置NameNode高可用必須執行的自動和手工步驟。
  • Get Started:此步驟給出一個處理預覽,並允許使用者選擇一個Nameservice ID,本例的Nameservice ID為mycluster。HA一旦配置好,就需要使用Nameservice ID代替NameNode FQDN。點選Next繼續處理,如圖8所示。
圖8
  • Select Hosts:為standby NameNode和JournalNodes選擇主機。可以使用下拉列表調整嚮導建議的選項。點選Next繼續處理。
  • Review:確認主機的選擇,並點選Next,如圖9所示。
圖9
  • 建立檢查點:此步驟中提示執行兩條命令,第一條命令把NameNode置於安全模式,第二條命令建立一個檢查點,如圖10所示。需要登入當前的NameNode主機執行這兩條命令,如圖11所示。當Ambari檢測到命令執行成功後,視窗下端的提示訊息將改變。點選Next。
圖10 圖11
  •  確認元件:嚮導開始配置相關元件,顯示進度跟蹤步驟。配置成功如圖12所示。點選Next繼續。
圖12
  • 初始化JournalNodes:此步驟中提示執行一條指令,如圖13所示。需要登入到當前的NameNode主機執行命令初始化JournalNodes。當Ambari檢測成功,視窗下端的提示訊息將改變。點選Next。
圖13
  • 啟動元件:嚮導啟動ZooKeeper伺服器和NameNode,顯示進度以跟蹤步驟。執行成功後如圖14所示。點選Next繼續。
圖14
  • 初始化元資料:此步驟中根據提示執行命令。確保登入正確的主機(主、從NameNode)執行每個命令。當完成了兩個命令,點選Next。顯示一個彈出視窗,提醒使用者確認已經執行了兩個命令。點選OK確認。
  • 最終設定:此步驟中,嚮導顯示進度跟蹤步驟。點選Done結束嚮導。在Ambari Web GUI過載後,可以看到一些警告提示。等待幾分鐘直到服務恢復。如果需要,使用Ambari Web重啟相關元件。
  • 調整ZooKeeper失敗切換控制器的重試次數設定。瀏覽Services > HDFS > Configs > Advanced core-site,設定ha.failover-controller.active-standby-elector.zk.op.retries=120
        至此已經配置好HDP HDFS的高可用性。從NameNode UI可以看到,hdp1和hdp2分別顯示為active和standby。如圖15、16所示。


圖15


圖16

        此時在hdp1上執行如下命令關閉hdp1上的NameNode:
[[email protected] ~]$ /usr/hdp/2.5.0.0-1245/hadoop/sbin/hadoop-daemon.sh stop namenode
stopping namenode
[[email protected] ~]$
        再次檢視hdp2上的NameNode,發現已自動切換為active,如圖17所示。


圖17

        此時在hdp1上執行如下命令啟動hdp1上的NameNode:
[[email protected] ~]$ /usr/hdp/2.5.0.0-1245/hadoop/sbin/hadoop-daemon.sh start namenode
stopping namenode
[[email protected] ~]$
        再次檢視hdp1上的NameNode,發現已自動切換為standby,如圖18所示。


圖18

2. 收集目標檔案空間的資訊

        預設的檔案空間名為dfs_system,存在於pg_filespace目錄,其引數pg_filespace_entry包含每個檔案空間的細節資訊。為了將檔案空間位置遷移到HDFS HA的位置,必須將資料遷移到叢集中新的HDFS HA路徑。
        使用下面的SQL查詢收集關於HDFS上的檔案空間位置資訊。
SELECT
    fsname, fsedbid, fselocation
FROM
    pg_filespace AS sp, pg_filespace_entry AS entry, pg_filesystem AS fs
WHERE
    sp.fsfsys = fs.oid AND fs.fsysname = 'hdfs' AND sp.oid = entry.fsefsoid
ORDER BY
    entry.fsedbid;
        輸出包含資訊中包含HDFS路徑共享相同的字首,以及當前檔案空間的位置,如圖19所示。


圖19

        為了在HAWQ中使用HDFS HA,需要檔案空間名和HDFS路徑的通用字首資訊。檔案空間位置的格式類似一個URL。如果無HA的檔案空間位置是‘hdfs://test5:9000/hawq/hawq-1459499690’,並且HDFS HA的通用字首是‘hdfs://hdfs-cluster’,那麼新的檔案空間位置應該是‘hdfs://hdfs-cluster/hawq/hawq-1459499690’。

3. 停止HAWQ叢集並備份系統目錄

        注意:Ambari使用者必須手工執行這個步驟。
        在HAWQ中啟用 HDFS HA時會修改HAWQ的目錄和永久表。因此遷移檔案空間位置前,先要備份目錄,以確保不會因為硬體失效或在一個操作期間(如殺掉HAWQ程序)丟失資料。
(1)如果HAWQ主節點使用了一個定製埠,輸出PGPORT環境變數。例如:
export PGPORT=8020
(2)儲存HAWQ master節點目錄,在hawq-site.xml檔案中找到hawq_master_directory屬性,賦給一個環境變數。
export MDATA_DIR=/data/hawq/master
(3)斷掉所有連線。使用以下查詢檢查活動連線:
[[email protected] ~]$ psql -c "SELECT * FROM pg_catalog.pg_stat_activity"
(4)執行檢查點
[[email protected] ~]$ psql -c "CHECKPOINT"
(5)停止HAWQ叢集
[[email protected] ~]$ hawq stop cluster -a -M fast
(6)拷貝主節點資料目錄到備份的位置:
$ cp -r ${MDATA_DIR} /catalog/backup/location
        主節點資料目錄包含子目錄,一定要備份此目錄。

4. 遷移檔案空間位置

        注意:Ambari使用者必須手工執行這個步驟。HAWQ提供了命令列工具hawq filespace,遷移檔案空間的位置。
(1)如果HAWQ主節點使用了一個定製埠,輸出PGPORT環境變數。例如:
export PGPORT=9000
(2)執行下面的命令遷移檔案空間的位置:
[[email protected] master]$ hawq filespace --movefilespace default --location=hdfs://mycluster/hawq_data
        遷移檔案空間時可能出現的以下潛在錯誤:
  • 如果提供了無效的輸入,或者在修改檔案空間位置時沒有停止HAWQ,可能發生非崩潰錯誤。檢查是否已經從頭正確執行了所有步驟,或者在再次執行hawq filespace前修正輸入錯誤。
  • 崩潰錯誤可能發生在硬體失效或者修改檔案空間位置時殺死HAWQ程序失敗的情況下。當發生崩潰錯誤時,在輸出中可以看到“PLEASE RESTORE MASTER DATA DIRECTORY”訊息。此時應該停止資料庫,並且還原在步驟4中備份的${MDATA_DIR}目錄。

5. 通過重新配置hdfs-client.xml和hawq-site.xml,更新HAWQ使用NameNode HA

        如果使用命令列應用安裝和管理HAWQ叢集,參考http://hawq.incubator.apache.org/docs/userguide/2.1.0.0-incubating/admin/HAWQFilespacesandHighAvailabilityEnabledHDFS.html#configuregphomeetchdfsclientxml,修改HAWQ配置以使用NameNode HA服務。
        如果使用Ambari管理HDFS和HAWQ,不需要執行這些步驟,因為Ambari在啟用了NameNode HA後會自動做這些修改。

6. 重啟HAWQ叢集並重新同步從主節點

(1)重啟HAWQ叢集
[[email protected] master]$ hawq start cluster -a
(2)遷移檔案空間到新位置會使從master節點無效,因此需要重新同步從master節點。在主master節點上,執行下面的命令保證從master節點的目錄與主master節點重新同步。
[[email protected] master]$ hawq init standby -n -M fast
        至此已經在HAWQ的檔案空間中使用了HDFS HA,再次查詢檔案空間的資訊,輸出結果如圖20所示。


圖20

四、理解HAWQ容錯服務

        HAWQ的容錯服務(fault tolerance service,FTS)使得HAWQ可以在segment節點失效時持續操作。容錯服務自動執行,並且不需要額外的配置。
        每個segment執行一個資源管理程序,定期(預設每30秒)向主節點的資源管理程序傳送segment狀態。這個時間間隔由hawq_rm_segment_heartbeat_interval伺服器配置引數所控制。當一個segment碰到嚴重錯誤,例如,由於硬體問題,segment上的一個臨時目錄損壞,segment通過心跳報告向master節點報告有一個臨時目錄損壞。master節點接收到報告後,在gp_segment_configuration表中將該segment標記為DOWN。所有segment狀態的變化都被記錄到gp_configuration_history目錄表,包括segment被標記為DOWN的原因。當這個segment被置為DOWN,master節點不會在該segment上執行查詢執行器。失效的segment與叢集剩下的節點相隔離。
        包括磁碟故障的其它原因會導致一個segment被標記為DOWN。舉例來說,HAWQ執行在YARN模式中,每個segment應該有一個執行的NodeManager(Hadoop的YARN服務),因此segment可以被看做HAWQ的一個資源。但如果segment上的NodeManager不能正常操作,那麼該segment會在gp_segment_configuration表中被標記為DOWN。失效對應的原因被記錄進gp_configuration_history。
        注意:如果一個特定段上的磁碟故障,可能造成HDFS錯誤或HAWQ中的臨時目錄錯誤。HDFS的錯誤由Hadoop HDFS服務所處理。

檢視segment的當前狀態

        為了檢視當前segment的狀態,查詢gp_segment_configuration表。如果segment的狀態是DOWN,“description”列顯示原因。原因可能包括下面的任何原因,可能是單一原因,也可能是以分號(“;”)分割的幾個原因。

        原因:heartbeat timeout
        主節點沒有接收到來自段的心跳。如果看到這個原因,確認該segment上的HAWQ是否執行。如果segment在以後的時間報告心跳,segment被自動標記為UP。

        原因:failed probing segment
        master節點探測segment以驗證它是否能被正常操作,段的響應為NO。在一個HAWQ例項執行時,查詢分發器發現某些segment上的查詢執行器不能正常工作。master節點上的資源管理器程序向這個segment傳送一個訊息。當segment的資源管理器接收到來自master節點的訊息,它檢查其PostgreSQL的postmaster程序是否工作正常,並且向master節點發送一個響應訊息。當master節點收到的響應訊息表示該segment的postmaster程序沒有正常工作,那麼master節點標記段為DOWN,原因記為“failed probing segment.”。檢查失敗segment的日誌並且嘗試重啟HAWQ例項。

        原因:communication error
        master節點不能連線到segment。檢查master節點和segment之間的網路連線。

        原因: resource manager process was reset
        如果segment資源管理器程序的時間戳與先前的時間戳不匹配,意味著segment上的資源管理器程序被重啟過。在這種情況下,HAWQ master節點需要回收該segment上的資源並將其標記為DOWN。如果master節點從該segment接收到一個新的心跳,它會自動標記為UP。

        原因:no global node report
        HAWQ使用YARN管理資源,但沒有為該segment接收到叢集報告。檢查該segment上的NodeManager是否可以正常操作。如果不能,嘗試啟動該segment上的NodeManager。在NodeManager啟動後,執行yarn node --list檢視該節點是否在列表中。如過存在,該段被自動置為UP。