技術分享|Milvus 1.x 版本支持 S3 存儲的部署

編者按:

本文作者是嵇斌。嵇斌,紫光華智系統工程師,畢業於南京郵電學院,目前負責 Unisinsight 雲原生和人工智能相關的軟件預研工作。在此之前曾在 Nokia 從事 5G 和雲相關的軟件開發,熱衷跟蹤參與開源軟件。平時興趣廣泛,喜好研究咖啡、飲茶以及做菜。

在過去的一年中,嵇斌爲 Milvus 社區積極貢獻代碼,使 Milvus 1.x 版本支持了 S3 存儲,解決了 Milvus1.x 版本在雲原生時代下的存儲持久性問題。

本文轉載自嵇斌的公衆號「代碼備忘錄」。

Milvus 1.x 版本支持 S3 存儲的部署

背景

Milvus 1.1.1 版本開始比較完整地支持了 S3 作爲存儲後端,在此之前,我們在 1.1 及之前版本部署分佈式方案的時候,只能採用 NFS 的方案。相比來說 S3 有着更加接地氣的雲原生表現。

本文簡單記錄了使用 Milvus 1.x 版本,通過官方的 Helm Chart 在 Kubernetes 環境中部署基於 S3 存儲的 Milvus 集羣。

測試環境

  • Kubernetes: 1.22.0
  • S3: Ceph Radosgw (Ceph 16.2.5)

部署準備

我們需要首先搭建好一個可用 S3 集羣,這可以是使用 Minio 搭建的 Server 或者 Gateway,也可以是 Ceph Radosgw,目前由於實現的限制,對於 HTTPS 的 S3 在 Milvus 裏面是不支持。

這兒我們使用已經搭建好的 Ceph Radosgw 提供的 S3 服務作爲測試環境。

測試環境相關的參數如下:

  • S3 服務的 IP地址 192.168.18.13,這個參數也支持主機名/域名的方式的
  • S3 服務的端口 80
  • S3 服務使用的 access_key WQDU43IQ8YEPS2UDRT4S
  • S3 服務使用的 secret_key 3tS9vSKY4gGOEeRmVQGzRcxKAWAAHq2zuwMI9d9l
  • 預先創建好給 Milvus 使用的 Bucket,這裏我們使用 milvus-test:s3cmd mb s3://milvus-test

如果你正在參考此文搭建,需要注意在示例代碼中替換這些替換這些參數。

部署過程

添加 Helm

  • 添加 Milvus 官方的 Helm Repo:

    helm repo add milvus https://milvus-io.github.io/milvus-helm/helm repo update
    
    
  • 當然也可以從官方的 Helm Chart 的代碼倉庫下載 1.1 分支的 Helm Chart,地址:https://github.com/milvus-io/milvus-helm

需要配置的參數

  • 開啓集羣:cluster.enabled 需要設置爲 true

  • S3 相關的參數:

    storage:
    	s3:
    		enabled: true
    		address: 192.168.18.13
    		port: 80
    		access_key: WQDU43IQ8YEPS2UDRT4S
    		secret_key: 3tS9vSKY4gGOEeRmVQGzRcxKAWAAHq2zuwMI9d9l
    		bucket: milvus-test
    
    

MySQL 存儲的設置

在我們的測試中,因爲 MySQL 還是使用的是非共享持久化存儲(通過 PV 提供),並且 Kubernetes 集羣預先沒有配置默認的 StorageClass,因此也需要指定 mysql.persistence.storageClass。當然如果僅是測試,你也可以關閉 MySQL 的數據持久化,配置 mysql.persistence.enabledfalse

安裝部署

確認好參數之後,我們就可以直接基於 Helm 進行部署了:

helm install milvus-test milvus/milvus \
    --version 1.1.6 \
    --set cluster.enabled=true \
    --set storage.s3.enabled=true \
    --set storage.s3.address=192.168.18.13 \
    --set storage.s3.port=80 \
    --set storage.s3.access_key=WQDU43IQ8YEPS2UDRT4S \
    --set storage.s3.secret_key=3tS9vSKY4gGOEeRmVQGzRcxKAWAAHq2zuwMI9d9l \
    --set storage.s3.bucket=milvus-test \
    --set mysql.persistence.storageClass=csi-rbd-sc

如果是基於官方代碼倉庫進行部署的,可以在代碼倉目錄下執行:

helm install milvus-test charts/milvus \
    --set cluster.enabled=true \
    --set storage.s3.enabled=true \
    --set storage.s3.address=192.168.18.13 \
    --set storage.s3.port=80 \
    --set storage.s3.access_key=WQDU43IQ8YEPS2UDRT4S \
    --set storage.s3.secret_key=3tS9vSKY4gGOEeRmVQGzRcxKAWAAHq2zuwMI9d9l \
    --set storage.s3.bucket=milvus-test \
    --set mysql.persistence.storageClass=csi-rbd-sc

Chart 創建後應該會返回大體如下的輸出:

NAME: milvus-test
LAST DEPLOYED: Tue Aug 17 06:17:47 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:

......

For more information on running Milvus, visit:
https://milvus.io/

觀察 POD 的狀態,等所有 milvus-test 相關的 POD 都 Ready 之後,那麼就說明部署成功了,如果長時間失敗,那麼可以通過 Describe POD 去定位相關的錯誤原因,當然這超出本文的範圍了。

[root@node01 test_milvus]# kubectl get pod  | grep ^milvus-test
milvus-test-mishards-7c44fb887d-98r5r   1/1     Running   0          8h
milvus-test-mysql-7fbd777c9b-6fvdc      1/1     Running   0          8h
milvus-test-readonly-cc46b9f7c-cxqqx    1/1     Running   0          8h
milvus-test-writable-5f67957f94-6sg66   1/1     Running   0          8h
[root@node01 test_milvus]#

Hello Milvus

接下來我們用官方 Hello Milvus 來測試一下集羣:

pip3 install pymilvus==1.1.2 --user
wget https://raw.githubusercontent.com/milvus-io/pymilvus/v1.1.2/examples/example.py

並修改 example.py 中的 Milvus 服務的地址:

# Milvus server IP address and port.
# You may need to change _HOST and _PORT accordingly.
_HOST = '10.254.228.63'
_PORT = '19530'  # default value
# _PORT = '19121'  # default http value

10.254.228.63 是 Milvus 服務所在的 IP,默認安裝時這個可以通過 kubectl get service 來查詢,在正式的生成環境,你應該想法設法通過域名、服務名來訪問他。

測試一下,能得到類似的結果應該就是成功了:

[root@node01 test_milvus]# python3 example.py
CollectionSchema(collection_name='example_collection_', dimension=8, index_file_size=32, metric_type=<MetricType: L2>)
[[0.5276305713713695, 0.12260932441933903, 0.3171067816154105, 0.13174567988561292, 0.561218915370599, 0.9768724314879139, 0.24527548957936463, 0.14069703982325565], [0.8693438293577815, 0.12859046522689555, 0.9297356851442876, 0.8802749386768061, 0.17213435969718438, 0.2792529446501495, 0.19399770066059763, 0.33760474662703477], [0.5285542325087451, 0.38652674443502677, 0.14204221506972037, 0.4446153658300557, 0.2147865132793082, 0.9802573685721011, 0.3490536785441605, 0.34690242339603694], [0.7640980395490863, 0.23851191563969232, 0.9974789898983394, 0.722209615974155, 0.5624709350402459, 0.9847888630664351, 0.8612679336524167, 0.41734632322181175], [0.7004859469397275, 0.15074329515642382, 0.5012549694880217, 0.6076530709776871, 0.5767756898619726, 0.8492594735963868, 0.5949238938992756, 0.27046992486561117], [0.4883219211158971, 0.6560899610463157, 0.17088775896262798, 0.3163316053192182, 0.4884560175347151, 0.9763345942373309, 0.3704132095239927, 0.14451999941961524], [0.420306114063945, 0.8691462987382358, 0.7681884205204504, 0.953297827028537, 0.3576528295276099, 0.10474646884992755, 0.611149746544882, 0.2603478699362083], [0.8603200422829845, 0.9761167618027261, 0.41316487821482517, 0.7872035159773235, 0.6945912973115762, 0.12198972896625171, 0.8797358763991232, 0.06431771849999612], [0.9815822851563419, 0.8218869618904384, 0.2972918857560406, 0.8344590620834544, 0.6506061203194943, 0.9055832448140761, 0.06218259919367797, 0.5531204533227327], [0.09243830916736795, 0.36326131399430095, 0.053323967514035564, 0.3587912438051374, 0.9962743116612562, 0.8274464481216758, 0.2328478805255606, 0.49902733854966996]]
{'partitions': [{'row_count': 10, 'segments': [{'data_size': 400, 'index_name': 'IDMAP', 'name': '1629250329513627000', 'row_count': 10}], 'tag': '_default'}], 'row_count': 10}
Creating index: {'nlist': 2048}
(collection_name='example_collection_', index_type=<IndexType: IVF_FLAT>, params={'nlist': 2048})
Searching ...
Query result is correct
[
 [ (id:1629250329511543000, distance:0.0) ]
 [ (id:1629250329511543001, distance:0.0) ]
 [ (id:1629250329511543002, distance:0.0) ]
        ......
            ......
]


讀到這裏,如果你對 Milvus 項目感興趣,我們歡迎你成爲社區的一份子!

Milvus 社區是由 Milvus 開發者、用戶、貢獻者們共同建立的一個開放、活躍的交流平臺。在這裏,我們可以自由發言,與志同道合的技術愛好者們交流切磋,分享經驗。

我想參與,但我是小白?技術新手不用怕,條條大路通羅馬!除了貢獻代碼,你可以從這些小事入手:

  • 報告代碼中的錯誤
  • 幫助改進 Milvus 的文檔
  • 爲 Milvus 項目提供使用場景與教程
  • 提供 Milvus 使用經驗或是向量數據庫相關的一些技術內容 (文章、視頻等)
  • 網站設計優化

躍躍欲試了嗎?提前劇透:Milvus 今年也參與了十月「黑客慶典」 Hacktoberfest。我們準備了許多有趣的任務,屆時歡迎小夥伴們一同來完成挑戰,贏取獎品!

Become a Milvus Advocate !

此外,Milvus Advocate 社區大使正在火熱招募中。瞭解如何成爲社區大使 & 大使的權益!

Join our Technical Meeting!

Milvus 社區也會定期舉辦開發者會議,歡迎大家踊躍參加!瞭解會議記錄和最新的討論內容。

成爲 Milvus 貢獻者

爲 Milvus 添磚加瓦?

想要增加個人影響力?

想和志趣相投的技術愛好者們共同創造?

點擊瞭解我們的貢獻流程!


Zilliz 以重新定義數據科學爲願景,致力於打造一家全球領先的開源技術創新公司,並通過開源和雲原生解決方案爲企業解鎖非結構化數據的隱藏價值。

Zilliz 構建了 Milvus 向量數據庫,以加快下一代數據平臺的發展。Milvus 是 LF AI & Data 基金會的畢業項目,能夠管理大量非結構化數據集,在新藥發現、推薦引擎、聊天機器人等方面具有廣泛的應用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章