在網上看到韓國公司開發的一款GooseDB,DuckDB? 的功能擴展分支,具有服務器/客戶端、多會話和并發寫入支持,使用 PostgreSQL 有線協議,但它是Freeware而不是開源,所以讓DeepSeek實現之。
首先把readme頁面發給他翻譯,并讓他據此寫一個設計方案,看上去頭頭是道。
GooseDB:為協同數據分析而強化的DuckDB
GooseDB是基于DuckDB的強大功能擴展版本,旨在將協同數據分析提升至新高度。
在繼承DuckDB卓越速度與分析能力的基礎上,GooseDB針對現代數據工作流引入了關鍵增強功能,
包括服務器/客戶端架構、多會話支持和并發寫入能力,同時全面兼容強大的PostgreSQL有線協議。
核心特性:
? 服務器/客戶端架構:GooseDB將DuckDB升級為真正的客戶端-服務器數據庫,允許多用戶同時連接并交互同一數據庫實例,
為協同數據探索與分析開辟了新可能。
? 多會話支持:通過支持多并發會話,團隊可并行處理同一數據,優化工作流程并促進協作。
? 并發寫入能力:與原生DuckDB不同,GooseDB支持并發寫入,在保持高性能的同時實現實時數據更新與注入,
這對需要持續數據更新的應用至關重要。
? PostgreSQL有線協議:采用廣泛使用的PostgreSQL有線協議,確保與現有數據庫工具、客戶端及庫生態系統的無縫集成,
降低了熟悉PostgreSQL用戶的學習成本。
? 增強的性能:保留DuckDB在分析查詢方面的卓越性能,即使處理復雜數據集也能提供極速響應。
? 與現有DuckDB生態無縫集成:保持與現有DuckDB API及數據格式的兼容性,用戶可輕松遷移現有項目。
使用優勢:
? 強化協作:支持團隊實時協同進行數據分析項目。
? 改進數據管理:通過并發寫入支持簡化數據注入與更新流程。
? 簡化集成:利用PostgreSQL協議與現有工具無縫對接。
? 提升效率:借助更快的查詢性能和協作工作流提高生產力。
? 可擴展性:通過改進的并發與服務器架構處理更大數據集和復雜工作負載。
適用場景:
? 協同數據科學:助力數據科學團隊共同開展數據探索、模型開發與分析。
? 實時數據分析:為需要即時洞察的應用提供實時數據注入與分析能力。
? 商業智能:為業務用戶提供強大的協同數據分析與報告平臺。
? 數據倉庫:構建支持并發寫入和大數據集的高性能數據倉庫。
軟件設計方案(基于技術文檔特性提煉)
1. 架構設計
- 客戶端-服務器模型:采用多線程服務器架構,通過TCP/IP協議監聽客戶端連接,使用PostgreSQL有線協議實現通信規范化
- 連接池管理:實現會話管理器(Session Manager)維護多用戶連接狀態,支持會話隔離和資源分配
- 并發控制層:
- 寫操作:通過行級鎖+多版本并發控制(MVCC)實現并發寫入與數據一致性
- 讀操作:支持無鎖快照讀,兼容DuckDB原有向量化執行引擎
2. 核心模塊
┌─────────────────────────────────┐
│ Client Applications │
└─────────────────────────────────┘ │
┌─────────────────────────────────┐
│ PostgreSQL Wire Protocol Layer│
│ (協議解析/消息序列化) │
└─────────────────────────────────┘ │
┌─────────────────────────────────┐
│ Session Manager │
│ (會話狀態/查詢路由) │
└─────────────────────────────────┘ │
┌─────────────────────────────────┐
│ Concurrency Controller │
│ (鎖管理/MVCC協調) │
└─────────────────────────────────┘ │
┌─────────────────────────────────┐
│ DuckDB Execution Engine │
│ (優化器/向量化執行) │
└─────────────────────────────────┘ │
┌─────────────────────────────────┐
│ Storage Layer │
│ (數據持久化/索引管理) │
└─────────────────────────────────┘
3. 關鍵技術實現
- 協議適配層:基于libpq或自定義實現PostgreSQL報文解析,兼容常用SQL命令和擴展命令
- 內存管理:擴展DuckDB的內存分配機制,支持多會話內存隔離與全局內存配額
- 持久化策略:
- 數據文件格式保持與DuckDB兼容
- 預寫日志(WAL)支持并發寫入崩潰恢復
- 擴展語法支持:增加服務端專屬命令(如SHOW_SESSIONS)并通過協議層封裝傳輸
4. 性能優化方向
- 連接建立:采用異步I/O模型處理高并發連接請求
- 查詢處理:復用DuckDB向量化執行引擎,增加分布式查詢規劃器擴展
- 緩存機制:實現服務端結果集緩存,支持重復查詢快速響應
5. 安全設計
- 基于PostgreSQL協議的SSL加密傳輸
- 角色權限管理系統(兼容DuckDB原有權限模型)
- SQL注入防護通過協議層參數化查詢實現
此設計方案聚焦協議兼容性、并發擴展和生態集成三大核心目標,在保持DuckDB性能優勢的同時實現服務化能力升級。
于是,先讓他實現第一部分
請用duckdb C API實現一個Demo。先實現客戶端-服務器模型:采用多線程服務器架構,通過TCP/IP協議監聽客戶端連接,使用PostgreSQL有線協議實現通信規范化,不做別的
他給出了一個c服務端程序和一個python客戶端程序。我的機器安裝psycopg2失敗,于是直接用postgresql客戶端psql連接。
他的知識庫里的duckdb版本較舊,說是0.9.0+, 其實有的數據結構還是更舊的。
比如duckdb_result結構,libduckdb 0.9.2的定義是這樣的:
typedef struct {
#if DUCKDB_API_VERSION < DUCKDB_API_0_3_2idx_t column_count;idx_t row_count;idx_t rows_changed;duckdb_column *columns;char *error_message;
#else// deprecated, use duckdb_column_countidx_t __deprecated_column_count;// deprecated, use duckdb_row_countidx_t __deprecated_row_count;// deprecated, use duckdb_rows_changedidx_t __deprecated_rows_changed;// deprecated, use duckdb_column_ family of functionsduckdb_column *__deprecated_columns;// deprecated, use duckdb_result_errorchar *__deprecated_error_message;
#endifvoid *internal_data;
} duckdb_result;
而libduckdb 1.3.2變成了這樣:
//! A query result consists of a pointer to its internal data.
//! Must be freed with 'duckdb_destroy_result'.
typedef struct {// deprecated, use duckdb_column_countidx_t deprecated_column_count;// deprecated, use duckdb_row_countidx_t deprecated_row_count;// deprecated, use duckdb_rows_changedidx_t deprecated_rows_changed;// deprecated, use duckdb_column_*-family of functionsduckdb_column *deprecated_columns;// deprecated, use duckdb_result_errorchar *deprecated_error_message;void *internal_data;
} duckdb_result;
而他就引用了column_count、row_count這些成員。于是替換成了帶deprecated_前綴的版本。編譯通過了。
服務器端
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:libduckdb
gcc goose2.c -o goose2 -I libduckdb -L libduckdb -lduckdb -lpthread
root@6ae32a5ffcde:/par# ./goose2
GooseDB server listening on port 5432
You can connect using: psql -h 127.0.0.1 -U any_user -d any_db -p 5432
Note: Username and database name are logged but not used for authentication
New connection from 127.0.0.1:34146
Client connected on socket 4
客戶端
psql -h 127.0.0.1 -U any_user -d any_db -p 5432
^C
只能顯示連接,而不能取到數據。看來需要進一步研究。
經過幾輪交互,現在進展到這一步了。
服務端, 其中對應psql連接,PGSSLMODE=disable前是127.0.0.1:58912,后是127.0.0.1:39740
root@6ae32a5ffcde:/par# ./goose3
GooseDB server listening on port 5432
You can connect using: psql -h 127.0.0.1 -U any_user -d any_db -p 5432
Note: Username and database name are logged but not used for authentication
New connection from 127.0.0.1:58912
Client connected on socket 4
已打開DuckDB數據庫
已連接DuckDB數據庫
Received startup message, length: 8
已讀取啟動消息
New connection from 127.0.0.1:39740
Client connected on socket 5
已打開DuckDB數據庫
已連接DuckDB數據庫
Received startup message, length: 87
Connection parameters: user=any_user, database=any_db
已讀取啟動消息
客戶端
psql -h 127.0.0.1 -U any_user -d any_db -p 5432
psql: error: connection to server at "127.0.0.1", port 5432 failed: received invalid response to SSL negotiation:export PGSSLMODE=disable
psql -h 127.0.0.1 -U any_user -d any_db -p 5432
psql: error: connection to server at "127.0.0.1", port 5432 failed: message contents do not agree with length in message type "S"
lost synchronization with server: got message type "i", length 1869479985
又改了一版
gcc goose4.c -o goose4 -I libduckdb -L libduckdb -lduckdb -lpthread
./goose4
GooseDB server listening on port 5432
You can connect using: psql -h 127.0.0.1 -U any_user -d any_db -p 5432
Note: Username and database name are logged but not used for authentication
New connection from 127.0.0.1:39146
Client connected on socket 4
已打開DuckDB數據庫
已連接DuckDB數據庫
Received startup message, length: 79
Received normal startup message
Connection parameters: user=, database=
已讀取啟動消息
Message too large: 4207 bytes, buffer size: 4096
Unknown message type: e
客戶端
export PGSSLMODE=disable
psql -h 127.0.0.1 -U abc -d def -p 5432
psql (15.13 (Debian 15.13-0+deb12u1), server 14.0)
Type "help" for help.def=> select 1 a;