🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI
  • Home
  • Blog
  • 开始使用 Milvus 集群和 K8s

开始使用 Milvus 集群和 K8s

  • Engineering
April 03, 2024
Stephen Batifol

简介

Milvus 是一个分布式向量数据库,旨在存储、索引和管理海量嵌入向量。它能够高效地索引和搜索数万亿向量,这使得 Milvus 成为人工智能和机器学习工作负载的首选。

Kubernetes(K8s)则擅长管理和扩展容器化应用。它提供自动扩展、自我修复和负载平衡等功能,这些功能对于在生产环境中保持高可用性和高性能至关重要。

为什么要同时使用它们?

K8s 可以根据工作负载自动扩展 Milvus 集群。随着数据的增长或查询次数的增加,K8s 可以启动更多的 Milvus 实例来处理负载,确保应用程序保持响应速度。

K8s 的突出特点之一是它的横向扩展能力,这使得扩展 Milvus 集群变得轻而易举。随着数据集的增长,K8s 可以毫不费力地适应这种增长,是一种简单高效的解决方案。

此外,K8s 还能水平扩展处理查询的能力。随着查询负载的增加,K8s 可以部署更多的 Milvus 实例来处理增加的相似性搜索查询,即使在大负载下也能确保低延迟响应。

前提条件和设置 K8s

先决条件

  • Docker- 确保在系统上安装了 Docker。

  • Kubernetes- 准备好 Kubernetes 集群。您可以使用minikube 进行本地开发,也可以使用云提供商的 Kubernetes 服务来构建生产环境。

  • Helm- 安装 Kubernetes 的软件包管理器 Helm,帮助你管理 Kubernetes 应用程序,你可以查看我们的文档了解如何操作https://milvus.io/docs/install_cluster-helm.md

  • Kubectl- 安装kubectl ,这是一个与 Kubernetes 集群交互的命令行工具,用于部署应用程序、检查和管理集群资源以及查看日志。

设置 K8s

在安装了运行 K8s 集群所需的一切之后,如果你使用了minikube ,就用它来启动你的集群:

minikube start

检查 K8s 集群的状态:

kubectl cluster-info

在 K8s 上部署 Milvus

在本次部署中,我们选择在集群模式下使用 Milvus,以充分发挥其分布式功能。我们将使用 Helm 来简化安装过程。

1.Helm 安装命令

helm install my-milvus milvus/milvus --set pulsar.enabled=false --set kafka.enabled=true

该命令将在 K8s 集群上安装 Milvus,并启用 Kafka 和禁用 Pulsar。Kafka 在 Milvus 中充当消息系统,处理不同组件之间的数据流。禁用 Pulsar 并启用 Kafka 可使部署符合我们特定的消息传递偏好和要求。

2.端口转发

要从本地机器访问 Milvus,请创建端口转发:kubectl port-forward svc/my-milvus 27017:19530

该命令将来自 Milvus 服务svc/my-milvus 的端口19530 映射到本地计算机上的相同端口,允许您使用本地工具连接 Milvus。如果不指定本地端口(如:19530 ),K8s 将分配一个可用端口,使其成为动态端口。如果选择这种方法,请确保记下分配的本地端口。

3.验证部署:

kubectl get pods 

NAME                                    READY   STATUS    RESTARTS   AGE
my-milvus-datacoord-595b996bd4-zprpd    1/1     Running   0          85m
my-milvus-datanode-d9d555785-47nkt      1/1     Running   0          85m
my-milvus-etcd-0                        1/1     Running   0          84m
my-milvus-etcd-1                        1/1     Running   0          85m
my-milvus-etcd-2                        1/1     Running   0          85m
my-milvus-indexcoord-65bc68968c-6jg6q   1/1     Running   0          85m
my-milvus-indexnode-54586f55d-z9vx4     1/1     Running   0          85m
my-milvus-kafka-0                       1/1     Running   0          85m
my-milvus-kafka-1                       1/1     Running   0          85m
my-milvus-kafka-2                       1/1     Running   0          85m
my-milvus-minio-0                       1/1     Running   0          96m
my-milvus-minio-1                       1/1     Running   0          96m
my-milvus-minio-2                       1/1     Running   0          96m
my-milvus-minio-3                       1/1     Running   0          96m
my-milvus-proxy-76bb7d497f-sqwvd        1/1     Running   0          85m
my-milvus-querycoord-6f4c7b7598-b6twj   1/1     Running   0          85m
my-milvus-querynode-677bdf485b-ktc6m    1/1     Running   0          85m
my-milvus-rootcoord-7498fddfd8-v5zw8    1/1     Running   0          85m
my-milvus-zookeeper-0                   1/1     Running   0          85m
my-milvus-zookeeper-1                   1/1     Running   0          85m
my-milvus-zookeeper-2                   1/1     Running   0          85m

你应该会看到一个与上面输出类似的 pod 列表,所有 pod 都处于运行状态。这表明你的 Milvus 集群已开始操作。具体来说,请查看READY 列下的 1/1,这表示每个 pod 已完全准备就绪并正在运行。如果有任何 pod 不在运行状态,你可能需要进一步调查,以确保部署成功。

部署好 Milvus 集群并确认所有组件都在运行后,现在就可以开始数据摄取和索引编制了。这将涉及连接到 Milvus 实例、创建 Collections 以及插入用于搜索和检索的向量。

数据摄取和索引

要开始在 Milvus 集群中摄取数据并编制索引,我们将使用 pymilvus SDK。有两个安装选项:

  • 基本 SDK:pip install pymilvus

  • 用于富文本嵌入和高级模型:pip install pymilvus[model]

时间在我们的集群中插入数据,我们将使用pymilvus ,你可以只安装pip install pymilvus 的 SDK,如果你想提取富文本嵌入,也可以通过安装pip install pymilvus[model] 来使用PyMilvus Models

连接并创建 Collections:

首先,使用之前转发的端口连接到你的 Milvus 实例。确保 URI 与 K8s 分配的本地端口一致:

from pymilvus import MilvusClient

client = MilvusClient(
        uri="http://127.0.0.1:52070",
    )

client.create_collection(collection_name="quick_setup", dimension=5)

dimension=5 参数定义了此 Collections 的向量大小,对于向量搜索功能至关重要。

插入数据

下面是如何插入一组初始数据,其中每个向量代表一个项目,颜色字段添加了一个描述性属性:

data=[
    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]

res = client.insert(
    collection_name="quick_setup",
    data=data
)

print(res)

所提供的代码假定你已经以快速设置方式创建了一个 Collections。如上述代码所示、

要插入的数据被组织到一个字典列表中,每个字典代表一条数据记录,称为一个实体。

每个字典包含一个名为颜色的非 Schema 定义字段。

每个字典都包含与预定义字段和 Dynamic Field 对应的键。

插入更多数据

colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
    "id": i, 
    "vector": [ random.uniform(-1, 1) for _ in range(5) ], 
    "color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}" 
} for i in range(1000) ]

res = client.insert(
    collection_name="quick_setup",
    data=data[10:]
)

print(res)

在填充 Collections 后,可以执行相似性搜索,找到与查询向量接近的向量。query_vectors 变量的值是一个包含浮点子列表的列表。子列表代表 5 维的向量 Embeddings。

query_vectors = [
    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]

res = client.search(
    collection_name="quick_setup",     # target collection
    data=query_vectors,                # query vectors
    limit=3,                           # number of returned entities
)

print(res)

这个查询会搜索与我们的查询向量最相似的前 3 个向量,展示了 Milvus 强大的搜索能力。

从 K8s 卸载 Milvus

完成本教程后,请使用helm uninstall my-milvus 从 K8s 集群卸载 Milvus。

该命令将删除部署在my-milvus 版本中的所有 Milvus 组件,从而释放集群资源。

结论

  • 在 Kubernetes 集群上部署 Milvus 展示了向量数据库在处理人工智能和机器学习工作负载方面的可扩展性和灵活性。通过本教程,您已经了解了使用 Helm 设置 Milvus、创建 Collections 以及执行数据摄取和相似性搜索的基础知识。

  • 使用 Helm 在 Kubernetes 集群上安装 Milvus 应该很简单。要深入了解如何为更大的数据集或更密集的工作负载扩展 Milvus 集群,我们的文档提供了详细的指导https://milvus.io/docs/scaleout.md

欢迎随时查看Github 上的代码,查看Milvus,尝试不同的配置和用例,并通过加入我们的Discord 与社区分享您的经验。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

扩展阅读