解密数仓高可用 failover 流程
本文分享自华为云社区《【玩转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 日志与数据页文件同步至从备。
【一起来玩转PB级数仓GaussDB(DWS),分享你的技术经验与体验心得,赢开发者大礼包!】第 19 期有奖征文火热进行中!
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/0122d9e2bb6301ae44fcbd379】。文章转载请联系作者。
评论