Milvus Cluster Setup mit Kubernetes vor Ort
In diesem Abschnitt wird die Einrichtung des milvus-Clusters für die Vektordatenbanklösung für NetApp erläutert.
Milvus Cluster-Einrichtung mit Kubernetes vor Ort
Kundenherausforderungen bei der unabhängigen Skalierung nach Storage- und Computing-Ressourcen, effektivem Infrastrukturmanagement und Datenmanagement,
Kubernetes- und Vektordatenbanken bilden zusammen eine leistungsstarke, skalierbare Lösung für das Management großer Datenvorgänge. Kubernetes optimiert Ressourcen und managt Container. Vektordatenbanken können hochdimensionale Daten und Ähnlichkeitssuchen effizient verarbeiten. Diese Kombination ermöglicht die schnelle Verarbeitung komplexer Abfragen auf großen Datensätzen und lässt sich nahtlos an wachsende Datenvolumen skalieren. Dadurch eignet sie sich ideal für Big-Data-Applikationen und KI-Workloads.
-
In diesem Abschnitt wird der Prozess der Installation eines Milvus Clusters auf Kubernetes beschrieben, der einen NetApp Storage Controller für Cluster- und Kundendaten verwendet.
-
Für die Installation eines Milvus-Clusters sind Persistent Volumes (PVs) erforderlich, um Daten aus verschiedenen Milvus-Clusterkomponenten zu speichern. Zu diesen Komponenten gehören etcd (drei Instanzen), Pulsar-bookie-Journal (drei Instanzen), Pulsar-bookie-Ledgers (drei Instanzen) und Pulsar-Zookeeper-Daten (drei Instanzen).
Im milvus-Cluster können wir entweder Pulsar oder kafka für die zugrunde liegende Engine verwenden, die die zuverlässige Speicherung und Veröffentlichung/Abonnement von Nachrichtenströmen des Milvus-Clusters unterstützt. Im Falle von Kafka mit NFS hat NetApp Verbesserungen in ONTAP 9.12.1 und höher vorgenommen. Diese Verbesserungen sowie Änderungen an NFSv4.1 und Linux, die in RHEL 8.7 oder 9.1 und höher enthalten sind, lösen das Problem des „dummen Umbenennungen“, das beim Ausführen von Kafka über NFS auftreten kann. Wenn Sie ausführlichere Informationen zum Thema kafka mit NetApp-NFS laufen wünschen, lesen Sie bitte - "Dieser Link". -
Wir haben aus NetApp ONTAP ein einzelnes NFS Volume erstellt und 12 persistente Volumes eingerichtet, jedes mit 250 GB Storage. Die Storage-Größe kann je nach Cluster-Größe variieren; wir haben z. B. einen weiteren Cluster, in dem jeder PV 50 GB hat. Bitte beachten Sie unten eine der PV YAML-Dateien für weitere Details; wir hatten insgesamt 12 solche Dateien. In jeder Datei wird der storageClassName auf 'default' gesetzt, und der Speicher und der Pfad sind für jedes PV eindeutig.
root@node2:~# cat sai_nfs_to_default_pv1.yaml apiVersion: v1 kind: PersistentVolume metadata: name: karthik-pv1 spec: capacity: storage: 250Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: default local: path: /vectordbsc/milvus/milvus1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node2 - node3 - node4 - node5 - node6 root@node2:~#
-
Führen Sie den Befehl 'kubectl apply' für jede PV YAML-Datei aus, um die Persistent Volumes zu erstellen, und überprüfen Sie dann ihre Erstellung mit ‘kubectl get pv’
root@node2:~# for i in $( seq 1 12 ); do kubectl apply -f sai_nfs_to_default_pv$i.yaml; done persistentvolume/karthik-pv1 created persistentvolume/karthik-pv2 created persistentvolume/karthik-pv3 created persistentvolume/karthik-pv4 created persistentvolume/karthik-pv5 created persistentvolume/karthik-pv6 created persistentvolume/karthik-pv7 created persistentvolume/karthik-pv8 created persistentvolume/karthik-pv9 created persistentvolume/karthik-pv10 created persistentvolume/karthik-pv11 created persistentvolume/karthik-pv12 created root@node2:~#
-
Zum Speichern von Kundendaten unterstützt Milvus Objekt-Storage-Lösungen wie Minio, Azure Blob und S3. In diesem Leitfaden verwenden wir S3. Die folgenden Schritte gelten sowohl für ONTAP S3 als auch für StorageGRID Objektspeicher. Wir verwenden Helm zur Bereitstellung des Milvus Clusters. Laden Sie die Konfigurationsdatei Values.yaml vom Milvus Download-Speicherort herunter. Die Datei Values.yaml, die wir in diesem Dokument verwendet haben, finden Sie im Anhang.
-
Stellen Sie sicher, dass die 'StorageClass' in jedem Abschnitt auf 'Standard' gesetzt ist, einschließlich derjenigen für das Protokoll, etc., Zookeeper und Buchhalter.
-
Deaktivieren Sie Minio im Abschnitt Minio.
-
Erstellen Sie einen NAS-Bucket aus ONTAP oder StorageGRID-Objekt-Storage und fügen Sie sie mit den Zugangsdaten für den Objekt-Storage in ein externes S3-System ein.
################################### # External S3 # - these configs are only used when `externalS3.enabled` is true ################################### externalS3: enabled: true host: "192.168.150.167" port: "80" accessKey: "24G4C1316APP2BIPDE5S" secretKey: "Zd28p43rgZaU44PX_ftT279z9nt4jBSro97j87Bx" useSSL: false bucketName: "milvusdbvol1" rootPath: "" useIAM: false cloudProvider: "aws" iamEndpoint: "" region: "" useVirtualHost: false
-
Stellen Sie vor dem Erstellen des Milvus-Clusters sicher, dass das PersistentVolumeClaim (PVC) keine bereits vorhandenen Ressourcen hat.
root@node2:~# kubectl get pvc No resources found in default namespace. root@node2:~#
-
Verwenden Sie Helm und die Konfigurationsdatei Values.yaml, um den Milvus-Cluster zu installieren und zu starten.
root@node2:~# helm upgrade --install my-release milvus/milvus --set global.storageClass=default -f values.yaml Release "my-release" does not exist. Installing it now. NAME: my-release LAST DEPLOYED: Thu Mar 14 15:00:07 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None root@node2:~#
-
Überprüfen Sie den Status der PersistentVolumeClaims (VES).
root@node2:~# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-my-release-etcd-0 Bound karthik-pv8 250Gi RWO default 3s data-my-release-etcd-1 Bound karthik-pv5 250Gi RWO default 2s data-my-release-etcd-2 Bound karthik-pv4 250Gi RWO default 3s my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0 Bound karthik-pv10 250Gi RWO default 3s my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1 Bound karthik-pv3 250Gi RWO default 3s my-release-pulsar-bookie-journal-my-release-pulsar-bookie-2 Bound karthik-pv1 250Gi RWO default 3s my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0 Bound karthik-pv2 250Gi RWO default 3s my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1 Bound karthik-pv9 250Gi RWO default 3s my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-2 Bound karthik-pv11 250Gi RWO default 3s my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0 Bound karthik-pv7 250Gi RWO default 3s root@node2:~#
-
Überprüfen Sie den Status der Pods.
root@node2:~# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES <content removed to save page space>
Stellen Sie sicher, dass der PODs-Status ‘Running’ lautet und wie erwartet funktioniert
-
Testen Sie das Schreiben und Lesen von Daten in Milvus und NetApp Objekt-Storage.
-
Schreiben Sie Daten mit dem Python-Programm „Prepare_Data_netapp_New.py“.
root@node2:~# date;python3 prepare_data_netapp_new.py ;date Thu Apr 4 04:15:35 PM UTC 2024 === start connecting to Milvus === === Milvus host: localhost === Does collection hello_milvus_ntapnew_update2_sc exist in Milvus: False === Drop collection - hello_milvus_ntapnew_update2_sc === === Drop collection - hello_milvus_ntapnew_update2_sc2 === === Create collection `hello_milvus_ntapnew_update2_sc` === === Start inserting entities === Number of entities in hello_milvus_ntapnew_update2_sc: 3000 Thu Apr 4 04:18:01 PM UTC 2024 root@node2:~#
-
Lesen Sie die Daten mit der Python-Datei „verify_Data_netapp.py“.
root@node2:~# python3 verify_data_netapp.py === start connecting to Milvus === === Milvus host: localhost === Does collection hello_milvus_ntapnew_update2_sc exist in Milvus: True {'auto_id': False, 'description': 'hello_milvus_ntapnew_update2_sc', 'fields': [{'name': 'pk', 'description': '', 'type': <DataType.INT64: 5>, 'is_primary': True, 'auto_id': False}, {'name': 'random', 'description': '', 'type': <DataType.DOUBLE: 11>}, {'name': 'var', 'description': '', 'type': <DataType.VARCHAR: 21>, 'params': {'max_length': 65535}}, {'name': 'embeddings', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 16}}]} Number of entities in Milvus: hello_milvus_ntapnew_update2_sc : 3000 === 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: 2600, distance: 0.602496862411499, entity: {'random': 0.3098157043984633}, random field: 0.3098157043984633 hit: id: 1831, distance: 0.6797959804534912, entity: {'random': 0.6331477114129169}, random field: 0.6331477114129169 hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482 hit: id: 2524, distance: 0.5918987989425659, entity: {'random': 0.285283165889066}, random field: 0.285283165889066 hit: id: 264, distance: 0.7254047393798828, entity: {'random': 0.3329096143562196}, random field: 0.3329096143562196 search latency = 0.4533s === Start querying with `random > 0.5` === query result: -{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309, 0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': 0} search latency = 0.4476s === Start hybrid searching with `random > 0.5` === hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911 hit: id: 1831, distance: 0.6797959804534912, entity: {'random': 0.6331477114129169}, random field: 0.6331477114129169 hit: id: 678, distance: 0.7351570129394531, entity: {'random': 0.5195484662306603}, random field: 0.5195484662306603 hit: id: 2644, distance: 0.8620758056640625, entity: {'random': 0.9785952878381153}, random field: 0.9785952878381153 hit: id: 1960, distance: 0.9083120226860046, entity: {'random': 0.6376039340439571}, random field: 0.6376039340439571 hit: id: 106, distance: 0.9792704582214355, entity: {'random': 0.9679994241326673}, random field: 0.9679994241326673 search latency = 0.1232s Does collection hello_milvus_ntapnew_update2_sc2 exist in Milvus: True {'auto_id': True, 'description': 'hello_milvus_ntapnew_update2_sc2', 'fields': [{'name': 'pk', 'description': '', 'type': <DataType.INT64: 5>, 'is_primary': True, 'auto_id': True}, {'name': 'random', 'description': '', 'type': <DataType.DOUBLE: 11>}, {'name': 'var', 'description': '', 'type': <DataType.VARCHAR: 21>, 'params': {'max_length': 65535}}, {'name': 'embeddings', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 16}}]}
Basierend auf der oben genannten Validierung bietet die Integration von Kubernetes in eine Vektordatenbank, wie die Implementierung eines Milvus Clusters auf Kubernetes über einen NetApp Storage-Controller demonstriert, Kunden eine robuste, skalierbare und effiziente Lösung für das Management großer Datenoperationen. Diese Einrichtung ermöglicht es Kunden, hochdimensionale Daten schnell und effizient zu verarbeiten und komplexe Abfragen auszuführen. Dadurch ist sie die ideale Lösung für Big-Data-Applikationen und KI-Workloads. Der Einsatz von persistenten Volumes (PVS) für verschiedene Cluster-Komponenten stellt zusammen mit der Erstellung eines einzigen NFS-Volumes aus NetApp ONTAP eine optimale Ressourcenauslastung und ein optimales Datenmanagement sicher. Der Prozess der Überprüfung des Status von PersistentVolumeClaims (PVCs) und Pods sowie der Prüfung von Daten Schreiben und Lesen bietet Kunden die Sicherheit zuverlässiger und konsistenter Datenoperationen. Die Nutzung von ONTAP oder StorageGRID Objekt-Storage für Kundendaten verbessert die Verfügbarkeit und Sicherheit von Daten noch weiter. Kunden erhalten durch diese Einrichtung eine robuste und hochperformante Datenmanagement-Lösung, die sich nahtlos an ihre steigenden Datenanforderungen anpassen lässt.
-