等等,DuckDB 不是"嵌入式"数据库吗?
没错,DuckDB 从 2019 年诞生起,一直标榜自己是 in-process(进程内)架构——没有客户端,没有服务器,没有通信协议,直接通过底层 API 调用。这在数据科学、Python notebook、嵌入式分析等场景下简直完美。
但有一个痛点一直没解决:多个进程同时写同一个数据库文件怎么办?
比如:
- 你有一堆采集程序在往同一个 DuckDB 里写数据
- 同时还有一个仪表盘在查这些表
- 两个进程同时写 → 崩了 😅
以前怎么办?要么自己搭个 RPC 服务,要么用 Arrow Flight SQL 协议,要么投奔 MotherDuck,要么(叹气)切到 PostgreSQL。
2026 年 5 月 12 日,DuckDB 官方终于出手了——Quack 协议正式发布。
什么是 Quack?
Quack 是 DuckDB 之间的通信协议。两只鸭子怎么说话?Quack(嘎嘎)!所以 DuckDB 实例之间通信的协议就叫 Quack,非常合理 😄
一句话: 现在你可以把 DuckDB 当服务器跑,其他 DuckDB 实例当客户端连上来读写数据。
Quack 有几个关键特性:
- 基于 HTTP——不走私有协议,防火墙友好
- 支持多客户端并发写入——终于解决了一直以来的痛点
- 支持认证——通过 token 保证安全
- 数据格式用 Arrow——零拷贝、高性能
- 支持查询和下推操作——不只是简单的读写
快速上手
需要两个 DuckDB 实例(v1.5.2 以上),装 Quack 扩展:
服务端(DuckDB #1)
INSTALL quack FROM core_nightly;
LOAD quack;
CALL quack_serve(
'quack:localhost',
token = 'super_secret'
);
CREATE TABLE hello AS
FROM VALUES ('world') v(s);
就三行代码,DuckDB 变成了一个服务器,监听 quack:localhost 地址,等待客户端连接。
客户端(DuckDB #2)
INSTALL quack FROM core_nightly;
LOAD quack;
CREATE SECRET (
TYPE quack,
TOKEN 'super_secret'
);
ATTACH 'quack:localhost' AS remote;
FROM remote.hello;
输出:
world
看到了吗?客户端直接查询了服务端上的表,就像查本地表一样自然。
不只是查询——写入、DDL、全部支持
Quack 不是只读的。客户端也可以写入:
-- 在远程写入数据
CREATE TABLE remote.hello2 AS
FROM VALUES ('world2') v(s);
-- 查一下确认
FROM remote.hello2;
输出:
world2
也就是说,你可以把 Quack 当作一个全功能的数据库连接来用——CRUD、DDL、事务,全部支持。
适合什么场景?
Quack 解锁了一大波之前 DuckDB 搞不定的场景:
| 场景 | 以前怎么办 | 现在 |
|---|---|---|
| 多进程写入同一个库 | ❌ 不行,会崩溃 | ✅ Quack 做服务端,多客户端并发写 |
| 仪表盘实时查询+后台写 | ❌ 只能单进程 | ✅ 一个 Quack 服务端,N 个客户端 |
| 微服务间共享数据 | 搭自定义 RPC | ✅ 原生 ATTACH 语法 |
| 远程数据分析 | SCP 传文件 | ✅ ATTACH 远程实例直接查 |
| 嵌入式设备采集数据统一入库 | 逐个文件合并 | ✅ 批量 INSERT 进同一个 Quack 服务 |
底层原理简介
Quack 协议是这样工作的:
客户端 服务端
│ │
│── HTTP POST ──────→ │ (查询请求, Arrow格式)
│ │
│←── Arrow Stream ──→ │ (流式返回数据)
│ │
│── HTTP POST ──────→ │ (写入请求)
│←── Affected Rows ── │ (返回影响行数)
- 通信层:HTTP + Arrow,不是套接字,不是二进制协议
- 数据格式:Arrow,零拷贝传输,高性能
- 认证:配置一个 secret token,简单但够用
- 寻址:
quack:host:port格式,支持localhost和远程地址
相比 PostgreSQL 的 wire protocol,Quack 轻量得多;相比 Arrow Flight SQL,Quack 更贴近 DuckDB 的使用习惯。
注意:Quack 目前还在
core_nightly仓库中,并非默认扩展。DuckDB 团队明确表示这是"初版",后续会持续改进。
动手试试
装个 DuckDB v1.5.2,开两个终端窗口:
终端 1(服务端):
# 启动后挂起,等待客户端连接
duckdb -c "
INSTALL quack FROM core_nightly;
LOAD quack;
CALL quack_serve('quack:localhost', token = 'my_token');
CREATE TABLE events AS SELECT 1 AS id, 'test' AS name;
SELECT 'Server ready!' AS status;
"
终端 2(客户端):
duckdb -c "
INSTALL quack FROM core_nightly;
LOAD quack;
CREATE SECRET (TYPE quack, TOKEN 'my_token');
ATTACH 'quack:localhost' AS remote;
FROM remote.events;
"
如果看到 1│test 输出,恭喜你,两个 DuckDB 已经通过 Quack 协议成功通话了!
总结
Quack 是 DuckDB 发展史上的一个重要里程碑。它不是在否定"进程内架构"的优势——对于单机数据分析,in-process 依然是 DuckDB 的核心竞争力。但当你需要多进程协作、远程访问、实时更新共享数据时,Quack 提供了一个优雅的原生方案。
安装很简单,语法很 DuckDB,性能很 Arrow。一句话总结:该快的时候快,该连的时候连。
原文:https://duckdb.org/2026/05/12/quack-remote-protocol