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的狀態。
如果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一個正常反饋。
源碼中的反饋結果包含如下:
如果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的監控狀態如下圖:
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