作者:運維有術星主
Milvus 是一個為通用人工智慧(GenAI)應用而構建的開源向量資料庫。它以卓越的效能和靈活性,提供了一個強大的平臺,用於儲存、搜尋和管理大規模的向量資料。Milvus 能夠執行高速搜尋,並以最小的效能損失擴充套件到數百億向量。其分散式架構確保了系統的高可用性和水平可擴充套件性,滿足不斷增長的資料需求。同時,Milvus 提供了豐富的 API 和整合選項,使其成為機器學習、計算機視覺和自然語言處理等 AI 應用的理想選擇。
隨著 AI 大模型的興起,Milvus 成為了眾多 AI 應用的首選向量資料庫。本文將引導您探索,如何在 KubeSphere 管理的 Kubernetes 叢集上,高效地部署和管理 Milvus 叢集,讓您的應用能夠充分利用 Milvus 的強大功能。
實戰伺服器配置(架構 1:1 復刻小規模生產環境,配置略有不同)
主機名 | IP | CPU | 記憶體 | 系統盤 | 資料盤 | 用途 |
---|---|---|---|---|---|---|
ksp-registry | 192.168.9.90 | 4 | 8 | 40 | 200 | Harbor 映象倉庫 |
ksp-control-1 | 192.168.9.91 | 4 | 8 | 40 | 100 | KubeSphere/k8s-control-plane |
ksp-control-2 | 192.168.9.92 | 4 | 8 | 40 | 100 | KubeSphere/k8s-control-plane |
ksp-control-3 | 192.168.9.93 | 4 | 8 | 40 | 100 | KubeSphere/k8s-control-plane |
ksp-worker-1 | 192.168.9.94 | 8 | 16 | 40 | 100 | k8s-worker/CI |
ksp-worker-2 | 192.168.9.95 | 8 | 16 | 40 | 100 | k8s-worker |
ksp-worker-3 | 192.168.9.96 | 8 | 16 | 40 | 100 | k8s-worker |
ksp-storage-1 | 192.168.9.97 | 4 | 8 | 40 | 400+ | ElasticSearch/Longhorn/Ceph/NFS |
ksp-storage-2 | 192.168.9.98 | 4 | 8 | 40 | 300+ | ElasticSearch/Longhorn/Ceph |
ksp-storage-3 | 192.168.9.99 | 4 | 8 | 40 | 300+ | ElasticSearch/Longhorn/Ceph |
ksp-gpu-worker-1 | 192.168.9.101 | 4 | 16 | 40 | 100 | k8s-worker(GPU NVIDIA Tesla M40 24G) |
ksp-gpu-worker-2 | 192.168.9.102 | 4 | 16 | 40 | 100 | k8s-worker(GPU NVIDIA Tesla P100 16G) |
ksp-gateway-1 | 192.168.9.103 | 2 | 4 | 40 | 自建應用服務代理閘道器/VIP:192.168.9.100 | |
ksp-gateway-2 | 192.168.9.104 | 2 | 4 | 40 | 自建應用服務代理閘道器/VIP:192.168.9.100 | |
ksp-mid | 192.168.9.105 | 4 | 8 | 40 | 100 | 部署在 k8s 叢集之外的服務節點(Gitlab 等) |
合計 | 15 | 68 | 152 | 600 | 2100+ |
實戰環境涉及軟體版本資訊
- 作業系統: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 硬體需求
Component | Requirement | Recommendation | Note |
---|---|---|---|
CPU | Intel 2nd Gen Core CPU or higherApple Silicon | Standalone: 4 core or moreCluster: 8 core or more | |
CPU instruction set | SSE4.2AVXAVX2AVX-512 | SSE4.2AVXAVX2AVX-512 | Vector 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. |
RAM | Standalone: 8GCluster: 32G | Standalone: 16GCluster: 128G | The size of RAM depends on the data volume. |
Hard drive | SATA 3.0 SSD or CloudStorage | NVMe SSD or higher | The size of hard drive depends on the data volume. |
2.2 軟體需求
Operating system | Software | Note |
---|---|---|
Linux platforms | Kubernetes 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. |
Software | Version | Note |
---|---|---|
etcd | 3.5.0 | See additional disk requirements. |
MinIO | RELEASE.2023-03-20T20-16-18Z | |
Pulsar | 2.8.2 |
2.3 磁碟需求
磁碟效能對 etcd 至關重要。官方強烈建議使用本地 NVMe SSD 磁碟。較慢的磁碟響應可能導致頻繁的叢集選舉,最終降低 etcd 服務的效能,甚至是叢集的崩潰。
這個需求比較重要,我剛接觸 Milvus 時,由於時間比較倉促,在略知一二的情況下,使用預設配置部署了一套半生產的 Milvus 叢集。
因為選擇了 NFS 儲存且沒有測試磁碟 IO 效能,經常會出現 etcd 服務異常,響應慢,被 Kubernetes 的存活檢測機制判斷為不可用,導致頻繁自動重建 etcd 叢集。
因此,在 K8s 上建立 Milvus 叢集時最好先測試一下叢集持久化儲存的效能。
Milvus 官方給出的測試磁碟效能的工具和命令如下:
mkdir test-data
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
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-nfs-fio-pvc
spec:
storageClassName: nfs-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
執行命令,建立 PVC。
kubectl apply -f test-nfs-fio-pvc.yaml
3.2 建立測試 Pod
編輯測試 Pod 資源清單,vi test-nfs-fio-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-nfs-fio-pod
spec:
containers:
- name: test-nfs-fio-pod
image: openebs/tests-fio:latest
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && sleep 86400"
volumeMounts:
- name: nfs-fio-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-fio-pvc
persistentVolumeClaim:
claimName: test-nfs-fio-pvc
執行命令,建立 Pod。
kubectl apply -f test-nfs-fio-pod.yaml
3.3 連線測試 Pod 終端
執行下面的命令,開啟 fio 測試 Pod 終端。
kubectl exec -it test-nfs-fio-pod -- /bin/bash
檢視已經掛載的 NFS 儲存。
root@test-nfs-fio-pod:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 100G 6.5G 94G 7% /
tmpfs 64M 0 64M 0% /dev
tmpfs 7.6G 0 7.6G 0% /sys/fs/cgroup
192.168.9.97:/datanfs/k8s/default-test-nfs-fio-pvc-pvc-7158aa17-f003-47a2-b6d6-07c69d014178 100G 746M 100G 1% /mnt
/dev/mapper/openeuler-root 35G 2.3G 31G 7% /etc/hosts
/dev/mapper/data-lvdata 100G 6.5G 94G 7% /etc/hostname
shm 64M 0 64M 0% /dev/shm
tmpfs 14G 12K 14G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 7.6G 0 7.6G 0% /proc/acpi
tmpfs 7.6G 0 7.6G 0% /proc/scsi
tmpfs 7.6G 0 7.6G 0% /sys/firmware
3.4 測試磁碟效能
執行下面的測試命令。
mkdir /mnt/test-data
fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/test-data --size=2200m --bs=2300 --name=nfstest
測試結果:
root@test-nfs-fio-pod:/# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/test-data --size=2200m --bs=2300 --name=nfstest
nfstest: (g=0): rw=write, bs=2300-2300/2300-2300/2300-2300, ioengine=sync, iodepth=1
fio-2.2.10
Starting 1 process
nfstest: Laying out IO file(s) (1 file(s) / 2200MB)
Jobs: 1 (f=1): [W(1)] [100.0% done] [0KB/956KB/0KB /s] [0/426/0 iops] [eta 00m:00s]
nfstest: (groupid=0, jobs=1): err= 0: pid=26: Tue Jul 23 02:55:35 2024
write: io=2199.2MB, bw=870003B/s, iops=378, runt=2651558msec
clat (usec): min=4, max=87472, avg=224.30, stdev=309.99
lat (usec): min=4, max=87473, avg=224.71, stdev=310.00
clat percentiles (usec):
| 1.00th=[ 7], 5.00th=[ 8], 10.00th=[ 8], 20.00th=[ 9],
| 30.00th=[ 10], 40.00th=[ 12], 50.00th=[ 302], 60.00th=[ 338],
| 70.00th=[ 366], 80.00th=[ 398], 90.00th=[ 442], 95.00th=[ 482],
| 99.00th=[ 588], 99.50th=[ 700], 99.90th=[ 1848], 99.95th=[ 3120],
| 99.99th=[ 7008]
bw (KB /s): min= 1, max= 1078, per=100.00%, avg=873.03, stdev=221.69
lat (usec) : 10=25.84%, 20=16.33%, 50=1.64%, 100=0.03%, 250=0.23%
lat (usec) : 500=52.30%, 750=3.19%, 1000=0.15%
lat (msec) : 2=0.20%, 4=0.05%, 10=0.03%, 20=0.01%, 50=0.01%
lat (msec) : 100=0.01%
cpu : usr=0.38%, sys=1.56%, ctx=1567342, majf=0, minf=12
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=0/w=1002985/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
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。
helm repo add milvus https://zilliztech.github.io/milvus-helm/
更新本地 charts。
helm repo update milvus
4.2 安裝 Milvus
官方預設安裝命令(僅供參考,本文未用)。
helm install my-release milvus/milvus
按規劃設定自定義配置項,執行下面的安裝命令:
helm install --namespace opsxlab --create-namespace opsxlab milvus/milvus \
--set image.all.repository="milvusdb/milvus" \
--set image.tools.repository="milvusdb/milvus-config-tool" \
--set etcd.image.registry="docker.io" \
--set etcd.image.repository="milvusdb/etcd" \
--set pulsar.images.broker.repository="milvusdb/pulsar" \
--set pulsar.images.autorecovery.repository="milvusdb/pulsar" \
--set pulsar.images.zookeeper.repository="milvusdb/pulsar" \
--set pulsar.images.bookie.repository="milvusdb/pulsar" \
--set pulsar.images.proxy.repository="milvusdb/pulsar" \
--set pulsar.images.pulsar_manager.repository="milvusdb/pulsar-manager" \
--set pulsar.pulsar_metadata.image.repository="milvusdb/pulsar" \
--set minio.image.repository="milvusdb/minio" \
--set etcd.persistence.storageClass="nfs-sc" \
--set minio.persistence.storageClass="nfs-sc" \
--set pulsar.zookeeper.volumes.data.storageClassName="nfs-sc" \
--set pulsar.bookkeeper.volumes.journal.storageClassName="nfs-sc"
自定義配置說明:
- 指定並自動建立名稱空間 opsxlab
- 設定元件的映象地址,本文為了演示修改方法,保留了預設值,實際使用中可以修改為自己的映象倉庫地址
- etcd 的映象地址比較特殊,有兩個配置項,請注意
- 設定持久化儲存類為
nfs-sc
,適用於 k8s 有多種儲存類,需要部署到指定儲存類的場景 - 所有配置僅供參考,請參考官方文件檢視更詳細的配置
附錄: 預設安裝的元件映象地址及版本:
序號 | 元件名稱 | 預設 repository | 元件版本 |
---|---|---|---|
1 | milvus | milvusdb/milvus | v2.4.6 |
2 | milvus-config-tool | milvusdb/milvus-config-tool | v0.1.2 |
3 | etcd | milvusdb/etcd | 3.5.5-r4 |
4 | pulsar | apachepulsar/pulsar | 2.9.5 |
5 | pulsar-manager | apachepulsar/pulsar-manager | v0.1.0 |
6 | minio | minio/minio | RELEASE.2023-03-20T20-16-18Z |
4.3 檢視安裝結果
Helm 安裝命令成功執行後,觀察 Pod 執行狀態。
kubectl get pods -n opsxlab
安裝成功後,輸出結果如下:
$ kubectl get pods -n opsxlab
NAME READY STATUS RESTARTS AGE
opsxlab-etcd-0 1/1 Running 0 8m9s
opsxlab-etcd-1 1/1 Running 0 8m20s
opsxlab-etcd-2 1/1 Running 0 11m
opsxlab-milvus-datacoord-6cd875684d-fbkgx 1/1 Running 6 (9m19s ago) 13m
opsxlab-milvus-datanode-5c5558cbc7-r24vj 1/1 Running 6 (9m40s ago) 13m
opsxlab-milvus-indexcoord-f48d66647-52crb 1/1 Running 0 13m
opsxlab-milvus-indexnode-c6979d59b-rvm5p 1/1 Running 6 (9m44s ago) 13m
opsxlab-milvus-proxy-79997676f9-hftdf 1/1 Running 6 (9m22s ago) 13m
opsxlab-milvus-querycoord-5d94f97dc4-tv52n 1/1 Running 6 (9m43s ago) 13m
opsxlab-milvus-querynode-59b9bd7c8b-7qljj 1/1 Running 6 (9m26s ago) 13m
opsxlab-milvus-rootcoord-745b9fbb68-mr7st 1/1 Running 6 (9m36s ago) 13m
opsxlab-minio-0 1/1 Running 0 13m
opsxlab-minio-1 1/1 Running 0 13m
opsxlab-minio-2 1/1 Running 0 13m
opsxlab-minio-3 1/1 Running 0 13m
opsxlab-pulsar-bookie-0 1/1 Running 0 13m
opsxlab-pulsar-bookie-1 1/1 Running 0 13m
opsxlab-pulsar-bookie-2 1/1 Running 0 13m
opsxlab-pulsar-bookie-init-7l4kh 0/1 Completed 0 13m
opsxlab-pulsar-broker-0 1/1 Running 0 13m
opsxlab-pulsar-proxy-0 1/1 Running 0 13m
opsxlab-pulsar-pulsar-init-ntbh8 0/1 Completed 0 13m
opsxlab-pulsar-recovery-0 1/1 Running 0 13m
opsxlab-pulsar-zookeeper-0 1/1 Running 0 13m
opsxlab-pulsar-zookeeper-1 1/1 Running 0 13m
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
。
extraConfigFiles:
user.yaml: |+
common:
security:
authorizationEnabled: true
執行 helm 命令更新配置。
helm upgrade opsxlab milvus/milvus --values custom-milvus.yaml -n opsxlab
注意: 如果安裝時自定義了映象地址,上面的操作會導致所有元件的映象地址被還原成 helm 預設值,請謹慎使用。
預設配置部署的 Milvus 只能被 K8s 叢集內部資源訪問,如果開放給叢集外部,需要定義外部訪問方式,本文選擇最簡單的 NodePort 方式。
建立並編輯外部訪問 svc 資源清單,vi milvus-external-svc.yaml
。
kind: Service
apiVersion: v1
metadata:
name: opsxlab-milvus-external
namespace: opsxlab
labels:
app: opsxlab-milvus-external
app.kubernetes.io/name: milvus
spec:
ports:
- name: milvus
protocol: TCP
port: 19530
targetPort: 19530
nodePort: 31011
selector:
app.kubernetes.io/instance: opsxlab
app.kubernetes.io/name: milvus
component: proxy
clusterIP:
type: NodePort
執行命令,建立外部服務。
kubectl apply -f milvus-external-svc.yaml
4.5 驗證測試 Milvus 服務可用性
Milvus 官方預設提供了 hello_milvus.py
工具,用來測試資料庫的連線和讀寫。
工具獲取方式:
wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
該指令碼執行需要 Python 環境,為了測試方便,我自己製作了一個 Docker 映象,可用於在 Docker、k8s 環境中進行測試。
建立並編輯 milvus 測試 Pod 資源清單,vi test-milvus-pod.yaml
。
kind: Pod
apiVersion: v1
metadata:
name: test-milvus-pod
spec:
containers:
- name: test-milvus-pod
image: opsxlab/milvus-hello:v2.3.7-amd64
command:
- "/bin/sh"
args:
- "-c"
- "sleep 86400"
restartPolicy: "Never"
執行命令,建立測試 Pod。
kubectl apply -f test-milvus-pod.yam
登入測試容器終端(等待一段時間,確認 Pod 建立成功後執行)。
kubectl exec -it test-milvus-pod -- /bin/bash
官方hello_milvus.py
指令碼,預設連線不帶密碼認證的 Milvus 叢集。我們的叢集增加了認證,需要修改指令碼,新增認證配置,預設的使用者名稱和密碼為 root/Milvus
。
# 原內容(32行)
connections.connect("default", host="localhost", port="19530")
# 修改為
connections.connect("default", host="192.168.9.91", port="31011", user="root", password='Milvus')
執行測試命令。
python hello_milvus.py
正確執行後,輸出結果如下 :
root@test-milvus-pod:/app# python hello_milvus.py
=== start connecting to Milvus ===
Does collection hello_milvus exist in Milvus: False
=== Create collection `hello_milvus` ===
=== Start inserting entities ===
Number of entities in Milvus: 3001
=== Start Creating index IVF_FLAT ===
=== Start loading ===
=== Start searching based on vector similarity ===
hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 999, distance: 0.09934990108013153, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
hit: id: 1310, distance: 0.10135537385940552, entity: {'random': 0.26669865443188623}, random field: 0.26669865443188623
hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
hit: id: 2669, distance: 0.1590736210346222, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
search latency = 0.2742s
=== Start querying with `random > 0.5` ===
query result:
-{'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'}
search latency = 0.2361s
query pagination(limit=4):
[{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
query pagination(offset=1, limit=3):
[{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
=== Start hybrid searching with `random > 0.5` ===
hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 999, distance: 0.09934990108013153, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
hit: id: 1553, distance: 0.12913644313812256, entity: {'random': 0.7723335927084438}, random field: 0.7723335927084438
hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
hit: id: 2669, distance: 0.1590736210346222, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
hit: id: 2628, distance: 0.1914074569940567, entity: {'random': 0.940077754658375}, random field: 0.940077754658375
search latency = 0.2026s
=== Start deleting with expr `pk in ["0" , "1"]` ===
query before delete by expr=`pk in ["0" , "1"]` -> result:
-{'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}
-{'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}
query after delete by expr=`pk in ["0" , "1"]` -> result: []
=== 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
。
apiVersion: v1
kind: Service
metadata:
name: milvus-attu-external
namespace: opsxlab
labels:
app: attu
spec:
type: NodePort
clusterIP:
ports:
- name: attu
protocol: TCP
port: 3000
targetPort: 3000
nodePort: 31012
selector:
app: attu
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: milvus-attu
namespace: opsxlab
labels:
app: attu
spec:
replicas: 1
selector:
matchLabels:
app: attu
template:
metadata:
labels:
app: attu
spec:
containers:
- name: attu
image: zilliz/attu:v2.4
imagePullPolicy: IfNotPresent
ports:
- name: attu
containerPort: 3000
protocol: TCP
env:
- name: MILVUS_URL
value: "opsxlab-milvus:19530"
執行命令,建立 Attu 資源。
kubectl apply -f milvus-attu.yaml
5.2 登入 Attu 管理控制檯
開啟瀏覽器,訪問 K8s 叢集任意節點 IP 的 31012 埠,例如 http://192.168.9.91:31012,預設使用者名稱密碼 root/Milvus
。登入後請立即修改密碼。
下面以一組 Attu 管理介面的預覽截圖,結束本文。請各位自己探究 Attu 的強大功能。
- 登入頁面
- 首頁
- 系統檢視
- 資料庫-概覽
- 資料庫-向量搜尋
- 資料庫-資料
- 資料庫-分割槽
- 資料庫-資料段
- 資料庫-屬性
免責宣告:
- 筆者水平有限,儘管經過多次驗證和檢查,盡力確保內容的準確性,但仍可能存在疏漏之處。敬請業界專家大佬不吝指教。
- 本文所述內容僅透過實戰環境驗證測試,讀者可學習、借鑑,但嚴禁直接用於生產環境。由此引發的任何問題,作者概不負責!
本文由部落格一文多發平臺 OpenWrite 釋出!