🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
主頁
  • 管理指南
  • Home
  • Docs
  • 管理指南

  • 組態

  • 使用本機磁碟的 QueryNode

使用本機磁碟配置 Milvus QueryNode

本文描述如何設定 Milvus QueryNode 使用本機磁碟儲存。

概述

Milvus 是專為人工智能量身打造的向量資料庫,可有效儲存及擷取大量向量資料。它是圖像和視訊分析、自然語言處理和推薦系統等任務的理想選擇。為了確保最佳效能,將磁碟讀取延遲時間降至最低是非常重要的。強烈建議使用本機 NVMe SSD,以防止延遲並保持系統穩定。

本機磁碟儲存發揮作用的主要功能包括

  • Chunk 快取:將資料預先載入本機磁碟快取,以加快搜尋速度。
  • MMap:將檔案內容直接映射到記憶體,以提高記憶體效率。
  • DiskANN 索引:需要磁碟儲存空間以進行有效率的索引管理。

在本文中,我們將著重於在雲端平台上部署Milvus Distributed,以及如何設定 QueryNode 使用 NVMe 磁碟儲存。下表列出各雲端供應商推薦的機器類型。

雲供應商機器類型
AWSR6id 系列
GCPN2 系列
AzureLsv3 系列
阿里巴巴雲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 ,請確定它已正確設定,而且您可以透過執行lsblkdf -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] 部分,並修改snapshotterroot 設定,如下所示: 重新啟動 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

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?