Quack: 為 DuckDB 引入客戶端-伺服器架構

多年來,DuckDB 一直致力於推廣進程內 (in-process) 架構。透過消除客戶端與伺服器之間的隔閡,它為數據科學家和開發者提供了一個直接存在於其應用程式或筆記本中的低延遲、高性能工具。然而,這種設計也造成了一個根本性的限制:難以同時從多個進程修改單個數據庫文件。

為了解决這個問題,DuckDB 團隊推出了 Quack,一種專用的客戶端-伺服器協定。Quack 允許 DuckDB 實例之間相互通信,將 DuckDB 從一個嚴格的本地工具轉變為一個多功能的系統,能夠支持集中式狀態和並發遠程訪問。

需要遠程協定

進程內系統在交互式分析方面表現出色,但在遙測數據收集或儀表板展示方面則顯得吃力,因為在這些場景中,多個進程必須寫入同一個數據集。雖然用戶以前依賴於各種變通方法——例如自定義的 RPC 層、Arrow Flight SQL 協定,或將 DuckDB 包裝在 PostgreSQL 中(即所謂的 "EleDucken" 方法)——但對原生解決方案的需求已變得不可忽視。

Quack 被設計為一個 "通用數據處理工具",在提供伺服器管理的可變狀態之優點的同時,保持了用戶對 DuckDB 所期望的簡潔與速度。

Quack 如何運作

Quack 允許任何 DuckDB 實例充當客戶端或伺服器。設置通過一個 DuckDB 擴展來完成,使用戶能夠服務於一個數據庫並使用簡單的 SQL 命令遠程連接到它。

核心技術設計

  • 基於 HTTP: Quack 構建於 HTTP 之上,確保了與現有負載均衡器、防火牆和身份驗證系統的兼容性。這種選擇也使得 DuckDB-Wasm 能夠原生支持 Quack,允許基於瀏覽器的實例直接連接到遠程伺服器。
  • 請求-響應模式: 該協定遵循客戶端驅動的請求-響應模型。它針對低延遲進行了優化,允許查詢在單次往返中完成。
  • 自定義序列化: Quack 沒有使用外部交換格式,而是使用了一種新的 MIME 類型 application/duckdb。這利用了 DuckDB 的內部序列化原語(與其 Write-Ahead Log 使用的相同),允許團隊在不受到外部格式限制的情況下,對數據類型進行創新。
  • 安全性: 默認情況下,Quack 在啟動時會生成一個隨機身份驗證令牌,並綁定到 localhost。對於生產環境,團隊建議使用 Nginx 等反向代理來處理 SSL 終止。

可擴展的身份驗證與授權

Quack 並非構建一個僵化的權限系統,而是使用了一種基於回調 (callback) 的模型。身份驗證(驗證用戶是誰)和授權(決定他們可以做什麼)都可以通過用戶提供的代碼或甚至是簡單的 SQL 宏來覆蓋,從而使其能夠與 LDAP 或自定義的文本文件身份驗證集成。

性能基準測試

為了驗證該協定,團隊在 AWS m8g.2xlarge 實例上將 Quack 與 PostgreSQL 和 Arrow Flight SQL 進行了對比測試。

大規模數據傳輸

Quack 在移動大量數據時展現了顯著優勢。在傳輸 TPC-H lineitem 表的測試中,Quack 僅用 4.94 秒 就移動了 6000 萬行數據(CSV 格式下為 76 GB),表現遠超 Arrow Flight (17.40s) 和 PostgreSQL (158.37s)。

小規模寫入吞吐量

在針對多線程進行小規模、隨機 INSERT 事務的測試中,Quack 在低併發場景下出人意料地優於 PostgreSQL,在 8 個線程中達到了約 5,500 筆事務每秒。雖然 PostgreSQL 在超過 8 個線程時擴展性更好,但 Quack 為集中化可觀測性數據和遙測數據提供了極高效的路徑。

為什麼不使用 Arrow Flight SQL?

鑑於 Arrow Flight SQL 協定的存在,決定構建自定義協定是經過深思熟慮的。團隊提出了兩個主要原因:

  1. 對創新的控制權: 使用外部交換格式會限制 DuckDB 的快速添加新數據類型或協定消息的能力。
  2. 單次往返效率: Arrow Flight SQL 對於每個查詢至少需要兩次往返 (CommandStatementQueryDoGet)。Quack 被設計為單次往返執行,這對於對延遲敏感的小規模更新至關重要。

前景展望

Quack 目前可在 core_nightly 倉庫中獲取,並計劃在 2026 年秋季隨 DuckDB v2.0 一起發布生產版本。未來的發展包括:

  • DuckLake 集成: 使用遠程 DuckDB 伺服器作為 DuckLake 目錄,以提高性能和數據內聯 (inlining) 性能。
  • 擴展併發性: 改進核心引擎以支持顯著多於八個並行插入線程。
  • 複製: 在 Quack 之上開發複製協定,以實現讀副本集群。

通過彌合進程內效率與客戶端-伺服器靈活性之間的差距,Quack 將 DuckDB 定位為現代數據架構的核心構建塊,而不僅僅是一個用於本地分析的利基工具。

Sources