DuckDB Quack 协议发布:DuckDB 也能当服务器跑了

DuckDB 官方发布 Quack 远程协议——DuckDB 实例之间可以互相通信,支持多客户端并发写入。告别自定义 RPC 的方案,一个扩展搞定客户端-服务器模式。本文深入解读 Quack 的原理、用法和实战场景。

等等,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