世界を動かす技術を、日本語で。

クワック: DuckDB クライアント-サーバープロトコル

2026年5月13日原文(duckdb.org)

概要

  • DuckDBに新しいリモートプロトコル「Quack」導入
  • クライアント・サーバ型で複数同時書き込み対応
  • HTTPベースでシンプルかつ高速な設計
  • 認証や認可も拡張性を重視
  • ベンチマークで高い転送性能を実証

DuckDBのQuackプロトコル発表

  • DuckDBチーム が新リモートプロトコル「 Quack」を発表
  • DuckDBインスタンス同士が クライアント・サーバ型 で通信可能
  • 複数同時書き込み や遠隔地からの利用に対応
  • 設定が非常に シンプル で、 HTTP 技術を活用した設計
  • 高速通信 を実現し、大規模バルク操作から小規模トランザクションまで対応

従来のデータベースアーキテクチャ

  • 1980年代に Sybase がクライアント・サーバ型アーキテクチャを導入
  • 以降、多くのDBが クライアント・サーバ型通信プロトコル を採用
  • SQLiteDuckDB はインプロセス型で独自路線を維持
  • インプロセス型は データサイエンス用途 やアプリ組み込みに最適
  • 複数プロセスから同時にDBファイルを操作する用途には 制約

DuckDBにおける課題とワークアラウンド

  • DuckDBは メモリ上の状態管理 が重要で、複数プロセスでの同時変更は困難
  • カスタムRPCやArrow Flight SQL等で クライアント・サーバ型 を後付けする事例が多発
  • MotherDuck なども独自プロトコルを提供
  • PostgreSQL拡張(例: pg_duckdb)による間接利用も存在
  • 多数のワークアラウンドが存在し、 公式サポートの必要性 が認識される

Quackプロトコルの概要

  • Quack はDuckDBインスタンス間の通信専用プロトコル
  • DuckDB v1.5.2 以降で利用可能、 core_nightly リポジトリから拡張導入
  • インスタンスは クライアント/サーバ両方 の役割を持つ
  • 認証トークン によるセキュリティ確保
  • localhost バインドがデフォルトで安全性重視

Quackの利用例

  • 双方のDuckDBで quack拡張 のインストールとロード
  • サーバ側で quack_serve、クライアント側で ATTACH してリモートDB利用
  • リモートテーブル の参照やデータコピーが容易
  • query関数 で複雑なクエリもリモート実行可能

プロトコル設計と技術的特徴

  • HTTPベース で構築、既存のネットワークインフラと親和性高
  • リクエスト・レスポンス型 で全通信を管理
  • 独自MIMEタイプ application/duckdb で効率的なシリアライズ
  • 暗号化 は基本的にローカル用途で不要、公開する場合はnginx等でSSL推奨
  • 1ラウンドトリップ でクエリ処理を完結できる低遅延設計
  • バルク転送最適化 で数百万行を数秒で転送可能

認証・認可の拡張性

  • デフォルトでは ランダム認証トークン を自動生成
  • 認証・認可コールバックは ユーザー独自実装 も可能
  • SQLマクロ によるコールバックもサポート
  • デフォルト認可は全許可だが、細かな制御も実現可能

ポート番号と接続設定

  • デフォルトポート9494 でリッスン
  • 94は Netscape Navigator リリース年に由来し覚えやすい

ベンチマーク結果

  • AWS m8g.2xlarge (8vCPU/32GB RAM/15Gbps帯域)環境で検証
  • 同一データセンター内 の異なるマシン間でテスト
  • Ping平均0.280msの低遅延ネットワーク
  • PostgreSQLプロトコルArrow Flight SQL と比較し、Quackが 最速のテーブル転送性能 を発揮

まとめ

  • Quackプロトコル によりDuckDBは クライアント・サーバ型 運用が公式サポート
  • シンプル・高速・拡張性 を兼ね備え、多様なユースケースに対応
  • 詳細は 公式ドキュメント 参照

Hackerたちの意見

DuckDBは好きだけど、何を目指しているのかよくわからないな。使い方が常に新しくて、正しい使い方を見つけるのが難しい。

+1 これとArrow Flightの使い道って、データを移動させる以外にあまり思いつかないな。

私たちのデータパイプラインは、アプリがダウンロードする.duckdbファイルを生成してるんだ(S3のアセットを監視して、etagが変わったら引っ張ってくる)。これで、BQやClickhouseみたいなパフォーマンスを、インフラを運用したりお金を払ったりせずに得られるから楽だよ。すべてのケースに完璧ではないけど、思っている以上に多くのことをこなしてくれる。

「DuckDBがPostgresになりたい」ってよりは、DuckDBが大きなワークフローの中の実行レイヤーになっていく感じかな。エンジン自体はもうそんなに苦痛じゃないし、周りのことが問題なんだよね。ライブDBやS3パス、Parquetファイル、認証情報、繰り返し実行、エクスポート、バリデーション、そして一度きりのスクリプトがいつの間にかインフラになる瞬間。Quackはリモートやサーバー部分をクリーンにしてくれるけど、全体的な流れとしてはDuckDBがツールの中のSQLレイヤーになっていく感じで、必ずしも最終的なユーザー向けのツールになるわけじゃないと思う。

DuckDBはスタンドアロンでもあり、コンポーネントでもある。この取り組みは実際にとても整合性があって、伝統的なクライアントサーバーRDBMSの使い方に戻してくれるね。RDBMSは常にマルチユーザーの同時システムだったし。DuckDBは非常に高速なローカルエンジンで、他のシステムに埋め込めるから、使い道がたくさんあるんだ。SQLiteが何になりたいかって言ってるようなもんだよね。スマホやブラウザ、デスクトップアプリ、IoTデバイスに入ってて、人々は色んな方向に拡張してる。ここでの唯一の違いは、これはファーストパーティーであってサードパーティーじゃないってこと。でも、私にとっては非常に分かりやすい動きだと思う。

チームの共有サーバーに置きたい小規模な内部分析用データセットには便利そうだね。ホームラボで使うのを探ってみるのもアリかも。

ducklakeを使えば、マルチテラバイトのデータセットにもスケールするよ。このサーバープロトコルの大きな利点は、高メモリサーバーを共有して、最近のデータに対して共有キャッシュを活用できることだね。

DuckDBをDuckLakeのカタログデータベースとしてQuackと一緒に使えますか? > まだだけど、今取り組んでるよ!ニッチな使い方みたいだけど、私が一番興味あるやつだね。私たちのレイクハウスは、カタログとしてPostgresを使ってducklakeを利用してる。DuckDB/Quackのカタログは素晴らしい代替手段になりそう。

そうなんだ、実際に取り組んでるよ: https://github.com/duckdb/ducklake/pull/1151 だから、数日中にはテストできるようになるよ。

Quackは将来的にDuckLakeのカタログの主要な選択肢になると思う。いくつか理由を挙げると、1. インライン時の型の不一致がない。非DuckDBカタログを使うと、多くの型が1:1のマッピングがなくて、データ型を操作する際に追加のオーバーヘッドが発生する。2. カタログに対してDuckDBの分析(今はトランザクションも)をそのままのパフォーマンスで得られる。DuckDBがDuckDBを読むのは、私たちのPostgres/SQLiteスキャナーよりも単純に速い。3. リトライのための往復がない。DuckDBサーバー側で完全なリトライロジックを簡単に(tm)実行できる。今は、これらのリトライがPostgresで複数の往復を引き起こしていて、高い競合のワークロードではパフォーマンスのボトルネックになってる。注意:私はduckdb/ducklakeの開発者です。

これ、すごいね!うちの会社の内部アプリフレームワークでDuckDBを使おうと思ってたんだけど、「どうやって水平スケールするの?」って問題が解決したよ。DuckDBの人たちに感謝!プロトコル名の「Quack」も好きだな。

C++のアプリを持ってるんだけど、実行中は全てメモリにあるんだ。セッション間でXMLとしてディスクに保存してる。すごくうまくいってるけど、厳密に言うとシングルユーザー専用で、顧客の中には複数の同時ユーザーが読み書きできるようにしてほしいって人もいるんだ。パフォーマンス要件はかなり低くて、数千レコードを2、3人が同時に更新する程度なんだけど。DuckDB + Quackはこれに良い選択肢になるかな?それとも他にもっといい選択肢がある?SQLiteも見たけど、クライアントサーバーとしては動かないって聞いた。

Hacker Newsで議論の続きを見る