技术分享|Milvus 1.x 版本支持 S3 存储的部署
编者按: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.persistence.storageClass
。当然如果仅是测试,你也可以关闭 MySQL 的数据持久化,配置 mysql.persistence.enabled
为 false
。安装部署
确认好参数之后,我们就可以直接基于 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-98r5r1/1Running08h
milvus-test-mysql-7fbd777c9b-6fvdc1/1Running08h
milvus-test-readonly-cc46b9f7c-cxqqx1/1Running08h
milvus-test-writable-5f67957f94-6sg661/1Running08h
[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=)
[[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=, 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 使用经验或是向量数据库相关的一些技术内容 (文章、视频等)
- 网站设计优化
Become a Milvus Advocate !
此外,Milvus Advocate 社区大使正在火热招募中。了解如何成为社区大使 & 大使的权益!
Join our Technical Meeting!
Milvus 社区也会定期举办开发者会议,欢迎大家踊跃参加!了解会议记录和最新的讨论内容。
About Zilliz
Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。
Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐引擎、聊天机器人等方面具有广泛的应用。
成为 Milvus 贡献者
为 Milvus 添砖加瓦?
想要增加个人影响力?
想和志趣相投的技术爱好者们共同创造?
点击了解我们的贡献流程!
推荐阅读
- 第326天
- 姚老师互动问答会|姚老师互动问答会 # 问题001(如何更有智慧的和身边人分享金刚智慧())
- 焦点学习田源分享第267天《来访》
- 《偶得》
- 2018.03.18
- 坚持分享第104天
- 句子分享
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 康恩赫助力线头公益#义卖星推官#,分享你最喜爱的义卖明星
- GIS跨界融合赋能多领域技术升级,江淮大地新应用成果喜人