使用本機磁碟配置 Milvus QueryNode
本文描述如何設定 Milvus QueryNode 使用本機磁碟儲存。
概述
Milvus 是專為人工智能量身打造的向量資料庫,可有效儲存及擷取大量向量資料。它是圖像和視訊分析、自然語言處理和推薦系統等任務的理想選擇。為了確保最佳效能,將磁碟讀取延遲時間降至最低是非常重要的。強烈建議使用本機 NVMe SSD,以防止延遲並保持系統穩定。
本機磁碟儲存發揮作用的主要功能包括
- Chunk 快取:將資料預先載入本機磁碟快取,以加快搜尋速度。
- MMap:將檔案內容直接映射到記憶體,以提高記憶體效率。
- DiskANN 索引:需要磁碟儲存空間以進行有效率的索引管理。
在本文中,我們將著重於在雲端平台上部署Milvus Distributed,以及如何設定 QueryNode 使用 NVMe 磁碟儲存。下表列出各雲端供應商推薦的機器類型。
雲供應商 | 機器類型 |
---|---|
AWS | R6id 系列 |
GCP | N2 系列 |
Azure | Lsv3 系列 |
阿里巴巴雲 | i3 系列 |
騰訊雲 | IT5 系列 |
這些機器類型提供 NVMe 磁碟儲存。您可以在這些機器類型的實體上使用lsblk
指令檢查它們是否有 NVMe 磁碟儲存。如果有,您就可以進行下一步。
$ lsblk | grep nvme
nvme0n1 259:0 0 250.0G 0 disk
nvme1n1 259:1 0 250.0G 0 disk
設定 Kubernetes 使用本機磁碟
若要設定 Milvus Distributed 的 QueryNode 使用 NVMe 磁碟儲存,您需要設定目標 Kubernetes 叢集的 Worker 節點,將容器和影像儲存於 NVMe 磁碟上。其步驟依雲供應商而有所不同。
AWS
使用 Amazon EKS 時,您可以使用啟動範本自訂受管節點,您可以在其中指定節點群組的組態設定。以下是如何在 Amazon EKS 群集的工作節點上掛載 NVMe 磁碟的範例:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo "Running custom user data script"
if ( lsblk | fgrep -q nvme1n1 ); then
mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker
mkfs.xfs /dev/nvme1n1
mount /dev/nvme1n1 /mnt/data
chmod 0755 /mnt/data
mv /var/lib/kubelet /mnt/data/
mv /var/lib/docker /mnt/data/
ln -sf /mnt/data/kubelet /var/lib/kubelet
ln -sf /mnt/data/docker /var/lib/docker
UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')
echo "UUID=$UUID /mnt/data xfs defaults,noatime 1 1" >> /etc/fstab
fi
echo 10485760 > /proc/sys/fs/aio-max-nr
--==MYBOUNDARY==--
在上述範例中,我們假設 NVMe 磁碟為/dev/nvme1n1
。您需要修改腳本以符合您的特定配置。
如需詳細資訊,請參閱使用啟動範本自訂受管節點。
GCP
若要在 Google Kubernetes Engine (GKE) 叢集上佈建 Local SSD 儲存,並配置工作負載從連接至叢集中節點的 Local SSD 支援暫存中消耗資料,請執行下列指令:
gcloud container node-pools create ${POOL_NAME} \
--cluster=${CLUSTER_NAME} \
--ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \
--machine-type=${MACHINE_TYPE}
如需詳細資訊,請參閱在 GKE 上配置 Local SSD 儲存。
Azure
若要使用本機 NVMe 磁碟儲存建立虛擬機器規模集 (VMSS),您需要傳送自訂資料至虛擬機器實體。以下是如何將 NVMe 磁碟附加到 VMSS 中的虛擬機器實體的範例:
mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1
mdadm -Ds > /etc/mdadm/mdadm.conf
update-initramfs -u
mkfs.xfs /dev/md0
mkdir -p /var/lib/kubelet
echo '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab
mount -a
在上述示例中,我們假設 NVMe 磁碟為/dev/nvme0n1
和/dev/nvme1n1
。您需要修改腳本以符合您的特定配置。
阿里雲與 TecentCloud
要創建一個使用本地 SSD 卷的節點池,我們需要傳入自定義數據(Custom Data)。以下是自訂資料的範例。
#!/bin/bash
echo "nvme init start..."
mkfs.xfs /dev/nvme0n1
mkdir -p /mnt/data
echo '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab
mount -a
mkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods
mkdir -p /var/lib/kubelet /var/lib/containerd /var/log/pods
echo '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab
echo '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab
echo '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab
mount -a
echo "nvme init end..."
在上述示例中,我們假設 NVMe 磁碟為/dev/nvme0n1
。您需要修改腳本以符合您的特定配置。
您自己的 IDC
如果您正在運行自己的 IDC,並且想要在 containerd 中設定容器預設使用新掛載的 NVMe 磁碟上的檔案系統,請遵循下列步驟:
掛載 NVMe 磁碟。
確保您的 NVMe 磁碟已在主機上正確掛載。您可以將它掛載到您選擇的目錄。例如,如果您將它掛載到
/mnt/nvme
,請確定它已正確設定,而且您可以透過執行lsblk
或df -h
,在/mnt/nvme
看到磁碟可用。更新 containerd 配置。
修改 containerd 配置以使用新的掛載作為容器儲存的根目錄。
sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state sudo vim /etc/containerd/config.toml
找到
[plugins."io.containerd.grpc.v1.cri".containerd]
部分,並修改snapshotter
和root
設定,如下所示: 重新啟動 containerd。[plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs" root = "/mnt/nvme/containerd" state = "/mnt/nvme/containerd/state"
重新啟動 containerd。
重新啟動 containerd 服務以套用變更。
sudo systemctl restart containerd
驗證磁碟效能
建議您使用Fio 來驗證磁碟效能,Fio 是一種常用的磁碟效能基準測試工具。以下是如何執行 Fio 以測試磁碟效能的範例。
將測試 pod 部署到具有 NVMe 磁碟的節點。
kubectl create -f ubuntu.yaml
ubuntu.yaml
檔案如下:apiVersion: v1 kind: Pod metadata: name: ubuntu spec: containers: - name: ubuntu image: ubuntu:latest command: ["sleep", "86400"] volumeMounts: - name: data-volume mountPath: /data volumes: - name: data-volume emptyDir: {}
執行 Fio 測試磁碟效能。
# enter the container kubectl exec pod/ubuntu -it bash # in container apt-get update apt-get install fio -y # change to the mounted dir cd /data # write 10GB fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test # verify the read speed # compare with the disk performance indicators provided by various cloud providers. fio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly
輸出結果應該是這樣
Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s] iops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024 read: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec) slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96 clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13 lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74 clat percentiles (usec): | 1.00th=[ 69], 5.00th=[ 79], 10.00th=[ 85], 20.00th=[ 95], | 30.00th=[ 106], 40.00th=[ 123], 50.00th=[ 149], 60.00th=[ 11469], | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285], | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397], | 99.99th=[767558] bw ( MiB/s): min= 236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591 iops : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591 lat (usec) : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31% lat (usec) : 1000=0.08% lat (msec) : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29% lat (msec) : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01% lat (msec) : 2000=0.01% cpu : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.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.1%, >=64=0.0% issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=64
部署 Milvus Distributed
一旦驗證結果令人滿意,您就可以依照下列步驟部署 Milvus Distributed:
使用 Helm 部署 Milvus Distributed 的提示
QueryNode pod 預設使用 NVMe 磁碟作為 EmptyDir 磁碟區。建議您將 NVMe 磁碟掛載至 QueryNode pod 內的/var/lib/milvus/data
,以確保最佳效能。
有關如何使用 Helm 部署 Milvus Distributed 的詳細資訊,請參閱使用Helm 在 Kubernetes 執行 Milvus。
使用 Milvus Operator 部署 Milvus Distributed 的提示
Milvus Operator 會自動設定 QueryNode pod 使用 NVMe 磁碟作為 EmptyDir 磁碟區。建議您將下列配置新增至MilvusCluster
自訂資源:
...
spec:
components:
queryNode:
volumeMounts:
- mountPath: /var/lib/milvus/data
name: data
volumes:
- emptyDir:
name: data
這將確保 QueryNode pod 使用 NVMe 磁碟作為資料卷。有關如何使用 Milvus Operator 部署Milvus Distributed 的詳細資訊,請參閱使用Milvus Operator 在 Kubernetes 中執行 Milvus。