解密数仓高可用failover流程
摘要: 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日志与数据页文件同步至从备。