Show HN: Streambed – 将Postgres流式传输到S3上的Iceberg,支持Postgres Wire协议
摘要
Streambed是一个开源的CDC引擎,它将Postgres的WAL变更流式传输到S3上的Iceberg表,并内置了一个使用DuckDB的查询服务器,该服务器支持Postgres wire协议。
查看缓存全文
缓存时间: 2026/05/31 19:36
viggy28/streambed
来源:https://github.com/viggy28/streambed
Streambed
CI (https://github.com/viggy28/streambed/actions/workflows/ci.yml) Go 参考 (https://pkg.go.dev/github.com/viggy28/streambed) 许可证
Postgres 到 Iceberg 的 CDC 引擎。将分析查询从生产数据库卸载,无需修改应用程序。
streambed 通过逻辑复制流式传输 WAL 变更,将 Parquet 文件写入 S3,并提交 Iceberg 元数据。使用任何兼容 Iceberg 的引擎查询结果——或者使用内置的查询服务器,该服务器支持 Postgres 线协议,因此你可以用 psql 连接。
实际效果
在 pgbench(100 万个账户,50 万行历史记录)上执行相同的分析查询。左侧是 Postgres,右侧是 Streambed。
演示
无需 ETL,无需 Spark。只需 Postgres + S3。
快速开始
# 本地启动 Postgres + MinIO
docker compose up -d
# 构建
go build -o streambed ./cmd/streambed
# 启动同步 + 查询服务器(监听 :5433)
./streambed sync \
--source-url="postgres://postgres:test@localhost:5432/postgres" \
--s3-bucket="streambed" \
--s3-endpoint="http://localhost:9000" \
--s3-prefix="test" \
--query-addr=:5433
# 通过 Iceberg 查询 Postgres 表
psql -h localhost -p 5433 -U postgres -d postgres
运行 streambed sync --help 查看所有配置选项。所有标志都支持带有 STREAMBED_ 前缀的环境变量(例如 STREAMBED_SOURCE_URL)。
架构
架构图
工作原理
Postgres WAL ──▶ 解码 ──▶ 缓冲 ──▶ Parquet ──▶ S3 ──▶ Iceberg 提交
│
DuckDB ◀──┘ (查询服务器)
Streambed 作为逻辑复制订阅者连接到 Postgres。它解码 WAL 消息(插入、更新、删除),按表缓冲行,并定期将它们刷新为 Parquet 文件并提交 Iceberg 元数据到 S3。更新和删除使用写时复制(copy-on-write)合并现有 Parquet 数据。
查询服务器使用嵌入式 DuckDB 通过 Postgres 线协议暴露 Iceberg 表,因此你可以用 psql 或任何 Postgres 客户端进行查询。
命令
| 命令 | 功能 |
|---|---|
streambed sync | 主守护进程。流式传输 WAL、写入 Iceberg,并可选择提供查询服务。 |
streambed resync --table=public.users | 使用一致快照通过 COPY 一次性回填。 |
streambed query | 独立查询服务器(无需同步)。指向现有的 Iceberg 表。 |
streambed cleanup --table=public.users | 删除表的 S3 对象和状态。在 resync 之前使用。 |
开发
需要 Go 1.22+ 和 CGO(用于 go-duckdb 和 go-sqlite3)。
# 构建
go build -o streambed ./cmd/streambed
# 单元测试
go test ./internal/... ./config/...
# 集成测试(需要 Docker)
./scripts/test-integration.sh
集成测试使用 integration 构建标签,并在 test/integration/docker-compose.yml 中定义的 Postgres(端口 5434)和 MinIO(端口 9002)上运行。
相似文章
我们如何将CDC推送到Postgres
Snowflake的工程博客详细介绍了新的Postgres数据镜像功能,该功能通过snowflake_cdc扩展将更改推送到Iceberg表中,旨在实现弹性、低延迟的事务复制。
@ajassy:处理数据时一直很痛苦的一点是,实时数据和历史数据一直被分隔在不同的……
Amazon Aurora PostgreSQL 现已内嵌 DuckDB,用户可直接对实时业务数据以及存储在 S3 数据湖中、采用 Apache Iceberg 和 Parquet 格式的历史数据进行查询,无需 ETL 管道,也无需数据复制。
Greptime:GreptimeDB Enterprise 现已集成 Apache Iceberg,支持从 Spark、Trino、DuckDB 和 pyiceberg 等引擎查询您的表,无需复制数据。
GreptimeDB Enterprise 与 Apache Iceberg 集成,通过发布基于现有 Parquet 文件的 Iceberg 元数据,使表可以从 Spark、Trino、DuckDB 等引擎查询,无需复制数据。
展示HN: Streambench – 用于Kafka和NATS的原生Mac客户端
Streambench是一个原生macOS桌面应用程序,提供图形用户界面来管理Kafka和NATS JetStream流,具有实时消息跟踪和消费者延迟监控等功能。
将Postgres数据以Parquet格式存储在S3上:LTAP架构解析
Databricks推出Lakebase LTAP架构,将Postgres数据以Parquet格式存储在S3上,无需CDC或镜像即可在单份数据上实现事务与分析。