Vadim Yatsenko:DataMax:面向近同步持久性的专用WAL日志存储节点
内容提要
DataMax是PolarDB新增的专用WAL日志节点,仅持久化并级联WAL、不重放日志,无需完整数据库副本,存储与CPU成本远低于普通备库。它可与主节点同可用区部署并参与同步提交,低延迟提供第二份持久WAL,同时向下游备库异步级联。通过新增'e'消息传递事务ID纪元、WAL保留边界等状态,并借助initdb指定系统标识完成握手,DataMax无需基础备份即可加入复制链,还支持时间线切换与安全提升。
延伸解读
DataMax 的定位:只存日志,不重放
DataMax 是 PolarDB 新增的专用 WAL 日志节点,它只持久化并级联 WAL,不重放日志,因此无需维护完整数据库副本。与普通备库相比,它省去了重放 WAL 所需的解析、页面修改和冲突处理,存储与 CPU 成本大幅降低。它适合需要第二份持久 WAL 但不想承担完整备库开销的场景,同时可作为级联中心向下游备库异步转发日志。
近同步持久性:同可用区低延迟提交
DataMax 可与主节点部署在同一可用区,并加入 synchronous_standby_names 参与同步提交。这样,事务提交只需等待同可用区内的短距离网络往返,即可获得第二份持久 WAL,而远程备库则从 DataMax 异步复制。这避免了跨可用区同步带来的高延迟,在保证持久性的同时降低了主节点的提交开销。
无事务节点的状态借用机制
DataMax 不运行本地事务,无法自行产生事务 ID 纪元(epoch)和 WAL 保留边界。为此,主节点通过新增的 'e' 消息将 nextXid、epoch、最后有效 LSN 和最后移除段等信息随 WAL 流发送给 DataMax。DataMax 记录这些状态,并向上游反馈基于自身复制槽 xmin 的 vacuum 边界,避免错误地阻碍主节点 vacuum;向下游级联时,仅当对方也是 DataMax 才转发 'e' 消息。
免基础备份加入复制链与安全提升
DataMax 通过 initdb 指定上游系统标识,无需 pg_basebackup 即可完成握手并加入复制链。它支持时间线切换,并能向下游提供历史时间线。在提升为主节点时,可配置等待所有上游 WAL 接收完成后再提升(默认关闭),确保 DataMax 不会在未持久化 WAL 的情况下提升,从而成为安全的故障转移目标。
Q&A
DataMax节点和普通备库在存储与重放WAL上有什么本质区别?
普通备库会存储WAL并重放日志到自己的数据文件,需要完整数据库副本;DataMax只持久化WAL并向下游级联,从不重放日志,因此不持有主数据,存储和CPU成本远低于普通备库。
DataMax如何在不运行本地事务的情况下获得事务ID纪元和WAL保留边界?
主节点通过新增的'e'消息将nextXid、epoch、最后有效LSN和最后移除段等状态随WAL流发送给DataMax;DataMax记录这些状态,用借来的epoch构建合理的vacuum horizon反馈,并将保留状态转发给级联的DataMax。
DataMax没有基础备份,如何加入复制链并完成握手?
通过让initdb接受显式系统标识,DataMax用上游的系统标识初始化;连接时IDENTIFY_SYSTEM会呈现主节点期望的身份,无需pg_basebackup。冷启动时它用故意无效的时间线和LSN请求流复制,握手后采用主节点时间线,主节点从其最小保留WAL开始流式传输。
DataMax在同步提交中扮演什么角色,为什么能降低延迟?
DataMax可与主节点同可用区部署并被列入synchronous_standby_names,因此提交只需等待同可用区短跳的确认,提供第二份持久WAL;远端备库则从DataMax异步级联复制,避免主节点支付跨可用区往返延迟。
DataMax如何保证提升(promote)安全,相关配置是什么?
DataMax可与上游交换'p'请求和'l'回复,回复携带它必须已收到的LSN,确保在提升前已持久化所有上游WAL。该等待默认关闭(polar_enable_promote_wait_for_walreceive_done = off),操作员可用pg_ctl promote -f强制跳过;启用时DataMax是安全的故障转移目标。
DataMax支持时间线切换吗?如何实现?
支持。DataMax针对自己的WAL目录获取并提供时间线历史,因此能跟随上游时间线切换,并向下游提供旧时间线,而无需完整数据副本。
对于DBA来说,启用DataMax需要关注什么新配置?
DBA需要关注新参数polar_datamax_mode,它用于启用DataMax模式;此外还有polar_enable_promote_wait_for_walreceive_done控制提升是否等待WAL接收完成。