KubeSphere 部署向量数据库 Milvus 实战指南

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

作者:运维有术星主
Milvus 是一个为通用人工智能(GenAI)应用而构建的开源向量数据库。它以卓越的性能和灵活性,提供了一个强大的平台,用于存储、搜索和管理大规模的向量数据。Milvus 可以或许执行高速搜索,并以最小的性能损失扩展到数百亿向量。其分布式架构确保了体系的高可用性和程度可扩展性,满足不断增长的数据需求。同时,Milvus 提供了丰富的 API 和集成选项,使其成为机器学习、盘算机视觉和自然语言处理等 AI 应用的理想选择。
随着 AI 大模型的兴起,Milvus 成为了众多 AI 应用的首选向量数据库。本文将引导您探索,如安在 KubeSphere 管理的 Kubernetes 集群上,高效地部署和管理 Milvus 集群,让您的应用可以或许充分使用 Milvus 的强大功能。
实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同)
主机名IPCPU内存体系盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库ksp-control-1192.168.9.914840100KubeSphere/k8s-control-planeksp-control-2192.168.9.924840100KubeSphere/k8s-control-planeksp-control-3192.168.9.934840100KubeSphere/k8s-control-planeksp-worker-1192.168.9.9481640100k8s-worker/CIksp-worker-2192.168.9.9581640100k8s-workerksp-worker-3192.168.9.9681640100k8s-workerksp-storage-1192.168.9.974840400+ElasticSearch/Longhorn/Ceph/NFSksp-storage-2192.168.9.984840300+ElasticSearch/Longhorn/Cephksp-storage-3192.168.9.994840300+ElasticSearch/Longhorn/Cephksp-gpu-worker-1192.168.9.10141640100k8s-worker(GPU NVIDIA Tesla M40 24G)ksp-gpu-worker-2192.168.9.10241640100k8s-worker(GPU NVIDIA Tesla P100 16G)ksp-gateway-1192.168.9.1032440自建应用服务署理网关/VIP:192.168.9.100ksp-gateway-2192.168.9.1042440自建应用服务署理网关/VIP:192.168.9.100ksp-mid192.168.9.1054840100部署在 k8s 集群之外的服务节点(Gitlab 等)合计15681526002100+实战环境涉及软件版本信息

  • 操作体系:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • Milvus Helm Charts:4.2.0
  • Milvus: v.2.4.6
1. Milvus 部署规划

部署目的:官方架构图所示的 Milvus 集群(不包罗 Load Balancer)。

由于是初次安装部署,对 Milvus 的架构、组件关系仅有一个开端的了解,以是第一次部署只做如下考虑:

  • 使用 Helm 的方式,大部分配置采用默认的 Values 部署
  • 更改组件镜像地址为当地私有仓库
  • 长期化存储使用自定义的 NFS 存储类 nfs-sc(生产不建议用,可能会造成磁盘 IO 不满足 etcd 的需求)
  • coordinators 没有选择 mixCoordinator,而是使用多个独立的 coordinators,这种方案运维成本高,维护麻烦
  • 消息队列使用官方默认推荐的 pulsar,不选择 kafka
后续会深入研究,更正式的部署考虑:

  • 使用 Helm 和自定义 values 生成部署资源清单,修改清单,使用原生 kubectl 方式部署
  • 使用 Ceph 或是别的高性能存储,不使用 NFS 存储
  • 消息队列继续使用官方推荐的 pulsar
  • 使用社区官方推荐的包罗所有 coordinators 的 mixCoordinator ,降低运维成本
  • 合理规划 Minio、Etcd、pulsar 等组件使用长期化存储时所分配的存储空间,默认配置不可能满足所有场景
  • Milvus 日志存储到长期化存储,适配没有集中日志收罗能力的 k8s 集群
紧张说明: 本文的内容对于安装部署 Milvus 有肯定的鉴戒意义,但切勿将本文的实战过程直接用于任何类型的正式环境
2. 前置条件

以下内容来自 Milvus 官方环境需求文档,比力好理解,不做翻译了。
2.1 硬件需求

ComponentRequirementRecommendationNoteCPUIntel 2nd Gen Core CPU or higherApple SiliconStandalone: 4 core or moreCluster: 8 core or moreCPU instruction setSSE4.2AVXAVX2AVX-512SSE4.2AVXAVX2AVX-512Vector similarity search and index building within Milvus require CPU's support of single instruction, multiple data (SIMD) extension sets. Ensure that the CPU supports at least one of the SIMD extensions listed. See CPUs with AVX for more information.RAMStandalone: 8GCluster: 32GStandalone: 16GCluster: 128GThe size of RAM depends on the data volume.Hard driveSATA 3.0 SSD or CloudStorageNVMe SSD or higherThe size of hard drive depends on the data volume.2.2 软件需求

Operating systemSoftwareNoteLinux platformsKubernetes 1.16 or laterkubectlHelm 3.0.0 or laterminikube (for Milvus standalone)Docker 19.03 or later (for Milvus standalone)See Helm Docs for more information.SoftwareVersionNoteetcd3.5.0See additional disk requirements.MinIORELEASE.2023-03-20T20-16-18ZPulsar2.8.22.3 磁盘需求

磁盘性能对 etcd 至关紧张。官方强烈建议使用当地 NVMe SSD 磁盘。较慢的磁盘响应可能导致频繁的集群推举,最终降低 etcd 服务的性能,甚至是集群的崩溃。
这个需求比力紧张,我刚接触 Milvus 时,由于时间比力仓促,在略知一二的情况下,使用默认配置部署了一套半生产的 Milvus 集群。
因为选择了 NFS 存储且没有测试磁盘 IO 性能,经常会出现 etcd 服务异常,响应慢,被 Kubernetes 的存活检测机制判断为不可用,导致频繁主动重建 etcd 集群。
因此,在 K8s 上创建 Milvus 集群时最好先测试一下集群长期化存储的性能。
Milvus 官方给出的测试磁盘性能的工具和命令如下:
  1. mkdir test-data
  2. fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
复制代码
测试结果,理想情况下,您的磁盘应该达到 500 IOPS 以上,99th percentile fsync latency 低于 10ms。请阅读 etcd 官方文档 了解更详细的需求。
具体的磁盘性能测试过程,请参考下文。
2.4 Kubernetes 集群配置

k8s 集群肯定要配置默认存储类,Milvus 的 Helm 控制 storageClass 的参数不敷灵活,最好直接使用默认存储类,简化配置。
3. 长期化存储性能测试

实战环境使用了自建的 NFS 存储,部署 Milvus 之前,先测试存储性能:
官方建议的测试工具是 fio ,为了在 K8s 中模拟测试,我选择了 openEBS 官方提供的 openebs/tests-fio:latest 作为测试镜像,创建测试 Pod。
3.1 创建测试 pvc

编辑测试 PVC 资源清单,vi test-nfs-fio-pvc.yaml
  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4.   name: test-nfs-fio-pvc
  5. spec:
  6.   storageClassName: nfs-sc
  7.   accessModes:
  8.     - ReadWriteMany
  9.   resources:
  10.     requests:
  11.       storage: 1Gi
复制代码
执行命令,创建 PVC。
  1. kubectl apply -f test-nfs-fio-pvc.yaml
复制代码
3.2 创建测试 Pod

编辑测试 Pod 资源清单,vi test-nfs-fio-pod.yaml
  1. kind: Pod
  2. apiVersion: v1
  3. metadata:
  4.   name: test-nfs-fio-pod
  5. spec:
  6.   containers:
  7.   - name: test-nfs-fio-pod
  8.     image: openebs/tests-fio:latest
  9.     command:
  10.       - "/bin/sh"
  11.     args:
  12.       - "-c"
  13.       - "touch /mnt/SUCCESS && sleep 86400"
  14.     volumeMounts:
  15.       - name: nfs-fio-pvc
  16.         mountPath: "/mnt"
  17.   restartPolicy: "Never"
  18.   volumes:
  19.     - name: nfs-fio-pvc
  20.       persistentVolumeClaim:
  21.         claimName: test-nfs-fio-pvc
复制代码
执行命令,创建 Pod。
  1. kubectl apply -f test-nfs-fio-pod.yaml
复制代码
3.3 连接测试 Pod 终端

执行下面的命令,打开 fio 测试 Pod 终端。
  1. kubectl exec -it test-nfs-fio-pod -- /bin/bash
复制代码
查看已经挂载的 NFS 存储。
  1. root@test-nfs-fio-pod:/# df -h
  2. Filesystem                                                                                   Size  Used Avail Use% Mounted on
  3. overlay                                                                                      100G  6.5G   94G   7% /
  4. tmpfs                                                                                         64M     0   64M   0% /dev
  5. tmpfs                                                                                        7.6G     0  7.6G   0% /sys/fs/cgroup
  6. 192.168.9.97:/datanfs/k8s/default-test-nfs-fio-pvc-pvc-7158aa17-f003-47a2-b6d6-07c69d014178  100G  746M  100G   1% /mnt
  7. /dev/mapper/openeuler-root                                                                    35G  2.3G   31G   7% /etc/hosts
  8. /dev/mapper/data-lvdata                                                                      100G  6.5G   94G   7% /etc/hostname
  9. shm                                                                                           64M     0   64M   0% /dev/shm
  10. tmpfs                                                                                         14G   12K   14G   1% /run/secrets/kubernetes.io/serviceaccount
  11. tmpfs                                                                                        7.6G     0  7.6G   0% /proc/acpi
  12. tmpfs                                                                                        7.6G     0  7.6G   0% /proc/scsi
  13. tmpfs                                                                                        7.6G     0  7.6G   0% /sys/firmware
复制代码
3.4 测试磁盘性能

执行下面的测试命令。
  1. mkdir /mnt/test-data
  2. fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/test-data --size=2200m --bs=2300 --name=nfstest
复制代码
测试结果:
  1. root@test-nfs-fio-pod:/# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/test-data --size=2200m --bs=2300 --name=nfstest
  2. nfstest: (g=0): rw=write, bs=2300-2300/2300-2300/2300-2300, ioengine=sync, iodepth=1
  3. fio-2.2.10
  4. Starting 1 process
  5. nfstest: Laying out IO file(s) (1 file(s) / 2200MB)
  6. Jobs: 1 (f=1): [W(1)] [100.0% done] [0KB/956KB/0KB /s] [0/426/0 iops] [eta 00m:00s]
  7. nfstest: (groupid=0, jobs=1): err= 0: pid=26: Tue Jul 23 02:55:35 2024
  8.   write: io=2199.2MB, bw=870003B/s, iops=378, runt=2651558msec
  9.     clat (usec): min=4, max=87472, avg=224.30, stdev=309.99
  10.      lat (usec): min=4, max=87473, avg=224.71, stdev=310.00
  11.     clat percentiles (usec):
  12.      |  1.00th=[    7],  5.00th=[    8], 10.00th=[    8], 20.00th=[    9],
  13.      | 30.00th=[   10], 40.00th=[   12], 50.00th=[  302], 60.00th=[  338],
  14.      | 70.00th=[  366], 80.00th=[  398], 90.00th=[  442], 95.00th=[  482],
  15.      | 99.00th=[  588], 99.50th=[  700], 99.90th=[ 1848], 99.95th=[ 3120],
  16.      | 99.99th=[ 7008]
  17.     bw (KB  /s): min=    1, max= 1078, per=100.00%, avg=873.03, stdev=221.69
  18.     lat (usec) : 10=25.84%, 20=16.33%, 50=1.64%, 100=0.03%, 250=0.23%
  19.     lat (usec) : 500=52.30%, 750=3.19%, 1000=0.15%
  20.     lat (msec) : 2=0.20%, 4=0.05%, 10=0.03%, 20=0.01%, 50=0.01%
  21.     lat (msec) : 100=0.01%
  22.   cpu          : usr=0.38%, sys=1.56%, ctx=1567342, majf=0, minf=12
  23.   IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
  24.      submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
  25.      complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
  26.      issued    : total=r=0/w=1002985/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
  27.      latency   : target=0, window=0, percentile=100.00%, depth=1
  28. Run status group 0 (all jobs):
  29.   WRITE: io=2199.2MB, aggrb=849KB/s, minb=849KB/s, maxb=849KB/s, mint=2651558msec, maxt=2651558msec
复制代码
测试结果说明: 测试结果显着不符合官方建议的最低值。由于,是个人测试环境也就无所谓了。生产环境请严谨测试、评估
4. 使用 Helm 安装 Milvus 集群

Milvus 官方提供了 Operator、Helm 等多种方式的集群安装文档。本文实战演示了 Helm 的安装方式。其他方式请参考 Milvus 官方文档
4.1 安装 Milvus Helm Chart

添加 Milvus Helm repository。
  1. helm repo add milvus https://zilliztech.github.io/milvus-helm/
复制代码
更新当地 charts。
  1. helm repo update milvus
复制代码
4.2 安装 Milvus

官方默认安装命令(仅供参考,本文未用)。
  1. helm install my-release milvus/milvus
复制代码
按规划设置自定义配置项,执行下面的安装命令:
  1. helm install --namespace opsxlab --create-namespace opsxlab milvus/milvus \
  2.     --set image.all.repository="milvusdb/milvus" \
  3.     --set image.tools.repository="milvusdb/milvus-config-tool" \
  4.     --set etcd.image.registry="docker.io" \
  5.     --set etcd.image.repository="milvusdb/etcd" \
  6.     --set pulsar.images.broker.repository="milvusdb/pulsar" \
  7.     --set pulsar.images.autorecovery.repository="milvusdb/pulsar" \
  8.     --set pulsar.images.zookeeper.repository="milvusdb/pulsar" \
  9.     --set pulsar.images.bookie.repository="milvusdb/pulsar" \
  10.     --set pulsar.images.proxy.repository="milvusdb/pulsar" \
  11.     --set pulsar.images.pulsar_manager.repository="milvusdb/pulsar-manager" \
  12.     --set pulsar.pulsar_metadata.image.repository="milvusdb/pulsar" \
  13.     --set minio.image.repository="milvusdb/minio" \
  14.     --set etcd.persistence.storage \
  15.     --set minio.persistence.storage \
  16.     --set pulsar.zookeeper.volumes.data.storageClassName="nfs-sc" \
  17.     --set pulsar.bookkeeper.volumes.journal.storageClassName="nfs-sc"
复制代码
自定义配置说明:

  • 指定并主动创建命名空间 opsxlab
  • 设置组件的镜像地址,本文为了演示修改方法,保存了默认值,实际使用中可以修改为自己的镜像仓库地址
  • etcd 的镜像地址比力特别,有两个配置项,请留意
  • 设置长期化存储类为 nfs-sc,适用于 k8s 有多种存储类,必要部署到指定存储类的场景
  • 所有配置仅供参考,请参考官方文档查看更详细的配置
附录: 默认安装的组件镜像地址及版本:
序号组件名称默认 repository组件版本1milvusmilvusdb/milvusv2.4.62milvus-config-toolmilvusdb/milvus-config-toolv0.1.23etcdmilvusdb/etcd3.5.5-r44pulsarapachepulsar/pulsar2.9.55pulsar-managerapachepulsar/pulsar-managerv0.1.06miniominio/minioRELEASE.2023-03-20T20-16-18Z4.3 查看安装结果

Helm 安装命令成功执行后,观察 Pod 运行状态。
  1. kubectl get pods -n opsxlab
复制代码
安装成功后,输出结果如下:
  1. $ kubectl get pods -n opsxlab
  2. NAME                                         READY   STATUS      RESTARTS        AGE
  3. opsxlab-etcd-0                               1/1     Running     0               8m9s
  4. opsxlab-etcd-1                               1/1     Running     0               8m20s
  5. opsxlab-etcd-2                               1/1     Running     0               11m
  6. opsxlab-milvus-datacoord-6cd875684d-fbkgx    1/1     Running     6 (9m19s ago)   13m
  7. opsxlab-milvus-datanode-5c5558cbc7-r24vj     1/1     Running     6 (9m40s ago)   13m
  8. opsxlab-milvus-indexcoord-f48d66647-52crb    1/1     Running     0               13m
  9. opsxlab-milvus-indexnode-c6979d59b-rvm5p     1/1     Running     6 (9m44s ago)   13m
  10. opsxlab-milvus-proxy-79997676f9-hftdf        1/1     Running     6 (9m22s ago)   13m
  11. opsxlab-milvus-querycoord-5d94f97dc4-tv52n   1/1     Running     6 (9m43s ago)   13m
  12. opsxlab-milvus-querynode-59b9bd7c8b-7qljj    1/1     Running     6 (9m26s ago)   13m
  13. opsxlab-milvus-rootcoord-745b9fbb68-mr7st    1/1     Running     6 (9m36s ago)   13m
  14. opsxlab-minio-0                              1/1     Running     0               13m
  15. opsxlab-minio-1                              1/1     Running     0               13m
  16. opsxlab-minio-2                              1/1     Running     0               13m
  17. opsxlab-minio-3                              1/1     Running     0               13m
  18. opsxlab-pulsar-bookie-0                      1/1     Running     0               13m
  19. opsxlab-pulsar-bookie-1                      1/1     Running     0               13m
  20. opsxlab-pulsar-bookie-2                      1/1     Running     0               13m
  21. opsxlab-pulsar-bookie-init-7l4kh             0/1     Completed   0               13m
  22. opsxlab-pulsar-broker-0                      1/1     Running     0               13m
  23. opsxlab-pulsar-proxy-0                       1/1     Running     0               13m
  24. opsxlab-pulsar-pulsar-init-ntbh8             0/1     Completed   0               13m
  25. opsxlab-pulsar-recovery-0                    1/1     Running     0               13m
  26. opsxlab-pulsar-zookeeper-0                   1/1     Running     0               13m
  27. opsxlab-pulsar-zookeeper-1                   1/1     Running     0               13m
  28. opsxlab-pulsar-zookeeper-2                   1/1     Running     0               12m
复制代码
KubeSphere 管理控制台查看部署的组件信息。

  • Depolyment(8 个


  • StatefulSet(7 个


  • Services(17 个

从上面的 Deployment、StatefulSet、Services 资源数目来看,默认部署的 Milvus 组件还是比力多的,后期运维成本比力高。
4.4 配置认证并开启外部访问

默认配置部署的 Milvus,没有启用安全认证,任何人都可以随意读写。这不符合生产环境要求,因此,必要增加认证配置。
创建并编辑 Helm 自定义 values 配置文件,vi custom-milvus.yaml。
  1. extraConfigFiles:
  2.   user.yaml: |+
  3.     common:
  4.       security:
  5.         authorizationEnabled: true
复制代码
执行 helm 命令更新配置。
  1. helm upgrade opsxlab milvus/milvus --values custom-milvus.yaml -n opsxlab
复制代码
留意: 如果安装时自定义了镜像地址,上面的操作会导致所有组件的镜像地址被还原成 helm 默认值,请谨慎使用。
默认配置部署的 Milvus 只能被 K8s 集群内部资源访问,如果开放给集群外部,必要定义外部访问方式,本文选择最简朴的 NodePort 方式。
创建并编辑外部访问 svc 资源清单,vi milvus-external-svc.yaml。
  1. kind: Service
  2. apiVersion: v1
  3. metadata:
  4.   name: opsxlab-milvus-external
  5.   namespace: opsxlab
  6.   labels:
  7.     app: opsxlab-milvus-external
  8.     app.kubernetes.io/name: milvus
  9. spec:
  10.   ports:
  11.     - name: milvus
  12.       protocol: TCP
  13.       port: 19530
  14.       targetPort: 19530
  15.       nodePort: 31011
  16.   selector:
  17.     app.kubernetes.io/instance: opsxlab
  18.     app.kubernetes.io/name: milvus
  19.     component: proxy
  20.   clusterIP:
  21.   type: NodePort
复制代码
执行命令,创建外部服务。
  1. kubectl apply -f milvus-external-svc.yaml
复制代码
4.5 验证测试 Milvus 服务可用性

Milvus 官方默认提供了 hello_milvus.py 工具,用来测试数据库的连接和读写。
工具获取方式:
  1. wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
复制代码
该脚本运行必要 Python 环境,为了测试方便,我自己制作了一个 Docker 镜像,可用于在 Docker、k8s 环境中进行测试。
创建并编辑 milvus 测试 Pod 资源清单,vi test-milvus-pod.yaml。
  1. kind: Pod
  2. apiVersion: v1
  3. metadata:
  4.   name: test-milvus-pod
  5. spec:
  6.   containers:
  7.   - name: test-milvus-pod
  8.     image: opsxlab/milvus-hello:v2.3.7-amd64
  9.     command:
  10.       - "/bin/sh"
  11.     args:
  12.       - "-c"
  13.       - "sleep 86400"
  14.   restartPolicy: "Never"
复制代码
执行命令,创建测试 Pod。
  1. kubectl apply -f test-milvus-pod.yam
复制代码
登录测试容器终端(等待一段时间,确认 Pod 创建成功后执行)。
  1. kubectl exec -it test-milvus-pod -- /bin/bash
复制代码
官方hello_milvus.py 脚本,默认连接不带密码认证的 Milvus 集群。我们的集群增加了认证,必要修改脚本,添加认证配置,默认的用户名和密码为 root/Milvus 。
  1. # 原内容(32行)
  2. connections.connect("default", host="localhost", port="19530")
  3. # 修改为
  4. connections.connect("default", host="192.168.9.91", port="31011", user="root", password='Milvus')
复制代码
执行测试命令。
  1. python hello_milvus.py
复制代码
正确执行后,输出结果如下 :
  1. root@test-milvus-pod:/app# python hello_milvus.py
  2. === start connecting to Milvus     ===
  3. Does collection hello_milvus exist in Milvus: False
  4. === Create collection `hello_milvus` ===
  5. === Start inserting entities       ===
  6. Number of entities in Milvus: 3001
  7. === Start Creating index IVF_FLAT  ===
  8. === Start loading                  ===
  9. === Start searching based on vector similarity ===
  10. hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
  11. hit: id: 999, distance: 0.09934990108013153, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
  12. hit: id: 1310, distance: 0.10135537385940552, entity: {'random': 0.26669865443188623}, random field: 0.26669865443188623
  13. hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
  14. hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
  15. hit: id: 2669, distance: 0.1590736210346222, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
  16. search latency = 0.2742s
  17. === Start querying with `random > 0.5` ===
  18. query result:
  19. -{'random': 0.6378742006852851, 'embeddings': [np.float32(0.8367804), np.float32(0.20963514), np.float32(0.6766955), np.float32(0.39746654), np.float32(0.8180806), np.float32(0.1201905), np.float32(0.9467144), np.float32(0.6947491)], 'pk': '0'}
  20. search latency = 0.2361s
  21. query pagination(limit=4):
  22.         [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
  23. query pagination(offset=1, limit=3):
  24.         [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
  25. === Start hybrid searching with `random > 0.5` ===
  26. hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
  27. hit: id: 999, distance: 0.09934990108013153, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
  28. hit: id: 1553, distance: 0.12913644313812256, entity: {'random': 0.7723335927084438}, random field: 0.7723335927084438
  29. hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
  30. hit: id: 2669, distance: 0.1590736210346222, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
  31. hit: id: 2628, distance: 0.1914074569940567, entity: {'random': 0.940077754658375}, random field: 0.940077754658375
  32. search latency = 0.2026s
  33. === Start deleting with expr `pk in ["0" , "1"]` ===
  34. query before delete by expr=`pk in ["0" , "1"]` -> result:
  35. -{'embeddings': [np.float32(0.8367804), np.float32(0.20963514), np.float32(0.6766955), np.float32(0.39746654), np.float32(0.8180806), np.float32(0.1201905), np.float32(0.9467144), np.float32(0.6947491)], 'pk': '0', 'random': 0.6378742006852851}
  36. -{'embeddings': [np.float32(0.27875876), np.float32(0.95355743), np.float32(0.976228), np.float32(0.54545516), np.float32(0.16776836), np.float32(0.82360446), np.float32(0.65080017), np.float32(0.21096307)], 'pk': '1', 'random': 0.43925103574669633}
  37. query after delete by expr=`pk in ["0" , "1"]` -> result: []
  38. === Drop collection `hello_milvus` ===
复制代码
5. 部署可视化管理工具 Attu

Milvus 的可视化(GUI)管理工具官方推荐 Attu。它是一款 all-in-one 的 Milvus 管理工具。使用 Attu,可以显著的降低 Milvus 运维管理成本。
5.1 安装 Attu

Milvus Helm Chart 自带 Attu 的部署能力,默认是禁用的。我本人比力喜欢手工安装,以是下面介绍 kubectl 原生安装 Attu 的方法。
创建并编辑 Attu 部署资源清单, vi milvus-attu.yaml。
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: milvus-attu-external
  5.   namespace: opsxlab
  6.   labels:
  7.     app: attu
  8. spec:
  9.   type: NodePort
  10.   clusterIP:
  11.   ports:
  12.   - name: attu
  13.     protocol: TCP
  14.     port: 3000
  15.     targetPort: 3000
  16.     nodePort: 31012
  17.   selector:
  18.     app: attu
  19. ---
  20. apiVersion: apps/v1
  21. kind: Deployment
  22. metadata:
  23.   name: milvus-attu
  24.   namespace: opsxlab
  25.   labels:
  26.     app: attu
  27. spec:
  28.   replicas: 1
  29.   selector:
  30.     matchLabels:
  31.       app: attu
  32.   template:
  33.     metadata:
  34.       labels:
  35.         app: attu
  36.     spec:
  37.       containers:
  38.       - name: attu
  39.         image: zilliz/attu:v2.4
  40.         imagePullPolicy: IfNotPresent
  41.         ports:
  42.         - name: attu
  43.           containerPort: 3000
  44.           protocol: TCP
  45.         env:
  46.         - name: MILVUS_URL
  47.           value: "opsxlab-milvus:19530"
复制代码
执行命令,创建 Attu 资源。
  1. kubectl apply -f milvus-attu.yaml
复制代码
5.2 登录 Attu 管理控制台

打开欣赏器,访问 K8s 集群恣意节点 IP 的 31012 端口,例如 http://192.168.9.91:31012,默认用户名密码 root/Milvus。登录后请立即修改密码
下面以一组 Attu 管理界面的预览截图,结束本文。请各位自己探究 Attu 的强大功能。

  • 登录页面


  • 首页


  • 体系视图


  • 数据库-概览


  • 数据库-向量搜索


  • 数据库-数据


  • 数据库-分区


  • 数据库-数据段


  • 数据库-属性

免责声明:

  • 笔者程度有限,只管颠末多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、鉴戒,但严禁直接用于生产环境由此引发的任何问题,作者概不负责
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表