摘要: Gaussdb的HA採用主備從的架構實現數據可靠性。當主DN發生故障時,備DN走failover流程,升級成為新主DN,保證集群不因單DN故障而中斷業務。 本文分享自華為雲社區《【玩轉PB級數倉GaussDB(DWS)】dws高可用之failover流程大解密》,作者:fxy0224。 眾所 ...
摘要: 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日誌與數據頁文件同步至從備。