Show HN: Streambed – 将Postgres流式传输到S3上的Iceberg,支持Postgres Wire协议

Hacker News Top 工具

摘要

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)上运行。

相似文章