基于 Amazon EKS 搭建开源向量数据库 Milvus

一、前言

生成式 AI(Generative AI)的火爆引发了广泛的关注,也彻底点燃了向量数据库(Vector Database)市场,众多的向量数据库产品开始真正出圈,走进大众的视野。

根据 IDC 的预测,到 2025 年,超过 80% 的业务数据将是非结构化的,以文本、图像、音频、视频或其他格式存储。而大规模存储和查询非结构化数据是一个非常大的挑战。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点 这里让它成为你的技术宝库!

在生成式 AI 和深度学习领域通常的做法是通过将非结构化数据转换为向量进行存储,并通过向量相似性搜索(Vector similarity search)技术进行语义相关性搜索。而快速地存储、索引和搜索 Embedding 向量,正是向量数据库的核心功能。

那么,什么是 Embedding 呢?简单地说,Embedding 就是浮点数的向量的嵌入式表征。两个向量之间的距离表示它们的相关性, 距离越近相关性越高,距离越远相关性越低。如果两个 Embedding 相似,就意味着他们代表的原始数据也是相似的。这一点与传统的关键词搜索有很大的不同。

图片

当前市面上主流的向量数据库可以分为两大类,一类是在既有数据库产品上进行扩展,例如 Amazon OpenSearch 服务通过 KNN 插件、Amazon RDS for PostgreSQL 通过 pgvector 扩展实现对向量的支持。另一类是独立的向量数据库产品,比较知名的有 Milvus、Zilliz Cloud(powered by Milvus)、Pinecone、Weaviate、Qdrant、Chroma 等。在这类向量数据库中,向量是一等公民,所有的功能都是围绕着它建立的。

Embedding 技术和向量数据库可以被广泛应用于各类 AI 驱动的应用场景,包括图片检索、视频分析、自然语言理解、推荐系统、定向广告、个性化搜索、智能客服和欺诈检测等。

在众多的向量数据库中,Milvus 是全球最流行的开源向量数据库之一,截止本文创作时至,在 Github 有超过 1.8 万颗 Star。且看 Milvus 的官方介绍:

  • Milvus 是一个高度灵活、可靠且速度极快的云原生开源向量数据库。它为 embedding 相似性搜索和 AI 应用程序提供支持,并努力使每个组织都可以访问向量数据库。 Milvus 可以存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的十亿级别以上的 embedding 向量。

本文主要探讨基于 Amazon EKS 等服务部署 Milvus 集群的实践。

二、架构说明

作为一款云原生的向量数据库产品,Milvus 的设计采用了共享存储的架构,存储计算完全分离,数据、查询和索引节点分离,并使用消息队列实现各个核心组件之间的解藕。核心工作节点是无状态的,因此可以提供极大的弹性和灵活性。

Milvus 遵循数据流和控制流分离的原则,整体分为了四个层次,分别为接入层(access layer)、协调服务(coordinator service)、工作节点(worker node)和存储层(storage)。

图片

Milvus 设计之初就支持 Kubernetes 平台。本文采用 Amazon EKS 作为底层容器平台,并使用 Amazon S3、Amazon MSK(Managed Streaming for Apache Kafka)、Amazon ELB 等托管服务分别用作其中的 Object Storage、Message storage、Load Balancer 等核心组件,以搭建可靠、弹性的 Milvus 数据库集群,使其更适合生产环境使用。

本文采用渐进的方式一步步地部署、优化 Milvus 集群,使您更容易理解 EKS 和 Milvus 部署和配置过程。

三、先决条件

本文使用命令行的方式创建 EKS 和部署 Milvus 数据库集群,因此需要如下的预备条件:

  1. 一台个人电脑或者 Amazon EC2,安装 Amazon CLI,并配置相应的权限。如果您使用 Amazon Linux 2 或者 Amazon Linux 2023,Amazon CLI 工具默认已经安装。
  2. 安装 EKS 相关工具,包括 Helm,Kubectl,eksctl 等。
  3. 一个 Amazon S3 存储桶。
  4. 一个 Amazon MSK 实例。
    MSK 创建注意事项:
    1)当前最新稳定版本的 Milvus(v2.2.8)依赖 Kafka 的 autoCreateTopics 特性,因此在创建 MSK 时需要使用自定义配置,并将属性 auto.create.topics.enable 由默认的 false 改为 true。另外,为了提高 MSK 的消息吞吐量,建议调大 message.max.bytes 和 replica.fetch.max.bytes 的值。详见 Custom MSK configurations。
auto.create.topics.enable=true
message.max.bytes=10485880
replica.fetch.max.bytes=20971760

2)Milvus 不支持 MSK 的 IAM role-based 认证,因此 MSK 创建时需要在安全配置里打开 SASL/SCRAM authentication 选项,并在 Secret Manager 里配置 username 和 password,详见 Sign-in credentials authentication with Amazon Secrets Manager。

图片

3)MSK 的安全组要允许 EKS 集群安全组或者 IP 地址段进行访问。

四、创建 EKS 集群

EKS 集群的创建方式有很多,如控制台、CloudFormation、eksctl 等。本文使用 eksctl 的方式。

  • eksctl 是一款简单的命令行工具,用于在 Amazon EKS 上创建和管理 Kubernetes 集群。eksctl 提供使用 Amazon EKS 节点创建新集群的最快、最简单的方式。如需查阅官方文档,请参阅 https://eksctl.io/?trk=cndc-detail。
  1. 首先,用如下内容创建 eks_cluster.yaml 文件。请将 cluster-name 替换为您的集群名称,将 region-code 替换为创建集群的亚马逊云科技区域,将 private-subnet-idx 替换为您的私有子网。注:该配置文件通过指定私有 subnets 的方式在现有的 VPC 创建 EKS。您也可以删除 VPC 及 subnets 的配置,这样 eksctl 会自动创建一个全新的 VPC。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: <cluster-name>
  region: <region-code>
  version: "1.26"

iam:
  withOIDC: true

  serviceAccounts:
  - metadata:
      name: aws-load-balancer-controller
      namespace: kube-system
    wellKnownPolicies:
      awsLoadBalancerController: true
  - metadata:
      name: milvus-s3-access-sa
      # if no namespace is set, "default" will be used;
      # the namespace will be created if it doesn't exist already
      namespace: milvus
      labels: {aws-usage: "milvus"}
    attachPolicyARNs:
    - "arn:aws:iam::aws:policy/AmazonS3FullAccess"

# Use existed VPC to create EKS.
# If you don't config vpc subnets, eksctl will automatically create a brand new VPC
vpc:
  subnets:
    private:
      us-west-2a: { id: <private-subnet-id1> }
      us-west-2b: { id: <private-subnet-id2> }
      us-west-2c: { id: <private-subnet-id3> }

managedNodeGroups:
  - name: ng-1-milvus
    labels: { role: milvus }
    instanceType: m6i.2xlarge
    desiredCapacity: 3
    privateNetworking: true
    
addons:
- name: vpc-cni # no version is specified so it deploys the default version
  attachPolicyARNs:
    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
- name: coredns
  version: latest # auto discovers the latest available
- name: kube-proxy
  version: latest
- name: aws-ebs-csi-driver
  wellKnownPolicies:      # add IAM and service account
    ebsCSIController: true

然后,运行 eksctl 命令创建 EKS 集群。

eksctl create cluster -f eks_cluster.yaml
  • 该过程将创建如下资源:
  • 创建一个指定版本的 EKS 集群。
  • 创建一个拥有 3 个 m6i.2xlarge EC2 实例的托管节点组。
  • 创建 IAM OIDC 身份提供商和名为 amazon-load-balancer-controller 的 ServiceAccount,后文安装 Amazon Load Balancer Controller 时使用。
  • 创建一个命名空间 milvus,并在此命名空间里创建名 milvus-s3-access-sa 的 ServiceAccount。后文为 Milvus 配置 S3 做 Object Storage 时使用。

    • 注意,此处为了方便授予了 milvus-s3-access-sa 所有 S3 访问权限,在生产环境部署时建议遵循最小化授权原则,只授予指定用于 Milvus 的 S3 存储桶的访问权限。
  • 安装多个插件,其中 vpc-cnicorednskube-proxy 为 EKS 必备核心插件。amazon-ebs-csi-driver 是 Amazon EBS CSI 驱动程序,允许 EKS 集群管理 Amazon EBS 持久卷的生命周期。

等待集群创建完成。集群创建过程中会自动创建或者更新 kubeconfig 文件。您也可以运行如下命令手动更新,注意将 region-code 替换为创建集群的亚马逊云科技区域,将 cluster-name 替换为您的集群名称。

amazon eks update-kubeconfig --region <region-code> --name <cluster-name>
复制代码集群创建完毕之后,运行如下命令就可以查看您的集群节点。

kubectl get nodes -A -o wide

        2. 创建 ebs-sc StorageClass,配置 GP3 作为存储类型,并设置为 default StorageClass。Milvus 使用 etcd 作为 Meta Storage,需要依赖该 StorageClass 创建和管理 PVC。

cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
EOF

并将原来的 gp2 StorageClass 设置为非默认:

kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

        3.安装 Amazon Load Balancer Controller,后文中 Milvus Service 和 Attu Ingress 需要用到该 Controller,我们在此提前进行安装。

添加 eks-charts 仓库并更新。

helm repo add eks https://aws.github.io/eks-charts
helm repo update

安装 Amazon Load Balancer Controller。请将 cluster-name 替换为您的集群名称。此处名为 amazon-load-balancer-controller 的 ServiceAccount 已经在创建 EKS 集群时创建。

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=<cluster-name> \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller 

检查 Controller 是否安装成功。

kubectl get deployment -n kube-system aws-load-balancer-controller

输出例如下。

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           12m

五、部署 Milvus 数据库

Milvus 支持 Operator 和 Helm 等多种部署方式,相比较而言,通过 Operator 进行部署和管理要更为简单,但 Helm 方式要更加直接和灵活,因此本文采用 Helm 的部署方式。 在使用 Helm 部署 Milvus 时,可以通过配置文件 values.yaml 进行自定义配置,点击 values.yaml 可以查看所有配置选项。 Milvus 默认创建 in-cluster 的 minio 和 pulsar 分别作为 Object Storage 和 Message Storage。为了更适合在生产环境使用,我们通过配置文件使用 S3 和 MSK 作为替代。

  1. 首先,添加 Milvus Helm 仓库并更新。

    helm repo add milvus https://milvus-io.github.io/milvus-helm/
    helm repo update

  2. 配置 S3 作为 Object Storage。配置 serviceAccount 是为了授予 Milvus 访问 S3 的权限(此处为 milvus-s3-access-sa,在创建 EKS 集群时已经创建)。注意将 <region-code> 替换为创建集群的亚马逊云科技区域。将 <bucket-name> 替换为 S3 存储桶的名字, <root-path> 替换为 S3 存储桶的前缀(可以为空)。
###################################
# Service account
# - this service account are used by External S3 access
###################################
serviceAccount:
  create: false
  name: milvus-s3-access-sa

###################################
# Close in-cluster minio
###################################
minio:
  enabled: false

###################################
# External S3
# - these configs are only used when `externalS3.enabled` is true
###################################
externalS3:
  enabled: true
  host: "s3.<region-code>.amazonaws.com"
  port: "443"
  useSSL: true
  bucketName: "<bucket-name>"
  rootPath: "<root-path>"
  useIAM: true
  cloudProvider: "aws"
  iamEndpoint: ""

        3.配置 MSK 作为 Message Storage。注意将 <broker-list> 替换为 MSK 的 SASL/SCRAM 认证类型对应的 endpoint 地址,<username> 和 <password> 替换为 MSK 的账号和密码。

注意:MSK 的安全组要配置允许 EKS 集群安全组或者 IP 地址段进行访问。

图片

###################################
# Close in-cluster pulsar
################################### 
pulsar:
  enabled: false

###################################
# External kafka
# - these configs are only used when `externalKafka.enabled` is true
###################################
externalKafka:
  enabled: true
  brokerList: "<broker-list>"
  securityProtocol: SASL_SSL
  sasl:
    mechanisms: SCRAM-SHA-512
    username: "<username>"
    password: "<password>"

4. 将 2-3 步的配置合并并保存为 milvus_cluster.yaml 文件,并使用 Helm 命令创建 Milvus(部署在 milvus 命名空间)。注意,您可以将 demo 替换为自定义名称。

helm install demo milvus/milvus -n milvus -f milvus_cluster.yaml

运行如下命令检查 pods 的状态。

kubectl get pods -n milvus

running 状态表明创建成功。

NAME                                      READY   STATUS    RESTARTS   AGE
demo-etcd-0                               1/1     Running   0          114s
demo-etcd-1                               1/1     Running   0          114s
demo-etcd-2                               1/1     Running   0          114s
demo-milvus-datacoord-548bf76868-b6vzb    1/1     Running   0          115s
demo-milvus-datanode-5fc794dd8b-z8l2x     1/1     Running   0          115s
demo-milvus-indexcoord-c9455db7d-sx22q    1/1     Running   0          115s
demo-milvus-indexnode-58bd66bbb7-f5xbp    1/1     Running   0          114s
demo-milvus-proxy-664c68c7b4-x6jqn        1/1     Running   0          114s
demo-milvus-querycoord-679bcf7497-7xg4v   1/1     Running   0          115s
demo-milvus-querynode-64f94b6f97-wl5v4    1/1     Running   0          114s
demo-milvus-rootcoord-5f9b687b57-d22s6    1/1     Running   0          115s 

5. 获取 Milvus 访问终端节点。

kubectl get svc -n milvus

输出示例如下,demo-milvus 就是 Milvus 的服务终端节点,其中 19530 为数据库访问端口,9091 为 Metrics 访问端口。默认的 Service 类型为 ClusterIP ,这种类型只能在 EKS 集群内部访问。我们将在下一章节讲解如何配置为允许集群外访问。

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)              AGE
demo-etcd                ClusterIP   172.20.103.138   <none>        2379/TCP,2380/TCP    6m46s
demo-etcd-headless       ClusterIP   None             <none>        2379/TCP,2380/TCP    6m46s
demo-milvus              ClusterIP   172.20.219.33    <none>        19530/TCP,9091/TCP   6m46s
demo-milvus-datacoord    ClusterIP   172.20.214.106   <none>        13333/TCP,9091/TCP   6m46s
demo-milvus-datanode     ClusterIP   None             <none>        9091/TCP             6m46s
demo-milvus-indexcoord   ClusterIP   172.20.106.51    <none>        31000/TCP,9091/TCP   6m46s
demo-milvus-indexnode    ClusterIP   None             <none>        9091/TCP             6m46s
demo-milvus-querycoord   ClusterIP   172.20.136.213   <none>        19531/TCP,9091/TCP   6m46s
demo-milvus-querynode    ClusterIP   None             <none>        9091/TCP             6m46s
demo-milvus-rootcoord    ClusterIP   172.20.173.98    <none>        53100/TCP,9091/TCP   6m46s

六、优化 Milvus 配置

至此,我们已经成功地部署了 Milvus 集群,但很多 Milvus 的默认配置无发满足生产环境自定义需求,本部分主要围绕如下三个方面进行配置优化。

  1. Milvus 默认部署 ClusterIP 类型的 service,这种 service 只能在 EKS 内部访问,将 Milvus service 更改为 Loadbalancer 类型,使集群外也可以进行访问。
  2. 安装 Attu,通过可视化界面管理 Milvus 数据库。
  3. 优化各个组件的配置,使其满足于您的负载情况。

前两项配置需要用到 Amazon Load Balancer Controller,请确认在第三章中完成安装。

6.1 配置 Milvus 服务可供 EKS 集群外访问

Helm 支持在创建之后使用 helm upgrade 命令进行配置更新,我们采用这种方式对 Milvus 进行配置。 使用如下代码创建 milvus_service.yaml 配置文件,该配置文件指定使用 Load Balancer Controller 创建 LoadBalancer 类型的 service,以方便在集群外进行访问。LoadBalancer 类型的 Service 使用 Amazon NLB 作为负载均衡器。根据安全最佳实践,此处 amazon-load-balancer-scheme 默认配置为 internal 模式,即只允许内网访问 Milvus。如果您确实需要通过 Internet 访问 Milvus,需要将 internal 更改为 internet-facing。点击查看 NLB 配置说明。

## Expose the Milvus service to be accessed from outside the cluster (LoadBalancer service).
## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
##
service:
  type: LoadBalancer
  port: 19530
  annotations: 
    service.beta.kubernetes.io/aws-load-balancer-type: external #AWS Load Balancer Controller fulfills services that has this annotation 
    service.beta.kubernetes.io/aws-load-balancer-name : milvus-service #User defined name given to AWS Network Load Balancer
    service.beta.kubernetes.io/aws-load-balancer-scheme: internal # internal or internet-facing, later allowing for public access via internet
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip #The Pod IPs should be used as the target IPs (rather than the node IPs)

然后使用 Helm 更新配置文件。

helm upgrade demo milvus/milvus -n milvus --reuse-values -f milvus_service.yaml

运行如下命令:

kubectl get svc -n milvus

可以看到 demo-milvus 服务已经更改为 LoadBalancer 类型,底层使用 NLB 作为服务均衡器,其中 EXTERNAL-IP 一栏即为集群外访问地址。

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP                                               PORT(S)                          AGE
demo-etcd                ClusterIP      172.20.103.138   <none>                                                    2379/TCP,2380/TCP                62m
demo-etcd-headless       ClusterIP      None             <none>                                                    2379/TCP,2380/TCP                62m
demo-milvus              LoadBalancer   172.20.219.33    milvus-nlb-xxxx.elb.us-west-2.amazonaws.com   19530:31201/TCP,9091:31088/TCP   62m
demo-milvus-datacoord    ClusterIP      172.20.214.106   <none>                                                    13333/TCP,9091/TCP               62m
demo-milvus-datanode     ClusterIP      None             <none>                                                    9091/TCP                         62m
demo-milvus-indexcoord   ClusterIP      172.20.106.51    <none>                                                    31000/TCP,9091/TCP               62m
demo-milvus-indexnode    ClusterIP      None             <none>                                                    9091/TCP                         62m
demo-milvus-querycoord   ClusterIP      172.20.136.213   <none>                                                    19531/TCP,9091/TCP               62m
demo-milvus-querynode    ClusterIP      None             <none>                                                    9091/TCP                         62m
demo-milvus-rootcoord    ClusterIP      172.20.173.98    <none>                                                    53100/TCP,9091/TCP               62m
6.2 安装可视化管理工具 Attu

Attu 是 Milvus 的高效开源管理工具。它具有直观的图形用户界面(GUI),使您可以轻松地与数据库进行交互。 只需点击几下,您就可以可视化集群状态、管理元数据、执行数据查询等等。

本部分我们使用 Helm 安装并配置 Attu。

首先,使用如下代码创建 milvus_attu.yaml 配置文件。在配置文件里开启 Attu 选项,配置使用 Amazon ALB 作为 Ingress,并设置为 internet-facing 类型可通过 Internet 亦可访问 Attu。点击查看 ALB 配置说明。

attu:
  enabled: true
  name: attu
  ingress:
    enabled: true
    annotations: 
      kubernetes.io/ingress.class: alb # Annotation: set ALB ingress type
      alb.ingress.kubernetes.io/scheme: internet-facing #Places the load balancer on public subnets
      alb.ingress.kubernetes.io/target-type: ip #The Pod IPs should be used as the target IPs (rather than the node IPs)
      alb.ingress.kubernetes.io/group.name: attu # Groups multiple Ingress resources
    hosts:
      - 

然后使用 Helm 更新配置文件。

helm upgrade demo milvus/milvus -n milvus --reuse-values -f milvus_attu.yaml

再次运行如下命令:

kubectl get ingress -n milvus

可以看到名为 demo-milvus-attu 的 Ingress,其中 ADDRESS 一栏即为访问地址。

NAME               CLASS    HOSTS   ADDRESS                                     PORTS   AGE
demo-milvus-attu   <none>   *       k8s-attu-xxxx.us-west-2.elb.amazonaws.com   80      27s

使用浏览器打开 Ingress 地址,即可看到如下界面,点击 Connect 即可进行登录。

图片

登录之后就可以通过可视化的方式管理 Milvus 数据库。

图片

6.3 优化 Milvus 的资源分配

本部分介绍如何调整 EKS 上 Milvus 组件资源分配。 通常,您在生产环境中分配给 Milvus 集群的资源应该与工作负载成正比。虽然您可以在集群运行时更新配置,但我们建议在正式部署工作负载之前进行配置。

通过前边的架构图我们可以看到 Milvus 包含多个独立且解藕的组件,运行 kubectl get deployment -n milvus 命令可以看到 Milvus 的核心组件。

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
demo-milvus-attu         1/1     1            1           2d20h
demo-milvus-datacoord    1/1     1            1           2d22h
demo-milvus-datanode     1/1     1            1           2d22h
demo-milvus-indexcoord   1/1     1            1           2d22h
demo-milvus-indexnode    1/1     1            1           2d22h
demo-milvus-proxy        1/1     1            1           2d22h
demo-milvus-querycoord   1/1     1            1           2d22h
demo-milvus-querynode    1/1     1            1           2d22h
demo-milvus-rootcoord    1/1     1            1           2d22h

在默认情况下,Milvus 未明确指定 Pod 的 CPU 和 Memory 资源配置,且各个组件的 replica 为 1。我们可以根据业务负载为这些组件灵活分配资源,Milvus 官网也提供了 配置生成工具,可以根据数据量、向量维度和索引类型等多个维度给出配置建议,并一键生成 Helm 配置文件。

如下配置是在 100 万条数据、128 维向量和 HNSW 索引类型的条件下,工具给出的配置建议。

rootCoordinator:
  replicas: 1
  resources: 
    limits:
      cpu: 1
      memory: 2Gi
indexCoordinator:
  replicas: 1
  resources: 
    limits:
      cpu: "0.5"
      memory: 0.5Gi
queryCoordinator:
  replicas: 1
  resources: 
    limits:
      cpu: "0.5"
      memory: 0.5Gi
dataCoordinator:
  replicas: 1
  resources: 
    limits:
      cpu: "0.5"
      memory: 0.5Gi
proxy:
  replicas: 1
  resources: 
    limits:
      cpu: 1
      memory: 4Gi
queryNode:
  replicas: 1
  resources: 
    limits:
      cpu: 1
      memory: 4Gi
dataNode:
  replicas: 1
  resources: 
    limits:
      cpu: 1
      memory: 4Gi
indexNode:
  replicas: 1
  resources: 
    limits:
      cpu: 4
      memory: 8Gi

使用以上配置创建 milvus_resources.yaml 文件,并使用 Helm 命令进行更新。

helm upgrade demo milvus/milvus -n milvus --reuse-values -f milvus_resources.yaml

以其中一个资源变更的 pod 为例,运行 kubectl describe pod <pod-name> -n milvus 就可以看到 Pod 的 cpu 和 memory 资源分配已经更新为指定值。

Containers:
  querynode:
    Container ID:  containerd://0c29912397aa1b18471b1ec90d6da5bb6ae855fe14e3b1f85f5e60d01da3ca9c
    Image:         milvusdb/milvus:v2.2.8
    Image ID:      docker.io/milvusdb/milvus@sha256:e6ecd1a10b02dd9b179333b351caa6b685d430a32c1c1a3c9e80ec2dd9b4549d
    Ports:         21123/TCP, 9091/TCP
    Host Ports:    0/TCP, 0/TCP
    Args:
      /milvus/tools/run-helm.sh
      milvus
      run
      querynode
    State:          Running
      Started:      Wed, 17 May 2023 09:08:11 +0000
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     1
      memory:  4Gi
    Requests:
      cpu:      1
      memory:   4Gi

七、测试 Milvus 集群

我们使用 Milvus 官方的示例代码来测试 Milvus 集群能否正常工作。首先,直接下载 hello_milvus.py 示例代码。

wget https://raw.githubusercontent.com/milvus-io/pymilvus/v2.2.8/examples/hello_milvus.py

修改示例代码中的 host 为 Milvus 服务终端节点地址。

print(fmt.format("start connecting to Milvus"))
connections.connect("default", host="milvus-nlb-xxx.elb.us-west-2.amazonaws.com", port="19530")

运行代码:

python3 hello_milvus.py

返回如下结果即证明 Milvus 运行正常。

=== start connecting to Milvus     ===

Does collection hello_milvus exist in Milvus: False

=== Create collection `hello_milvus` ===


=== Start inserting entities       ===

Number of entities in Milvus: 3000

=== Start Creating index IVF_FLAT  ===


=== Start loading                  ===

该示例代码验证了 PyMilvus(Milvus 的 Python SDK)的基本操作流程,包括:

  1. 连接到 Milvus
  2. 创建 collection
  3. 插入数据
  4. 创建索引
  5. 搜索、查询和混合搜索
  6. 根据主键删除 entities
  7. 删除 collection

八、总结

本文介绍了基于 Amazon EKS 部署 Milvus 集群的方案,并在方案中集成 S3、MSK、ELB 等托管服务实现更高的弹性和可靠性。

当前,生成式 AI 领域的发展一日千里,各类大模型与向量数据库的结合也激发了无数的创新。近期,使用 LangChain、大语言模型(LLM)与向量数据库构建基于企业知识库的智能搜索和智能问答应用,颠覆了传统的开发模式,得到了广泛的关注。

Milvus 已经支持 Amazon Sagemaker、PyTorch、HuggingFace、LlamaIndex、LangChain 等业界主流的 AI 模型和框架,赶快使用 Milvus 开始您的创新之旅吧。

九、参考资料

Amazon EKS 用户指南:https://docs.aws.amazon.com/eks/latest/userguide/getting-star...

Milvus 官方网站:https://milvus.io/?trk=cndc-detail

eksctl 官方网站:https://eksctl.io/?trk=cndc-detail

本篇作者

吴万涛

亚马逊云科技解决方案架构师,负责亚马逊云科技云上解决方案架构设计和咨询,十几年 IT 行业从业经历,在网络、应用架构、容器等领域有丰富的经验。

朱伟达

Zilliz 高级工程师,DevOps & Infrastructure 团队负责人,负责 DevOps、云原生、Kubernetes 等相关的技术工作。milvus-helm、milvus-operator 等项目开发与维护者。

白雪尧

亚马逊云科技解决方案架构师,毕业于瑞典皇家理工学院,曾任职于 SAP,微软的开发、技术支持部门。对现代化应用架构,数据分析有丰富经验。对 HPC/半导体设计行业有行业经验。

文章来源:
https://dev.amazoncloud.cn/column/article/646da65d99ab8c6709d14a39?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/150893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python采集小破站视频弹幕

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用]: Python 3.8 Pycharm模块使用]: import requests 数据请求 import jieba 分词 import wordcloud 词云 import re 正则通过爬虫程序采集数据 分析数…

微信小程序渲染的富文本里面除了img标签外什么都没有,该如何设置img的大小

微信小程序富文本渲染&#xff1a; <rich-text nodes"{{content}}"style"{{style}}" ></rich-text> content是接口得到的值 let cont object.contentlet a cont.replace(/<img/gi,<img style"max-width:94%;height:auto;margi…

Kafka快速入门

文章目录 Kafka快速入门1、相关概念介绍前言1.1 基本介绍1.2 常见消息队列的比较1.3 Kafka常见相关概念介绍 2、安装Kafka3、初体验前期准备编码测试配置介绍 bug记录 Kafka快速入门 1、相关概念介绍 前言 在当今信息爆炸的时代&#xff0c;实时数据处理已经成为许多应用程序和…

python科研绘图:P-P图与Q-Q图

目录 什么是P-P图与Q-Q图 分位数 百分位数 Q-Q图步骤与原理 Shapiro-Wilk检验 绘制Q-Q图 绘制P-P图 什么是P-P图与Q-Q图 P-P图和Q-Q图都是用于检验样本的概率分布是否服从某种理论分布。 P-P图的原理是检验实际累积概率分布与理论累积概率分布是否吻合。若吻合&#xf…

HPC 工作负载管理 —— IBM Spectrum LSF Suite

全面的工作负载管理解决方案&#xff0c;通过增强用户和管理员体验以及实现规模性能来简化 HPC。 IBM Spectrum LSF Suites 是面向分布式高性能计算 (HPC) 的工作负载管理平台和作业调度程序。基于 Terraform 的自动化现已可用&#xff0c;该功能可在 IBM Cloud 上为基于 IBM …

c语言:解决数组元素右旋问题,时间复杂度O(N)

题目&#xff1a; 给一个数组&#xff0c;如【1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7】,k3。 要求得到新数组【5&#xff0c;6&#xff0c;7&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4】。 方法一&#xff0c;思路和…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

EtherCAT从站EEPROM组成信息详解(2):字8-15产品标识区

0 工具准备 1.EtherCAT从站EEPROM数据&#xff08;本文使用DE3E-556步进电机驱动器&#xff09;1 字8-字15产品标识区 1.1 产品标识区组成规范 对于不同厂家和型号的从站&#xff0c;主站是如何区分它们的呢&#xff1f;这就要提起SII的字8-字15区域存储的产品标识&#xff…

计算机视觉:人脸识别与检测

目录 前言 识别检测方法 本文方法 项目解析 完整代码及效果展示 前言 人脸识别作为一种生物特征识别技术&#xff0c;具有非侵扰性、非接触性、友好性和便捷性等优点。人脸识别通用的流程主要包括人脸检测、人脸裁剪、人脸校正、特征提取和人脸识别。人脸检测是从获取的图…

电磁场与电磁波part1--矢量分析

目录 1、方向导数 2、散度定理&#xff08;高斯定理&#xff09; 3、散度与旋度的比较 4、旋度定理&#xff08;斯托克斯定理&#xff09; 5、关于点乘、叉乘、梯度、散度、旋度的计算 ~~~~~~~~~~~~~~~~~~~~~~~~ 确认过眼神&#xff0c;是我看不懂的 ~~~~~~~~~~~~~~~~…

5. HTML中常用标签

5. html常用标签 5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>…

【C++ std::max_element std::min_element std::minmax_element】

一 、std::max_element 寻找范围 [first, last) 中的最大元素。 (1) 用 operator< 比较元素。 (3) 用给定的二元比较函数 comp 比较元素。 (2),(4) 同 (1,3) &#xff0c;但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t > (C20 前)std:…

【C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 显式指定泛型类型 )

文章目录 一、普通函数 与 函数模板 的调用规则 - 类型自动转换1、函数模板和重载函数2、类型自动转换3、代码示例 - 类型自动转换 二、普通函数 与 函数模板 的调用规则 - 类型自动转换 显式指定泛型类型1、类型自动转换 显式指定泛型类型2、代码示例 - 类型自动转换 显式指…

string的简单操作

目录 string的接口说明 构造 constructor operator 迭代器操作 begin( )和end( ) rbegin( ) 和 rend( ) 范围for和迭代器的关系 范围for 迭代器 容量 size lengtn max_size resize capacity reserve clear empty string类的元素访问 operator[ ] at fro…

构造函数和初始化列表的关系和区别【详解】

构造函数和初始化列表关系和区别&#xff0c;以及为什么有初始化列表&#xff0c;和它的好处 一、构造函数和初始化列表的关系和区别二、为什么有初始化列表三、使用初始化列表的好处 一、构造函数和初始化列表的关系和区别 百度百科这样定义初始化列表&#xff1a;与其他函数…

基于STM32的LoRaWAN无线通信网络设计与实现

LoRaWAN (Long Range Wide Area Network) 是一种低功耗的无线通信技术&#xff0c;用于构建广域物联网。本篇文章将介绍基于STM32微控制器的LoRaWAN无线通信网络的设计与实现&#xff0c;并提供相应的代码示例。 概述 LoRaWAN的无线通信技术采用低功耗长距离传输&#xff0c;…

STM32 独立看门狗

目录 1.独立看门狗介绍 2.独立看门狗本质 3.独立看门狗框图​编辑 4.独立看门狗时钟 5.预分频寄存器&#xff08;IWDG_PR)​编辑 6.重装载寄存器&#xff08;IWDG_RLR) 7.键寄存器&#xff08;IWDG_KR) 8.独立看门狗实验和代码示例 9.独立看门狗和窗口看门狗的异同点 …

【原创】java+swing+mysql个人日记管理系统设计与实现

摘要&#xff1a; 个人日记管理系统是一个可以记录、管理、存储和检索个人日记的应用程序。这个系统允许用户创建和管理多个日记帐户&#xff0c;每个帐户都可以有多个日记条目。用户可以随时添加、编辑或删除日记条目&#xff0c;并可以将这些条目按照主题或其他标准进行分类…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具&#xff0c;用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制&#xff08;SPC&#xff0c;Statistical Process…

React 高级教程

目录 前言setState函数式编程HooksMy HooksuseState定义原理函数式更新reduce 方法react 源码 useEffect定义原理无限循环 useCallback定义原理 useMemo定义比较 ReduxuseReducer定义使用应用 useContext 前言 在现代前端开发中&#xff0c;React已经成为了一种无法忽视的技术…