解密數倉高可用failover流程

2023-03-08 18:01:16
摘要: Gaussdb的HA採用主備從的架構實現資料可靠性。當主DN發生故障時,備DN走failover流程,升級成為新主DN,保證叢集不因單DN故障而中斷業務。

本文分享自華為雲社群《【玩轉PB級數倉GaussDB(DWS)】dws高可用之failover流程大解密》,作者:fxy0224。

眾所周知,PostgreSQL通過WAL預寫xlog紀錄檔的機制解決了在單機環境上因程序故障退出導致資料丟失的問題。但在磁碟損壞等情況下,儲存在永續性媒介的資料就會丟失無法恢復,因此通常採用多副本的方式來保證資料可恢復。在Gaussdb中採用了主備從架構保證資料可靠性。

在Gaussdb主備從架構下,主DN分別與備​DN、從備DN建連。正常情況下,主DN與備DN、從備DN均建立流複製通道,分wal同步和資料頁同步兩個通道。wal同步是將儲存在磁碟中的wal檔案讀出,然後通過walsender執行緒傳送到備DN;資料頁同步是在列存或者批次匯入行存資料的場景下使用,通過datasender執行緒將資料傳送到備DN。備DN上通過walreceiver、datareceiver執行緒接收從主DN同步過來的資料。備DN對同步來的xlog做redo的方式實現與主DN的資料一致性。

failover的場景大致如下:當發生主DN故障且退出後,CM會向備DN通知failover升主的訊號。備DN會率先主動連從備DN,將從備DN上的xlog與資料頁同步至備DN。然後備DN升主,備DN和從備DN之間建立新的流複製通道。這樣當主DN故障時,依靠備DN與從備DN,Gaussdb仍可對外提供服務。

failover時主備DN的狀態變化過程如下:

DN狀態切換過程示意圖

(由於wal機制,因此主備DN在啟動時均先執行redo,redo完成後DN狀態才從starting——>Normal)

當主DN因故障退出時,其狀態顯示為down。此時備DN處於斷連狀態,狀態由standby Normal變為needrepair(disconnected),當備DN收到failover訊號時,狀態變為promoting,表示備DN正處於升主過程中。備DN狀態變為primary Normal後,表示備DN升主成功。

failover時備DN的流程示意圖如下:

failover流程示意圖

Gaussdb內部通過gs_ctl的方式傳送給備DN的failover命令:

gs_ctl failover [-w] [-t SECS] [-D DATADIR] [-U USERNAME] [-P PASSWORD],具體流程如下:

  • 備DN上Postmaster執行緒將failover訊號通知到Startup執行緒, startup執行緒收到failover訊號後,將與主DN不斷建連的datareceiver和walreceiver執行緒shutdown;
  • startup執行緒獲取連線從備的建連資訊(從備DN的ip+port),然後通知Postmaster執行緒建立新的walreceiver和datareceiver執行緒。
  • 備DN的walreceiver和datareceiver執行緒與從備DN的walsender和datasender建連。從備DN傳送xlog紀錄檔與資料頁資訊到備DN
  • 備DN將從備DN上的資料同步結束後,其walreceiver執行緒和datareceiver執行緒均退出。備DN由startup執行緒進行redo。redo完成後,備DN將建立walsender和datasender執行緒,並與從備DN的walreceiver和datareceiver執行緒分別建連,備DN升主成功。備DN升主後,新主將與CN連線,並將xlog紀錄檔與資料頁檔案同步至從備。

 

點選關注,第一時間瞭解華為雲新鮮技術~