基於 JuiceFS 搭建 Milvus 分散式叢集

語言: CN / TW / HK

:pencil2: 作者介紹:

賈晶晶, Zilliz 資料工程師,畢業於西安交通大學電信學部。加入到 Zilliz 之後的主要工作內容為資料預處理、AI 模型部署以及與 Milvus 相關的技術調研。

高昌健,Juicedata 解決方案架構師,十年網際網路行業從業經歷,曾在知乎、即刻、小紅書多個團隊擔任架構師職位,專注於分散式系統、大資料、AI 領域的技術研究。

JuiceFS 【1】 是一款針對雲原生環境設計的共享檔案系統,支援所有型別資料的管理、分析、歸檔和備份,被廣泛應用於大資料、人工智慧、日誌收集等場景。JuiceFS 支援多端資料共享,可以直接作為 Milvus 底層的共享儲存。本文詳細介紹瞭如何基於 JuiceFS 共享儲存搭建 Milvus 分散式叢集。

   JuiceFS 介紹

JuiceFS 是一款基於雲原生環境設計的高效能開源 POSIX 檔案系統。在資料和所對應的元資料分別持久化至物件儲存和 Redis 後,JuiceFS 將作為無狀態的中介軟體,使得不同應用能夠以標準的檔案系統介面無縫對接,從而實現資料共享。JuiceFS 依靠 Redis 來儲存檔案的元資料。Redis 是一個開源的記憶體資料庫,可以保障元資料操作的原子性和高效能。所有檔案的資料通過客戶端儲存到物件儲存中,架構圖如下:

   Milvus 介紹

Milvus 【2】是一款開源的向量相似度搜索引擎,可與多種 AI 模型相結合。Milvus 提供向量化的非結構資料檢索服務,目前廣泛應用於影象處理、計算機視覺、自然語言處理、語音識別、推薦系統以及新藥研發等領域。

Milvus 適用於多種場景,與深度學習相融合的架構如下圖所示:

採用 Milvus 的資料處理流程包括以下幾個步驟:

  1. 與深度學習模型相結合,將非結構化資料轉化為特徵向量;

  2. 將特徵向量儲存到 Milvus 並建立索引; 

  3. 返回向量相似性搜尋結果。

   基本架構

結合 JuiceFS 搭建 Milvus 分散式叢集的架構如下圖所示,其中 Mishards 負責將上游請求拆分並路由到內部各細分子服務。插入資料時,Mishards 會將請求分配到 Milvus 寫節點上,通過寫節點將插入的資料儲存到 JuiceFS 中;讀取資料時,Mishards 就會通過 Milvus 讀節點從 JuiceFS 中讀取資料到記憶體中進行處理,最後將處理結果進行彙總,返回給上游。

   搭建步驟

1. 安裝並啟動 MySQL 服務

MySQL 服務只需要在叢集中任意一臺裝置上啟動即可,具體參考 Milvus 文件: 使用 MySQL 管理元資料【3】

2. 安裝 JuiceFS

本文中選擇的是 JuiceFS 的預編譯版本【4】,使用者可以直接下載,詳細安裝過程參考 JuiceFS 安裝教程 【5】 。JuiceFS 需要先安裝 Redis,如果你使用的是公有云,建議直接使用公有云託管的 Redis 服務。JuiceFS 也需要配置物件儲存(詳細步驟參考文章  【6】 ,文中使用的是 Azure Blob Storage。JuiceFS 現已支援所有主流的物件儲存,使用者可自行選擇適合的物件儲存服務。

配置好 Redis 服務及物件儲存之後,需要格式化一個新的檔案系統,然後將 JuiceFS 掛載到本地目錄中:

$  export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;AccountName=XXX;AccountKey=XXX;EndpointSuffix=core.windows.net"
$ ./juicefs format \
--storage wasb \
--bucket https://<container> \
... \
localhost test #格式化
$ ./juicefs mount -d localhost ~/jfs #掛載

注:如果 Redis 服務不在本地,需要將 localhost 替換成如下完整地址: redis://user:[email protected]:6379/1

如下圖所示,成功安裝 JuiceFS 後,即可得到共享儲存的路徑 /root/jfs

3. 啟動 Milvus

叢集中的每一臺裝置均需要安裝 Milvus,並分別為不同裝置上的 Milvus 配置讀寫許可權。其中僅可將一臺裝置中的 Milvus 配置為寫入,其餘均為只讀。首先,在 Milvus 的系統配置檔案 server_config.yaml 中,配置  cluster  區域和 general   區域的引數。

cluster 區域

引數

說明

引數設定

enable

是否開啟叢集模式

tru e

role

節點的執行模式

rw (ro)

general  區域

引數

說明

引數設定

meta_uri

元資料儲存的 URI。使用 MySQL(Milvus 分散式版本)作為元資料的儲存後端。URI 格式為 mysql://username:[email protected]:port/database。

mysql://root:[email protected]:3306/milvus

Milvus 安裝過程中, /root/jfs/milvus/db  對映是已配置完成的 JuiceFS 共享儲存路徑。

sudo docker run -d --name milvus_gpu_1.0.0 --gpus all \
-p 19530:19530 \
-p 19121:19121 \
-v /root/jfs/milvus/db:/var/lib/milvus/db \ #/root/jfs/milvus/db為共享儲存的路徑
-v /home/$USER/milvus/conf:/var/lib/milvus/conf \
-v /home/$USER/milvus/logs:/var/lib/milvus/logs \
-v /home/$USER/milvus/wal:/var/lib/milvus/wal \
milvusdb/milvus:1.0.0-gpu-d030521-1ea92e

安裝完成後,啟動 Milvus,並檢驗 Milvus 是否啟動成功。

最後,參考 GitHub 中教程 【7】 ,在叢集中任意一臺裝置上啟動 Mishards 服務。下圖表示 Mishards 啟動成功。

共享儲存方案通常使用 Network-attached Storage(NAS)系統實現,常用的協議包括 Network File System(NFS)、Server Message Block(SMB) 等。公有云上一般也會提供相容這些協議的託管儲存服務,例如 Amazon Elastic File System(EFS)。

區別於傳統的 NAS 系統,JuiceFS 基於 Filesystem in Userspace(FUSE)實現,資料讀寫都直接發生在應用端,因此能進一步降低訪問延遲。此外,JuiceFS 還提供一些 NAS 系統不具備的特性,如資料壓縮、資料快取等,效能也有大幅提升。在與 EFS 的對比測試中,JuiceFS 表現出了較大優勢。如圖 1 所示,在原資料操作效能上,JuiceFS 的表現明顯優於 EFS,差距最大時 JuiceFS 的效能可優於 EFS 十倍之多。圖 2 記錄了在順序寫與順序讀測試中 JuiceFS 與 EFS 的 I/O 吞吐效能資料:無論在單任務或是多工的測試中,JuiceFS 相比 EFS 都有較大的效能提升。

圖 1

圖 2

除了 JuiceFS 與 EFS 的對比測試,我們還測試了結合 JuiceFS 搭建的 Milvus 分散式叢集的第一次檢索時間。第一次檢索時間指將新匯入的資料從磁碟載入到記憶體的耗時。將 100 萬條 128 維的資料以每 10 萬條為單位分批插入,每間隔 1 至 8 秒進行檢索,測試結果顯示平均檢索時間為 0.032 秒,表明從磁碟載入到記憶體的耗時較少。上述測試證明了 JuiceFS 作為共享儲存裝置的穩定性,基於 JuiceFS 搭建 Milvus 分散式叢集能兼顧高效能和彈性儲存容量。

參考連結:

【1】 JuiceFS:https://github.com/juicedata/juicefs

【2】Milvus:https://github.com/milvus-io/milvus

【3】使用 MySQL 管理元資料:https://milvus.io/cn/docs/v1.0.0/data_manage.md

【4】JuiceFS 的預編譯版本:https://github.com/juicedata/juicefs/releases

【5】JuiceFS 安裝教程:https://github.com/juicedata/juicefs/blob/main/README_CN.md

【6】配置物件儲存:https://github.com/juicedata/juicefs/blob/main/docs/zh_cn/how_to_setup_object_storage.md

【7】 GitHub 教程:https://github.com/milvus-io/bootcamp/tree/new-bootcamp/deployments/juicefs