DuckDB Quack 远程协议完全指南:嵌入式数据库的客户端-服务器方案 HN 190 分热帖

DuckDB——2019 年诞生以来默默征服了无数数据科学家的嵌入式分析型数据库——刚刚做了一个改变游戏规则的举动。2026 年 5 月 12 日,DuckDB 团队宣布了 Quack,一个原生的客户端-服务器远程协议,让 DuckDB 实例之间可以通过 TCP 和 HTTP(S) 互相通信。

这很重要。一直以来 DuckDB 被称作"分析界的 SQLite"——嵌入式、进程内运行,无需独立服务器进程。这个简洁性是它备受数据科学家、Python Notebook 用户和不想搭 PostgreSQL 集群的人喜爱的原因。

但进程内架构有个盲区:无法让多个进程同时写入同一个数据库文件。想从 20 个工作进程插入遥测数据,同时让仪表盘查询同样的表?你需要各种变通方案——自定义 RPC 层、Arrow Flight SQL 适配器,或者搞个"EleDucken"(在 PostgreSQL 里跑 DuckDB)。

Quack 改变了这一切。而且它延续了 DuckDB 的风格:设置简单,基于经过检验的技术(如 HTTP),而且非常快。在 Hacker News 上,这条公告拿到了 190 分,引发了热烈的讨论。

什么是 DuckDB Quack?

Quack 是一个远程查询协议,让 DuckDB 能以客户端-服务器架构运行。名字源自"鸭子之间怎么交流?当然是嘎嘎叫(Quack)"。但协议本身是严肃的工程实践:

Quack 以 DuckDB 扩展形式发布(core_nightly 仓库),包含在 DuckDB v1.5.2 中。支持 TCP 原生连接和 HTTP(S) 隧道两种模式,可以部署在 nginx 等反向代理后面。

为什么 DuckDB 需要客户端-服务器协议

DuckDB 的进程内架构一直是它的超能力——也是它的限制。

优势:没有单独的服务器进程,没有协议开销,不需要配置。pip 安装、Python 导入、毫秒级跑分析查询。这适用于:

劣势:多个进程无法同时安全地写入同一个数据库文件。DuckDB 在主内存中维护状态——跨进程同步这个状态在技术上极其困难。DuckDB 团队在公告文章中坦诚地解释了这一点。

社区构建了各种变通方案:自定义 RPC 层、Arrow Flight SQL 适配器(如 GizmoSQL)、MotherDuck 的专有协议,以及在 PostgreSQL 里跑 DuckDB(pg_duckdb)。这些方案的数量之多,让 DuckDB 团队确信用户真的需要原生的客户端-服务器支持。

"我们把 DuckDB 看作一个通用的数据整理工具。如果这意味着在进程内能力之外再加一个客户端-服务器协议——没问题。如果这会解锁一大批新的使用场景——那太好了。" — DuckDB 团队

Quack 五分钟上手教程

走一遍基本设置流程。你需要两个 DuckDB 实例——一个当服务器,一个当客户端。

第一步:安装 Quack 扩展

两个实例都需要安装 Quack 扩展:

INSTALL quack FROM core_nightly;
LOAD 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 #2)

INSTALL quack FROM core_nightly;
LOAD quack;

CREATE SECRET (
    TYPE quack,
    TOKEN 'super_secret'
);

ATTACH 'quack:localhost' AS remote;

-- 查询远程表
FROM remote.hello;

输出:world。就这样——你完成了第一次通过 Quack 的远程 DuckDB 查询。

向远程实例写入数据

-- 客户端写入远程
CREATE TABLE remote.hello2 AS
    FROM VALUES ('world2') v(s);

然后服务器读取:

FROM hello2;
-- 输出: world2

显式远程查询

对于大数据集上的复杂查询,可以直接把 SQL 发送到远程端执行:

FROM remote.query(
    'SELECT s FROM hello'
);

Quack 协议设计

基于 HTTP

Quack 直接构建在 HTTP 之上。2026 年这是很务实的选择:HTTP 被负载均衡器、防火墙、入侵检测系统和反向代理广泛支持。每个运维工程师都知道如何处理 HTTP 的流量路由、SSL 终止和安全防护。

一个出人意料的附加好处:DuckDB-Wasm 原生支持 Quack。这意味着浏览器里运行的 DuckDB 可以直接通过 Quack 连接到 EC2 服务器上的 DuckDB 实例。

请求-响应模式

交互由客户端驱动,采用请求-响应语义:

序列化

请求和响应使用 MIME 类型 application/duckdb。编码利用了 DuckDB 内部的序列化原语——和预写日志(WAL)使用的是一套东西——经过多年生产验证,非常高效。

往返优化

一个查询从连接到完成只需要一次往返。这对延迟敏感的场景至关重要。批量传输也做了大量优化——DuckDB 称 Quack 是"目前把表数据塞进 socket 最快的办法"。

身份认证和授权

DuckDB 的可扩展理念延伸到了 Quack 的安全模型。Quack 没有试图覆盖每个场景,而是提供了一个可插拔的回调架构:

默认认证

启动时,Quack 服务器会生成随机令牌(或使用你提供的 token)。默认认证回调会比较客户端提供的令牌和服务器端令牌。

自定义认证

你可以替换认证回调。例如:

自定义授权

默认授权函数对一切说"是"。但你可以提供一个回调来检查每个查询,关联认证信息,逐查询决定访问权限。这些回调甚至可以是纯 SQL 宏。

网络安全建议

性能基准:Quack vs PostgreSQL vs Arrow Flight SQL

DuckDB 团队在 AWS m8g.2xlarge 实例上做了测试(8 vCPU,32 GB 内存,最高 15 Gbps 网络,同一可用区,延迟约 0.280 ms)。

批量传输

他们传输了 TPC-H lineitem 表的数据,逐渐增加行数,对比 Quack、PostgreSQL 有线协议和 Apache Arrow Flight SQL(通过 GizmoSQL,内部也用 DuckDB)。中位墙钟时间对比:

行数 Quack PostgreSQL Arrow Flight SQL
600 万行 ~0.8s ~2.5s ~1.1s
6000 万行 ~4.2s ~15s+ ~5.8s

注:数据基于博客内容估算,完整基准方法见原始公告

关键发现:

对比:DuckDB 嵌入式 vs DuckDB Quack vs PostgreSQL vs SQLite

维度 DuckDB (嵌入式) DuckDB Quack PostgreSQL SQLite
架构 进程内 客户端-服务器 客户端-服务器 进程内
查询侧重 分析 (OLAP) 分析 (OLAP) OLTP + 分析 OLTP
多写入者 不支持 支持 支持 有限
部署难度 极简 (pip install) 一条 SQL 启动 安装 + 配置 极简
通信协议 仅 C API Quack (HTTP/TCP) PostgreSQL 有线协议 仅 C API
批量传输 N/A (进程内) 优秀 中等 N/A (进程内)
安全机制 操作系统级 可扩展认证 + 授权回调 用户/密码 + SSL 无 (文件权限)
最佳场景 Notebook、本地脚本 远程分析、数据管道 通用、事务处理 本地存储、移动端

使用场景

数据分析管道

把 DuckDB 作为中央分析服务器运行。多个 ETL 进程写入遥测数据,仪表盘同时查询同一数据库。不再有文件锁的问题。

机器学习数据管道

从 DuckDB 获取训练数据的 ML 管道现在可以直接查询远程实例。不同机器上的特征工程脚本可以共享一个 DuckDB 服务器。

远程查询大数据集

不用把 6000 万行数据传到你的分析机器上——数据留在服务器端,远程查询即可。Quack 的流式协议让你只拉取需要的数据。

微服务架构

一个服务可以跑 DuckDB 作为轻量级分析后端,其他服务通过 Quack 查询,无需各自嵌入 DuckDB。

浏览器端分析

DuckDB-Wasm 支持 Quack 后,你可以构建浏览器端分析仪表盘,直接查询远程 DuckDB 服务器——不需要后端中间件。

生产环境部署方案

方案一:直连 TCP(本地网络)

同一机器或同一 VPC 内通信,直接 TCP 配合自动生成的令牌即可。默认绑定 localhost,对内部流量安全。

方案二:HTTP(S) 隧道 + 反向代理

公开访问或跨网络访问时,在 Quack 前面放 nginx:

  1. 配置 nginx 代理 /quacklocalhost:9494
  2. 用 Let's Encrypt 终止 TLS
  3. 在代理层添加 IP 白名单或额外认证

方案三:WebSocket 给浏览器客户端

如果客户端用 DuckDB-Wasm 在浏览器中运行,Quack over HTTP 支持直接连接。

常见问题

Quack 可以上生产了吗?

Quack 在 DuckDB v1.5.2 中以 core_nightly 扩展发布。团队认为对很多工作负载已经稳定可用,但毕竟还是 1.x 版本的协议,上生产前建议充分测试。

Quack 会替代进程内架构吗?

不会。Quack 是补充而非替代。进程内架构仍然是 DuckDB 的主要模式,适用于 Notebook、脚本和单用户应用。Quack 在你需要多进程并发访问或远程查询时才上场。

Quack 和 DuckDB 已有的 PostgreSQL 协议支持冲突吗?

不冲突。DuckDB 已经支持 PostgreSQL 有线协议,让现有 PostgreSQL 客户端和工具可以连接。Quack 是独立的 DuckDB 原生协议,在 DuckDB 专属工作负载上有更好的性能——特别是批量分析数据传输。

总结

DuckDB Quack 代表了对嵌入式分析型数据库的一次深思熟虑的进化。团队没有牺牲 DuckDB 的核心身份——它仍然是上手最快的数据分析工具。但他们认识到"通用数据整理工具"有时候也确实需要能当服务器跑。

协议设计很务实:基于 HTTP 以获得通用工具兼容性,可扩展的回调认证以获得灵活部署,以及针对 DuckDB 最擅长的分析工作负载做了深度优化的批量传输。与 PostgreSQL 和 Arrow Flight SQL 的基准测试确认了 Quack 不只是兼容功能——它有实实在在的性能优势。

对于已经在使用 DuckDB 做数据管道、ML 工作流和分析的团队,Quack 移除了最大的架构限制——单进程约束。你现在可以把 DuckDB 不仅当作一个嵌入的库,也可以当作一个可以部署的服务。

这打开了大量有趣的想象空间。

标签: DuckDB, Quack 协议, 客户端-服务器, 分析型数据库, 远程协议, 嵌入式数据库, PostgreSQL, SQLite, Arrow Flight SQL, 基准测试, 数据库架构