Greenplum Segment 的檢測機制


Greenplum集群具有較好的容錯性和高可用性,其中一點就體現在segment鏡像機制上。接下來本文會簡單地闡述segment的作用以及segment鏡像機制是如何保證GP高可用的。

Segment簡介

  • Greenplum集群由一個Master和多個segment組成

  • segment用來存儲數據

  • 一台機器可以有多個segment

  • 每個segment是一個postgres數據庫實例

當Greenplum啟用鏡像時,對每個segment都有一對primary segment和mirror segment。 primary segment和mirror  segment被分布在不同的機器上,但是存儲的是同一份數據。

Segment故障切換

當Greenplum集群啟用鏡像后,如果primary segment不可用,系統會啟用備用mirror segment。所以當一個或多個segment出現問題時,只要剩余segment的所有數據可用,Greenplum集群就可以保持正常運行。如果GP集群沒有啟用鏡像,當一個segment發生故障后后導致整個GP集群停止服務,直到所有segment恢復正常。

如果Master節點無法連接到一個segment,Master會在GP系統目錄中標記該segment狀態為宕機,並且啟用鏡像數據。

Segment故障檢測

在Master主機上,Postgres的主進程postmaster會派生一個子進程ftsprobe(FTS)用於故障探測。如果FTS失敗,postmaster會重啟它。FTS會按照 數據庫 配置周期性的請求各segment,並掃描segment的狀態。

Greenplum Segment 的檢測機制

如果FTS無法連接到某個segment,它會在數據庫系統目錄標記該segment的狀態為"down"。該segment在這期間無法被操作,直到進行恢復處理。

FTS配置參數:

  • gp_fts_probe_threadcount

    - 探測Segment的線程數。默認值:16

  • gp_fts_probe_retries

    - 嘗試探測一個Segment的次數。例如如果該設置是   5,在第一次嘗試失   敗后將會有4次重試。默認值:5

  • gp_fts_probe_timeout

    - 在Master和Segment之間的探測超時時長,以秒計。默認值:20,最大     值:3600。

  • gp_fts_probe_interval

    - 多長時間開始一次新的FTS循環,以秒計。例如如果設置是60並且探測     循環本身需要10秒,FTS處理會睡眠50秒。如果該設置是60並且探測循     環需要75秒,FTS進程睡眠0秒。默認值:60,最大值:3600。

  • gp_log_fts

    - FTS的日志級別。off、terse、verbose、debug。verbose可以被用在生產環境中為排查問題提供有用的數據。debug設置不應該被用在生產中。默認值:terse。

  • gp_segment_connect_timeout

    - 允許一個鏡像做出響應的最大時間(以秒計)。默認值:180

FTS會通過向segment數據庫建立一個TCP連接來探測每一個primary segment數據庫,連接時使用注冊在gp_segment_configuration表中的主機名和端口。

注冊在gp_segment_configuration表中的主機名和端口如下圖:

如果連接成功,segment會執行一些簡單的檢查並返回結果給FTS。這些檢查包括對關鍵的segment目錄上執行一次stat以及檢查segment的內部故障。如果沒有檢測到問題,會給FTS一個正常反饋。

源碼中的反饋結果包含如下:

Greenplum Segment 的檢測機制

如果FTS無法建立連接或者在超時后沒有收到一個回復,則會重試。如果失敗的探測次數超過配置的最大次數,FTS會探測該segment的鏡像是否正常,然后更新gp_segment_configuration表標記primary segment為down,並且設置該鏡像作為primary segment運行。FTS會在gp_configuration_history中記錄該操作。

當只有一個活動的primary segment並且相應的鏡像宕機時,該primary segment會進入到"Change Tracking Mode"。在這種模式中,對該Segment的操作會被記錄,這樣可以同步鏡像而無需把primary segment的完整數據復制給mirror segment。

gprecoverseg命令可以恢復宕機的鏡像。

  • 默認情況下,gprecoverseg執行一次增量恢復,把該鏡像置於resync模式中,然后開始把primary segment記錄的更改在鏡像上進行重放。

  • 如果不能完成增量恢復,可以重新以-F選項運行gprecoverseg來執行完全恢復。這種操作會導致primary segment把所有的數據都復制給鏡像。

在gp_segment_configuration表中,每個Segment可以有三種模式:

  • change tracking

  • resync

  • synced

同時還可以有"up"或"down"兩種狀態。

gpcc的監控狀態如下圖:

Greenplum Segment 的檢測機制

gp_segment_configuration表還有兩個列role和preferred_role。

  • role:表示該segment數據庫的當前角色

  • preferred_role:表示該segment的原始角色。

在集群正常時,所有segment的role和preferred_role都是匹配的。當它們不匹配時,每台硬件主機上活動的primary segment數量發生傾斜。為了重新平衡該集群並且讓所有的segment回到它們的首選角色,可以用-r選項運行gprecoverseg命令。

 

最后提醒各位Greenplum的使用者,雖然Greenplum有完善的容錯機制。但是當GP發生故障,主備segment切換后,會造成負載不均衡,耗費更多的系統資源,同時會大幅度降低查詢等操作的效率。所以,及時恢復失敗的segment,把所有segment恢復成原有的角色是非常必要的工作。

 

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,也希望大家多多支持 碼農網

轉載自:https://www.codercto.com/a/41959.html


免責聲明!

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



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