Milvus 作为一款针对海量特征向量的相似度搜索引擎,在单台服务器上就可以处理十亿级数据规模。而对于百亿或者千亿级数据,则需要具有水平扩展能力的 Milvus 集群来满足对海量向量数据的高性能检索需求。
我们使用了 Mishards 中间件来搭建 Milvus 集群。Mishards 是一个用 Python 开发的 Milvus 集群分片中间件,其内部处理请求转发、读写分离和水平扩展,为用户提供内存和算力可以扩容的 Milvus 实例。详情请参阅 Mishards。
https://milvus.io/cn/docs/v0.10.0/mishards.md
本文将主要介绍如何在集群内部配置 StorageClass 实现共享存储,如何使用 Helm 或 kubectl 部署 Milvus 集群,最后通过在集群外部访问 Milvus 服务测试集群。本集群包含 2 个 Milvus 实例(1 个可读实例,1 个可写实例)、1 个 MySQL 实例和 1 个 Mishards。本示例将使用两台服务器部署一个 Milvus 集群:服务器 A 配置为 Kubernetes Master 节点;服务器 B 配置为 Kubernetes Worker 节点。
以下是 Kubernetes 示例架构图:
1
为什么需要共享存储
容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubectl 将重新启动容器,容器中的文件将会丢失。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。Kubernetes 抽象出 Volume 对象来解决这两个问题。
但是,当一个 Pod 不再存在时,Volume 也将不再存在。因此,Kubernetes 引入了 Persistent Volumes (PV)。PV 是集群中一块已经由管理员配置或使用 StorageClass 动态配置的存储。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的共享存储系统。Kubernetes 通过网络访问的共享文件系统,不仅可以更加可靠地存储来保存应用产生的重要数据,还可以实现 Pod 之间数据共享。
2
部署 StorageClass
1. 为了共享数据,PV 访问模式必须被设置为 ReadOnlyMany 或 ReadWriteMany。
2. 文件存储系统的选择:
如果集群部署在 AWS,可以使用 Elastic File System (EFS)。
https://aws.amazon.com/cn/efs/
如果集群部署在 Azure,可以使用 Azure File Storage (AFS)。
https://docs.microsoft.com/en-us/azure/aks/azure-files-dynamic-pv
1. 拉取源码:
$ git clone https://github.com/helm/charts.git
$ cd charts/stable/nfs-client-provisioner
2. 安装 NFS client chart:
$ helm install nfs-client .
$ helm list
$ watch kubectl get po -l app=nfs-client-provisioner
5. 查看当前 StorageClass:
$ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client (default) cluster.local/nfs-client-nfs-client-provisioner Delete Immediate true 5d23h
1
利用 Helm 部署 Milvus
1. 拉取源码:
$ git clone -b 0.10.0 https://github.com/milvus-io/milvus-helm.git
$ cd milvus-helm
2. 部署 Milvus:
$ git clone https://github.com/milvus-io/milvus-helm.git$ cd milvus-helm$ helm install --set cluster.enabled=true --set persistence.enabled=true --set mysql.enabled=true my-release .
helm list
4. 查看 Pods 是否启动成功:
$ kubectl get pods
# You are expected to see the following output.
NAME READY STATUS RESTARTS AGE
my-release-milvus-mishards-8f97db7fb-qxxgn 1/1 Running 0 12m
my-release-milvus-readonly-66784bccd6-67wcr 1/1 Running 0 12m
my-release-milvus-writable-55d7ff788b-n4zc6 1/1 Running 1 12m
my-release-mysql-8688668cd-2rj7k 1/1 Running 1 12m
nfs-client-nfs-client-provisioner-86cf7c4bc-hd7bq 1/1 Running 3 32m
$ kubectl logs <NAME>
or
$ kubectl describe pod <NAME>
2
利用 kubectl 部署 Milvus
1. 拉取源码:
$ git clone -b 0.10.0 https://github.com/milvus-io/milvus-helm.git
$ cd milvus-helm
2. 下载并解压 Go:
$ wget https://dl.google.com/go/go1.14.6.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
4. 安装 schelm 插件:
$ go get -u github.com/databus23/schelm
$ sh
sh sha224sum sha384sum shadowconfig sh.distrib shopt showconsolefont showrgb shuf
sha1sum sha256sum sha512sum shasum shift shotwell showkey shred shutdown
set cluster.enabled=true --set persistence.enabled=true --set mysql.enabled=true my-release . | ~/go/bin/schelm output/ helm install --dry-run --debug --
6. 将配置文件应用到 Pod:
cd output/milvus/$ kubectl apply -f templates/$ cd /charts/mysql/$ kubectl apply -f templates/
如果出现格式转换错误,请修改对应的 YAML 文件。
7. 查看 Pods 是否启动成功:
$ kubectl get pods
| 测试
1. 修改服务方式:
$ vim values.yaml
参数修改:
2. 更新 Milvus release:
$ helm upgrade --set cluster.enabled=true --set persistence.enabled=true --set mysql.enabled=true my-release .
$ kubectl get service
# You are expected to see the following output.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24h
my-release-milvus NodePort 10.99.64.80 <none> 19530:32227/TCP 30m
my-release-milvus-readonly ClusterIP 10.99.29.32 <none> 19530/TCP,19121/TCP 30m
my-release-milvus-writable ClusterIP 10.98.84.247 <none> 19530/TCP,19121/TCP 30m
my-release-mysql ClusterIP 10.97.182.37 <none> 3306/TCP 30m
4. 在集群外的服务器安装 Milvus Python SDK:
pip3 install pymilvus==0.2.14
5. 下载 Python 示例代码:
$ wget https://raw.githubusercontent.com/milvus-io/pymilvus/0.2.14/examples/example.py
6. 运行示例代码:
$ python3 example.py
# You are expected to see the following output.
CollectionSchema(collection_name='example_collection_', dimension=8, index_file
......
{'partitions': [{'row_count': 10, 'segments': [{'data_size': 400, 'index_name':
Creating index: {'nlist': 2048}
(collection_name='example_collection_', index_type=<IndexType: IVFLAT>, params=
Searching ...
Query result is correct
......
本文利用两种方法轻松将 Milvus 部署到 Kubernetes 中,并通过在数据集外部访问 Milvus Server 进行了相关测试。当需要使用 Milvus 处理海量特征向量时,可以使用该分布式集群方案增强横向扩容能力,以获得更好的体验。也可自行尝试将该系统从物理机环境中无缝迁移到公有云中。
基于 Mishards 的分布式方案请参考 Mishards。
🚀 https://github.com/milvus-io/bootcamp/tree/master/solutions/Mishards
基于 Kubernetes 的分布式搭建方案请参考 Milvus Helm、K8s Bootcamp。
🚀 https://github.com/milvus-io/milvus-helm
🚀 https://github.com/milvus-io/bootcamp/tree/0.10.0/solutions/Kubernetes
本文分享自微信公众号 - ZILLIZ(Zilliztech)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。