摘要: 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],具體流程如下: