Apache Cloudberry™ (Incubating) 是 Apache 軟件基金會孵化項目,由 Greenplum 和 PostgreSQL 衍生而來,作為領先的開源 MPP 數據庫,可用於建設企業級數據倉庫,並適用於大規模分析和 AI/ML 工作負載。
GitHub: https://github.com/apache/cloudberry文章作者:陳亮,酷克數據售後工程師;整理:酷克數據ZomboDB 是 PostgreSQL 的擴展組件,通過與 Elasticsearch 的集成,為數據庫系統引入了高性能的全文檢索與文本分析功能。我們對 ZomboDB 進行了兼容性改造與優化,使其能夠支持 Apache Cloudberry,從而讓 Cloudberry 擁有 Elasticsearch 豐富的全文檢索與文本分析能力。通過簡單的 SQL 語法,用户即可在已有的 Cloudberry 表上創建 ZomboDB 索引,實現高性能、可事務化的全文搜索。ZomboDB 實際上是基於 Elasticsearch 外部索引的實現,它可以管理 Elasticsearch 集羣上的索引,並確保在事務層面上保持數據與索引的一致性。此外,ZomboDB 支持大多數 Cloudberry 的 SQL 操作,包括:CREATE INDEX、COPY、INSERT、UPDATE、DELETE、SELECT、ALTER、DROP、REINDEX、(auto)VACUUM 等。工作原理ZomboDB 通過連接 Cloudberry 集羣與 Elasticsearch 集羣,實現兩者的數據同步與檢索協作。無論兩個集羣是否位於同一主機,只需保證網絡通信暢通即可正常運行。Cloudberry 中的每一個 ZomboDB 索引實際上對應 Elasticsearch 中的一個 Index。當數據量較大時,為避免每個 Segment 掃描全量索引數據,ZomboDB 會將不同 Segment 的數據映射到 Elasticsearch 索引下的不同分片(Shard),從而提升並行掃描與查詢性能。
創建索引和加載數據流程下圖展示了數據表創建 ZomboDB 索引,並加載數據的大致流程。
整個過程都是在和 Cloudberry集羣中的 Coordinator 節點進行通信和交互。在 Cloudberry集羣中創建數據表,並且加載相應的數據。使用 CREATE INDEX 語法創建 ZomboDB 的索引。此時需要保證 Elasticsearch 的集羣處於可用狀態,並且網絡和 Cloudberry集羣互通。創建的過程中,ZomboDB 會自動將表中已有的數據插入到 Elasticsearch 中對應的 index 裏面,如果發生了錯誤,或者手動回滾事務,那麼也會自動清理 ES 中的數據。在索引創建完成後,後續有新的數據插入到表中,都會自動將數據插入到對應 Elasticsearch 的 index 裏。查詢數據流程下圖展示了存在 ZomboDB 索引的情況下,對數據進行查詢的大致流程。
用户側使用 ZomboDB 的查詢語法,基於 ZomboDB 的索引進行查詢。ZomboDB 的查詢和普通的 select 基本上沒有區別,只是需要使用 ZomboDB 特定的標識符 ==>。Cloudberry集羣中的 Coordinator 節點將查詢分發給各個 Segment。每個 Segment 各自執行查詢,只需要查詢對應的 Elasticsearch 的 index 中某個 Shard 的數據。每個 Segment 將查詢的結果返回給 Coordinator 節點。Coordinator 節點收到 Segment 的結果,進行聚合或者其他操作,並返回給用户。安裝 ZomboDB 插件注意:當前 ZomboDB 插件尚未開源,此安裝方式適用於 HashData Lightning(基於 Apache Cloudberry)版本。// 通過 psql postgres 進入數據庫,創建 zombodb 擴展
postgres=# create extension zombodb;
// 出現如下結果表示安裝成功
CREATE EXTENSION安裝 Elasticsearch下載對應平台 elasticserch 安裝包wget https://artifacts.elastic.co/downloads/elasticsearch/elastics...安裝 elasticsearchyum -y install ./elasticsearch-8.6.1-x86_64.rpm修改/etc/elasticsearch/elasticsearch.yml,設置 xpack.security.enabled 為 falsexpack.security.enabled: false啓動 elasticsearchsystemctl start elasticsearch安裝 elasticsearch-analysis-ik 中文分詞插件注意插件的版本必須與 elasticsearch 版本一致。上面的 elasticsearch 版本是 8.6.1,所以這裏插件也要使用同樣的版本。有 2 種安裝方式:自動安裝:cd /usr/share/elasticsearch/bin
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.6.1/elasticsearch-analysis-ik-8.6.1.zip手動安裝:從這個鏈接下載對應版本的安裝包:https://github.com/medcl/elasticsearch-analysis-ik/releases安裝mkdir /usr/share/elasticsearch/plugins/ik
unzip -d /usr/share/elasticsearch/plugins/ik ./elasticsearch-analysis-ik-8.6.1.zip重啓 elasticsearchsystemctl restart elasticsearchCloudberry 實現中文檢索創建一個名稱是'myik'的 analyzer。SELECT zdb.define_analyzer('myik', '{"tokenizer": "ik_max_word"}');創建 domainCREATE DOMAIN myik AS text;創建測試表,注意這裏列 c1 的數據類型要對應上面創建的 domain 名稱。create table zombodb_t1 (c1 myik);創建索引create index idx_zombodb_t1 on zombodb_t1 using zombodb((zombodb_t1.*)) with (url='http://localhost:9200/');測試效果gpadmin=# insert into zombodb_t1 values ('中文測試');
INSERT 0 1
gpadmin=# insert into zombodb_t1 values ('中 文測試');
INSERT 0 1
gpadmin=# select * from zombodb_t1 where zombodb_t1 ==> '中文';
c1
中文測試
(1 row)
gpadmin=# select * from zombodb_t1 where zombodb_t1 ==> '中 文';
c1
中 文測試
(1 row)
gpadmin=# select * from zombodb_t1 where zombodb_t1 ==> '測試';
c1
中文測試
中 文測試
(2 rows)創建 index 報錯在創建 index(例如 create index
idx_fulltext_client_extended_info)時,出現了以下錯誤信息:ERROR: code=Some(429),
"error": {
"root_cause": [
{
"type": "es_rejected_execution_exception",
"reason": "rejected execution of coordinating operation [coordinating_and_primary_bytes=...]"
}
],
"type": "es_rejected_execution_exception",
"reason": "rejected execution of coordinating operation [coordinating_and_primary_bytes=...]",
"status": 429
}從錯誤信息可以看出,Elasticsearch 在協調節點執行操作時因為內存壓力過大而拒絕了請求(
es_rejected_execution_exception),導致索引創建失敗。解決方法:修改/etc/elasticsearch/elasticsearch.yml, 添加如下參數。如果不指定,這個參數的默認值是 10%的 ES heap 內存大小。indexing_pressure.memory.limit: 8g重啓 elasticsearchsystemctl restart elasticsearch結語通過將 ZomboDB 與 Apache Cloudberry 深度集成,用户能夠在 MPP 架構下直接使用 Elasticsearch 的全文檢索與中文分詞能力,實現高性能的結構化與非結構化數據混合查詢。這種融合方案不僅擴展了 Cloudberry 的應用邊界,也為日誌分析、智能檢索、文本挖掘等場景提供了開源可行的新路徑。未來,隨着社區的發展與多語言分詞支持的增強,Cloudberry + ZomboDB + Elasticsearch 的組合將成為構建智能數據倉庫與搜索分析平台的重要技術基石。