Hacker News 中文摘要

RSS订阅

我们如何将CDC推入Postgres -- How We Pushed CDC into Postgres

文章摘要

本文介绍了Snowflake如何重新设计Postgres的数据复制功能,通过将变更数据直接推送到Apache Iceberg表中,实现了低成本、低延迟且事务一致的数据镜像,解决了传统CDC工具脆弱、成本高和操作复杂的问题。

文章总结

在现代数据架构中,将事务性数据库的数据同步至分析型数据库至关重要,但这一过程常受困于工具脆弱、成本高昂和操作复杂。Snowflake在构建Postgres服务时,将解决此问题列为首要任务。本文深入探讨了数据镜像技术的工程原理,即如何从零开始重新设计Postgres复制机制。

Postgres的变更数据捕获(CDC)功能存在不足,许多复制管道因需处理数据与模式变更、快照及故障间的复杂交互而变得脆弱。为此,Snowflake推出了数据镜像功能(公开预览版),它能以低成本、低延迟和事务一致性将数据从Postgres高可靠地复制到Snowflake。其核心机制是通过Postgres扩展(snowflake_cdc)将变更直接以事务批次推送到Apache Iceberg表中,再由Snowflake以无服务器方式自动应用这些批次。这种“事务性推送到数据湖,事务性应用至Snowflake,无需额外基础设施”的简洁设计,将复制从充满复杂故障的混乱流程转变为可永久运行的精密机制。

传统CDC依赖Postgres的逻辑解码,但外部系统无法感知Postgres内部状态(如模式变更、快照对齐或服务存活)。数据镜像通过将变更推送到数据湖(如S3上的Iceberg表)解决此问题。扩展程序利用后台工作进程持续将变更批次写入每张表的变更日志和元日志,它能精确协调模式变更与复杂DML/DDL事务,并确保快照与变更对齐。这种基于推送的CDC通过对象存储解耦生产者和消费者,避免了大量基础设施问题。

复制过程涉及写入、解码、捕获和应用四个阶段,每个阶段在数据库时间线上处于不同时间点。解码器使用Postgres的“历史快照”读取写入时的目录表,将WAL记录转换为逻辑行变更。捕获进程将最终化的文件追加到Iceberg变更日志,并记录元日志。模式变更遵循相同路径,可能生成新变更日志。Snowflake的应用进程作为有限状态机执行元日志指令,确保模式变更正确排序。若WAL意外丢失,Postgres可自动推送新快照。

事务是处理系统与硬件故障复杂性的关键。数据镜像充分利用pg_lake扩展和Snowflake的Iceberg实现,在Postgres端将数据批次和模式变更以事务方式推入多个变更日志,Snowflake端则以事务方式合并多个批次,确保所有Snowflake表精确推进到Postgres事务边界,保持外键和连接正确性。这种事务性复制方法可扩展至高吞吐量,避免常规跨系统复制中的故障和竞态条件。

事务还实现了大规模正确性。传统复制采用upsert方式,存在中间状态不一致、插入成本高、难以高效合并变更等问题。而事务性复制允许完美地一次性应用删除和插入,无需担心重复。这意味着插入密集型工作负载的复制极为快速且经济,因为插入仅追加而非upsert。基于此,数据镜像提供了“实时视图”功能,它将未应用的变更日志与目标表数据结合,并支持查询下推至存储层,实现低延迟和高性能查询,即使不频繁应用变更也能保持亚分钟级延迟。

综上所述,基于推送的CDC、精心设计的时间线、双方事务边界以及实时视图,使数据镜像将复制转变为瑞士钟表般精准的流程:无需外部连接器、无快照与变更冲突、无随表增长而变慢的upsert。Postgres扩展将批次推入对象存储,Snowflake独立且事务性地应用它们,两者均可无限运行。用户只需设置一次,即可永久运行。

Snowflake Postgres提供两种统一工作负载的方式:数据镜像(公开预览)实现始终在线、自动化的复制;Postgres for your data lake(正式可用)允许开发者通过SQL灵活控制Postgres与Snowflake间的数据移动,使用Iceberg等开放格式。

评论总结

根据评论内容,主要观点和论据如下:

正面评价(认可度较高)
- Snowflake产品表现出色,使用体验愉悦。
- "Snowflake is a really amazing product. It's been a delight using it the last few years."(whateveracct)
- ClickHouse通过收购Peerdb实现高效复制,处理TB级数据库几乎无需操心。
- "Clickhouse really nailed this with the acquisition of peerdb... I essentially never thought about it."(bastawhiz)

技术对比与替代方案
- Vertica曾通过WOS/ROS格式实现类似功能,但存在模式更新脆弱性。
- "This was basically Vertica's party trick... but they are all fragile to schema updates."(gopalv)
- 不同厂商策略各异:ClickHouse专注CDC加速,Databricks依赖统一存储,Snowflake采用数据镜像扩展。
- "ClickHouse focuses on traditional CDC... Databricks leans on unified storage... Snowflake uses data mirroring CDC."(hasyimibhar)

局限性提醒
- pglake开源但缺少CDC能力,相关扩展仓库已关闭。
- "pg
lake is open source... missing CDC capabilities... closed repository."(jauntywundrkind)
- 用户期待Postgres提供商直接支持镜像数据到Iceberg,以便接入无状态查询引擎。
- "I'm still waiting for a Postgres provider to let me mirror data directly to Iceberg."(hasyimibhar)