← На главную

Streambed стримит Postgres в Iceberg через WAL — аналитика через psql

31.05.2026 18:43 · hackernews

Streambed — это CDC-движок, который перегоняет изменения из Postgres в Iceberg. Он снимает аналитические запросы с production-базы, не трогая приложение. Работает через логическую репликацию: читает WAL (insert, update, delete), буферизует строки по таблицам, а потом сбрасывает их в Parquet-файлы на S3 и фиксирует метаданные Iceberg. Update и delete реализованы через copy-on-write — мерж с существующими Parquet-данными. Всё это без ETL и Spark: достаточно Postgres и S3.

У Streambed есть встроенный query-сервер на DuckDB, который выставляет Iceberg-таблицы через протокол Postgres. Можно подключаться любым клиентом, даже обычным psql, и выполнять те же аналитические запросы, которые раньше грузили продакшен-базу. На pgbench (1 млн аккаунтов, 500 тыс. строк истории) разница видна сразу: Postgres слева, Streambed справа.

Основная команда — streambed sync. Это демон, который стримит WAL, пишет Iceberg и опционально запускает query-сервер. Параметры: --source-url (строка подключения к Postgres), --s3-bucket, --s3-endpoint, --s3-prefix, --query-addr. Все флаги можно задать через переменные окружения с префиксом STREAMBED_. Пример запуска: docker compose up -d для локального Postgres + MinIO, потом go build -o streambed ./cmd/streambed и ./streambed sync .... После этого — psql -h localhost -p 5433 и можно делать запросы к своим Postgres-таблицам через Iceberg.

Есть ещё вспомогательные команды: streambed resync --table=public.users — однократный backfill через COPY под консистентным снэпшотом; streambed query — standalone query-сервер без синка, указывает на существующие Iceberg-таблицы; streambed cleanup --table=public.users — удаляет S3-объекты и состояние таблицы, полезно перед resync.

Сборка требует Go 1.22+ и CGO (из-за зависимостей go-duckdb и go-sqlite3). Есть юнит-тесты (go test ./internal/... ./config/...) и интеграционные тесты с Docker (запускаются скриптом ./scripts/test-integration.sh, используют порты 5434 для Postgres и 9002 для MinIO). Исходники на GitHub.

Читать оригинал →