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

milvus-logo
LFAI
  • Home
  • Blog
  • 開始使用 Milvus 叢集和 K8s

開始使用 Milvus 叢集和 K8s

  • Engineering
April 03, 2024
Stephen Batifol

簡介

Milvus 是一個分散式向量資料庫,旨在儲存、索引和管理大量的嵌入向量。Milvus 能夠有效率地索引和搜尋數以萬億計的向量,因此成為 AI 和機器學習工作負載的首選。

Kubernetes (K8s) 則擅長於管理和擴充容器化應用程式。它提供自動擴充、自我修復和負載平衡等功能,這些功能對於在生產環境中維持高可用性和效能至關重要。

為什麼要一起使用?

K8s 可根據工作負載自動擴充 Milvus 叢集。當您的資料成長或查詢次數增加時,K8s 可以啟動更多 Milvus 實體來處理負載,確保您的應用程式保持反應迅速。

K8s 的突出特點之一是其水平擴展功能,讓您輕鬆擴展 Milvus 集群。隨著資料集的成長,K8s 能夠毫不費力地適應這種成長,使其成為一個直接且有效率的解決方案。

此外,處理查詢的能力也可透過 K8s 水平擴充。隨著查詢負載的增加,K8s 可以部署更多的 Milvus 實例來處理增加的相似性搜尋查詢,即使在重負載下也能確保低延遲的回應。

先決條件 & 設定 K8s

先決條件

  • Docker- 確保 Docker 已安裝在您的系統上。

  • Kubernetes- 準備好 Kubernetes 集群。您可以使用minikube 進行本機開發,或使用雲端供應商的 Kubernetes 服務進行生產環境。

  • Helm- 安裝 Helm,Kubernetes 的套件管理員,幫助您管理 Kubernetes 應用程式,您可以查看我們的說明文件,瞭解如何執行https://milvus.io/docs/install_cluster-helm.md

  • Kubectl- 安裝kubectl ,這是一個與 Kubernetes 叢集互動的命令列工具,用來部署應用程式、檢查和管理叢集資源,以及檢視日誌。

設定 K8s

在安裝執行 K8s 叢集所需的一切後,如果您使用minikube ,請以下列方式啟動您的叢集:

minikube start

檢查 K8s 集群的狀態:

kubectl cluster-info

在 K8s 上部署 Milvus

在這個部署中,我們選擇在集群模式下使用Milvus,以充分利用其完整的分散式功能。我們將使用 Helm 來簡化安裝流程。

1.Helm 安裝指令

helm install my-milvus milvus/milvus --set pulsar.enabled=false --set kafka.enabled=true

這個指令會在 K8s 集群上安裝 Milvus,並啟用 Kafka 和停用 Pulsar。Kafka 作為 Milvus 的訊息系統,處理不同元件間的資料串流。停用 Pulsar 並啟用 Kafka 可根據我們特定的訊息傳送偏好和需求量身打造部署。

2.連接埠轉址

若要從本機存取 Milvus,請建立連接埠轉址:kubectl port-forward svc/my-milvus 27017:19530

此指令會將 Milvus 服務svc/my-milvus 的連接埠19530 對應至您本機上的相同連接埠,讓您可以使用本機工具連線至 Milvus。如果您沒有指定本機連接埠 (如:19530),K8s 會分配一個可用的連接埠,使其成為動態。如果您選擇這種方法,請確保您記下分配的本機連接埠。

3.驗證部署:

kubectl get pods 

NAME                                    READY   STATUS    RESTARTS   AGE
my-milvus-datacoord-595b996bd4-zprpd    1/1     Running   0          85m
my-milvus-datanode-d9d555785-47nkt      1/1     Running   0          85m
my-milvus-etcd-0                        1/1     Running   0          84m
my-milvus-etcd-1                        1/1     Running   0          85m
my-milvus-etcd-2                        1/1     Running   0          85m
my-milvus-indexcoord-65bc68968c-6jg6q   1/1     Running   0          85m
my-milvus-indexnode-54586f55d-z9vx4     1/1     Running   0          85m
my-milvus-kafka-0                       1/1     Running   0          85m
my-milvus-kafka-1                       1/1     Running   0          85m
my-milvus-kafka-2                       1/1     Running   0          85m
my-milvus-minio-0                       1/1     Running   0          96m
my-milvus-minio-1                       1/1     Running   0          96m
my-milvus-minio-2                       1/1     Running   0          96m
my-milvus-minio-3                       1/1     Running   0          96m
my-milvus-proxy-76bb7d497f-sqwvd        1/1     Running   0          85m
my-milvus-querycoord-6f4c7b7598-b6twj   1/1     Running   0          85m
my-milvus-querynode-677bdf485b-ktc6m    1/1     Running   0          85m
my-milvus-rootcoord-7498fddfd8-v5zw8    1/1     Running   0          85m
my-milvus-zookeeper-0                   1/1     Running   0          85m
my-milvus-zookeeper-1                   1/1     Running   0          85m
my-milvus-zookeeper-2                   1/1     Running   0          85m

您應該會看到類似上面輸出的 Pod 列表,所有的 Pod 都處於 Running 狀態。這表示您的 Milvus 叢集已開始運作。具體來說,請在READY 一欄下尋找 1/1,這表示每個 Pod 已經完全就緒且正在運行。如果有任何 Pod 未處於 Running 狀態,您可能需要進一步調查,以確保成功部署。

隨著您的 Milvus 叢集部署完成且所有元件都確認正在執行,您現在可以開始進行資料擷取與索引。這將涉及連接到您的 Milvus 實例、建立集合,以及插入向量以進行搜尋和檢索。

資料擷取與索引

要在 Milvus 集群中開始資料擷取和索引,我們將使用 pymilvus SDK。有兩種安裝選項:

  • 基本 SDK:pip install pymilvus

  • 用於豐富的文字嵌入和進階模型:pip install pymilvus[model]

時間在我們的叢集中插入資料,我們會使用pymilvus ,您可以只安裝pip install pymilvus 來安裝 SDK,如果您想要抽取富文字內嵌,您也可以透過安裝pip install pymilvus[model] 來使用PyMilvus Models

連接並創建一個集合:

首先,使用您之前轉發的連接埠連線到您的 Milvus 實例。確保 URI 與 K8s 指定的本機連接埠相符:

from pymilvus import MilvusClient

client = MilvusClient(
        uri="http://127.0.0.1:52070",
    )

client.create_collection(collection_name="quick_setup", dimension=5)

dimension=5 參數定義此資料集的向量大小,這對向量搜尋功能非常重要。

插入資料

以下是如何插入一組初始資料,其中每個向量代表一個項目,顏色欄位增加一個描述屬性:

data=[
    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]

res = client.insert(
    collection_name="quick_setup",
    data=data
)

print(res)

所提供的程式碼假設您已經以快速設定方式建立了一個集合。如上述代碼所示、

要插入的資料被組織成一個字典清單,其中每個字典代表一個資料記錄,稱為一個實體。

每個字典包含一個命名為 color 的非結構描述定義欄位。

每個字典包含與預先定義和動態欄位對應的鍵。

插入更多的資料

colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
    "id": i, 
    "vector": [ random.uniform(-1, 1) for _ in range(5) ], 
    "color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}" 
} for i in range(1000) ]

res = client.insert(
    collection_name="quick_setup",
    data=data[10:]
)

print(res)

填充資料集後,您可以執行相似性搜尋,找出與查詢向量接近的向量。query_vectors 變數的值是一個包含浮點數的子清單。子清單代表五維的向量嵌入。

query_vectors = [
    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]

res = client.search(
    collection_name="quick_setup",     # target collection
    data=query_vectors,                # query vectors
    limit=3,                           # number of returned entities
)

print(res)

這個查詢會搜尋與我們的查詢向量最相似的前 3 個向量,展示了 Milvus 強大的搜尋能力。

從 K8s 卸載 Milvus

完成本教學後,請使用helm uninstall my-milvus 從 K8s 叢集卸載 Milvus。

這個指令會移除所有部署在my-milvus 版本的 Milvus 元件,釋放叢集的資源。

總結

  • 在 Kubernetes 集群上部署 Milvus 展示了向量資料庫在處理人工智能和機器學習工作負載時的可擴展性和靈活性。透過本教學,您已學會使用 Helm 設定 Milvus、建立資料集、執行資料擷取與類似性搜尋的基本知識。

  • 使用 Helm 在 Kubernetes 集群上安裝 Milvus 應該很簡單。若要深入瞭解如何擴充 Milvus 叢集,以應付更大的資料集或更密集的工作負載,我們的文件提供了詳細的指引https://milvus.io/docs/scaleout.md。

歡迎在Github 上查看程式碼、瞭解Milvus、嘗試不同的配置和用例,並加入我們的Discord 與社群分享您的經驗。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

繼續閱讀