← 返回信息流
AI 资讯Hacker News·3 天前

Show HN: Streambed实现Postgres至S3 Iceberg流式传输

原标题:Show HN: Streambed – Stream Postgres to Iceberg on S3, Supports Postgres Wire

速览

Streambed是一个开源工具,支持Postgres Wire协议,能够将Postgres数据库中的数据实时流式传输到Amazon S3上的Apache Iceberg表中。该工具简化了数据仓库的构建流程,实现了关系型数据库与数据湖之间的无缝集成。

AI 深度解读

Show HN: Streambed – 将 Postgres 流式同步至 S3 上的 Iceberg,支持 Postgres 协议

背景

在现代数据架构中,生产数据库(如 Postgres)通常承担着在线交易处理(OLTP)的重任。然而,随着数据量的增长,直接在生产数据库上执行复杂的分析查询(OLAP)往往会拖慢业务性能,影响用户体验。传统的解决方案通常涉及构建复杂的 ETL(提取、转换、加载)管道,或使用 Spark 等重型大数据工具进行数据同步和转换。这种方式不仅维护成本高,而且引入了额外的延迟和系统复杂性。

为了简化这一过程,开发者希望有一种机制,能够直接从生产数据库的日志中捕获变更,并将其高效地转换为分析友好的格式,同时保持与现有工具链的无缝集成。Streambed 正是在这种背景下诞生的开源项目,旨在提供一种轻量级、无 ETL 的解决方案,将 Postgres 的分析负载卸载到 S3 上的 Iceberg 表中。

核心内容

Streambed 是一个 Postgres 到 Iceberg 的 CDC(变更数据捕获)引擎。它的核心目标是让用户在不修改现有应用程序代码的情况下,将分析查询从生产数据库卸载到 S3 上的 Iceberg 数据湖中。

工作原理与架构

Streambed 通过逻辑复制(Logical Replication)连接到 Postgres,作为逻辑复制订阅者运行。其数据处理流程如下:

  1. WAL 解码:Streambed 读取 Postgres 的 WAL(Write-Ahead Log)消息,解码其中的插入、更新和删除操作。
  2. 缓冲与合并:它按表缓冲行数据。对于更新和删除操作,Streambed 采用“写时复制”(copy-on-write)机制,将变更合并到现有的 Parquet 数据中。
  3. 写入 S3:定期将缓冲的数据刷新为 Parquet 文件,并上传至 S3。
  4. Iceberg 元数据提交:在文件上传完成后,提交 Iceberg 元数据,使新数据对查询引擎可见。

查询接口与兼容性

Streambed 不仅是一个数据同步工具,还内置了一个查询服务器。该服务器使用嵌入式的 DuckDB 引擎,通过 Postgres 有线协议(Postgres wire protocol)暴露 Iceberg 表。这意味着用户可以使用标准的 psql 或任何支持 Postgres 协议的客户端直接查询数据,而无需学习新的查询语言或配置复杂的 BI 工具连接。

性能对比

根据官方提供的基准测试(使用 pgbench,包含 100 万账户和 50 万历史行),在相同的分析查询下,Streambed(右侧)在处理性能上优于直接查询 Postgres(左侧),证明了其卸载分析负载的有效性。

技术栈与构建要求

  • 语言:Go (需要 Go 1.22+)
  • 依赖:CGO (用于支持 go-duckdb 和 go-sqlite3)
  • 存储后端:S3 兼容存储(如 MinIO)

快速开始示例

开发者可以通过 Docker Compose 快速启动 Postgres 和 MinIO 环境,然后构建并运行 Streambed:

# 启动本地 Postgres + MinIO
docker compose up -d

# 构建 Streambed
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_(例如 STREAMBED_SOURCE_URL)。

关键要点

  • 零 ETL 依赖:无需构建复杂的 ETL 管道或使用 Spark,仅依赖 Postgres 和 S3 即可完成数据同步和分析。
  • Postgres 协议兼容:内置查询服务器支持 Postgres 有线协议,允许使用 psql 或现有 BI 工具直接查询 Iceberg 表,降低了使用门槛。
  • CDC 驱动:基于 Postgres 的逻辑复制机制,实时捕获 WAL 变更,确保数据的一致性。
  • 写时复制合并:在处理更新和删除操作时,采用 copy-on-write 策略合并 Parquet 数据,保证数据准确性。
  • 轻量级架构:使用 Go 编写,依赖嵌入式的 DuckDB 进行查询处理,避免了重型大数据组件的开销。
  • 易于测试与部署:提供完整的单元测试和集成测试脚本,支持通过 Docker 快速搭建测试环境。

意义与影响

Streambed 的出现为中小规模数据团队提供了一种极简的数据湖集成方案。它解决了长期存在的“生产数据库与分析负载冲突”问题,使得团队可以在不重构应用架构的前提下,轻松实现读写分离和数据湖建设。

通过支持 Postgres 有线协议,Streambed 极大地降低了数据分析师和工程师的学习成本,使他们能够利用熟悉的工具链直接访问最新的数据湖数据。这种“Postgres + S3”的组合,结合 Iceberg 的开放格式,为构建低成本、高性能的现代数据架构提供了新的可能性,特别适用于那些希望避免重型大数据基础设施复杂性的场景。

查看原文 →github.com