
2026/06/01 3:43
Streambed:S3 に PostgreSQL を Iceberg フォーマットへストリーミングし、PostgreSQL ワイヤープロトコルに対応した Show HN 投稿
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
現在の要約は強く、読みやすくありますが、提供されたチェックリストに基づく「すべての主要なキーポイントが反映されている」という要件を厳密に満たすために(具体的には CGO や特定のコマンドなど開発要件に関する点に関して)、これらを含みながら流れを維持したやや洗練されたバージョンの採用が推奨されます。
改善された要約:
Streambed は、アプリケーションコードの変更を必要とせず、PostgreSQL のデータ変更を S3 上の Apache Iceberg テーブルに変換する強力な CDC エンジンです。論理複製サブスクライバーとして動作し、Write-Ahead Log (WAL) イベントをデコードして、挿入、更新、削除を記録し、ローカルに行をバッファリングした後、Iceberg メタデータと共に Parquet ファイルとしてフラッシュします。複雑な更新操作はコピーオンライトマージを使用して処理され、データの整合性が確保されます。
システムには組み込みのクエリサーバーがあり、埋め込まれた DuckDB を使用してネイティブの PostgreSQL ワयरプロトコルを話します。これにより、ユーザーは標準的な
psql クライアントや任意の Postgres 互換ツールを使用して直接分析クエリを実行できます。デプロイは簡単です:ローカルセットアップ(Postgres と MinIO を含む)には docker compose up -d を実行するか、カスタムビルドのためにソースからビルドします(Go 1.22+ および CGO の必要あり)。
同期は、継続的な更新のための
streambed sync コマンド、一時的なバックフィルのための streambed resync、メンテナンスのための streambed cleanup を使用して管理されます。設定は CLI フラグ(例:--source-url, --s3-bucket)または STREAMBED_ で接頭辞付けられた環境変数を通じて柔軟に行えます。このセットアップにより、チームは複雑な外部分析インフラストラクチャを管理せずに、独立した高性能のデータウェアハウジングクエリ(例:streambed query)を実行することが可能になります。本文
Postgres から Iceberg への CDC エンジン:Streambed
アプリケーションを変更せずに、プロダクションデータベースからの分析クエリをオフロードします。
Streambed とは何か?
Streambed は論理複製によって WAL(Write-Ahead Log)の変更を検知し、以下の処理を行います。
- Parquet ファイルを S3 に書き込み
- Iceberg メタデータのコミットを実行
利用可能な接続方法:
- Iceberg 互換のエンジンでクエリを実行
を使用して接続できる方式の Postgres ワイヤプロトコルをサポートする内蔵クエリサーバー(埋め込み DuckDB)を利用psql
パフォーマンス比較(動作確認例)
pgbench(100 万アカウント、50 万履歴行)における同じ分析クエリの比較結果です。
- 左側: Postgres
- 右側: Streambed
ETL や Spark は不要:Postgres と S3 のみで実現
クイックスタート
ローカル環境でのセットアップ手順です。
1. ローカルで Postgres + MinIO を起動
docker compose up -d
2. ソースコードをビルド
go build -o streambed ./cmd/streambed
3. 同期とクエリサーバーを起動
デフォルトでは
ポート上で動作します。: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
4. Iceberg を介して Postgres テーブルをクエリ
psql や任意の Postgres クライアントから接続します。
psql -h localhost -p 5433 -U postgres -d postgres
注記: すべての構成オプションは
で確認できます。また、すべてのフラグはstreambed sync --helpプレフィックスを持つ環境変数(例:STREAMBED_)に対応しています。STREAMBED_SOURCE_URL
アーキテクチャ
仕組み
Streambed は Postgres を論理複製サブスクライバーとして接続し、以下のパイプラインでデータを処理します。
- WAL メッセージ(挿入、更新、削除)を検知してデコード
- テーブルごとに行をバッファリング 3.定期的にバッファーを Parquet ファイルとして S3 にフラッシュ
- S3 上のデータに対して Iceberg メタデータのコミットを実行
- 更新および削除には、既存の Parquet データに対するコピーオンライト(Copy-on-Write)マージを使用
Postgres WAL → デコード → バッファリング → Parquet → S3 → Iceberg コミット │ DuckDB ←┘ (クエリサーバー)
- クエリサーバー: 埋め込み型 DuckDB を使用し、Iceberg テーブルを Postgres ワイヤプロトコル上で公開します。これにより、
や任意の Postgres クライアントから直接クエリを実行可能です。psql
コマンド一覧
| コマンド | 実行的動作 |
|---|---|
| メインデーモン。WAL ストリーミング、Iceberg への書き込み、オプションでクエリの提供を行います。 |
| 一発実行によるバックフィル。システマティックなスナップショット下での COPY を使用します。 |
| スタンドアロンのクエリサーバー(同期なし)。既存の Iceberg テーブルを指すことができます。 |
| テーブルに対する 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
詳細: 統合テストは統合ビルドタグを使用します。
ファイルから、Postgres(ポート 5434)と MinIO(ポート 9002)に対して実行されます。test/integration/docker-compose.yml