Datenverarbeitung
Dieser Artikel enthält eine detaillierte Beschreibung der Implementierung von Dateneinfügung, Indexaufbau und Datenabfrage in Milvus.
Einfügen von Daten
Sie können eine Anzahl von Shards für jede Sammlung in Milvus angeben, wobei jeder Shard einem virtuellen Kanal(vchannel) entspricht. Wie die folgende Abbildung zeigt, weist Milvus jedem vchannel im Log-Broker einen physischen Kanal(pchannel) zu. Jede eingehende Einfüge-/Löschanforderung wird auf der Grundlage des Hashwerts des Primärschlüssels an die Shards weitergeleitet.
Die Validierung von DML-Anfragen wird auf den Proxy verlagert, da Milvus keine komplizierten Transaktionen hat. Der Proxy würde für jede Einfüge-/Löschanforderung einen Zeitstempel von TSO (Timestamp Oracle) anfordern, dem Zeitmodul, das mit dem Root-Koordinator zusammenarbeitet. Da der ältere Zeitstempel durch den neueren überschrieben wird, werden Zeitstempel verwendet, um die Reihenfolge der zu verarbeitenden Datenanforderungen zu bestimmen. Der Proxy ruft Informationen in Stapeln von der Datenkoordination ab, einschließlich der Segmente und Primärschlüssel der Entitäten, um den Gesamtdurchsatz zu erhöhen und eine Überlastung des zentralen Knotens zu vermeiden.
Kanäle 1
Sowohl DML (Data Manipulation Language)-Operationen als auch DDL (Data Definition Language)-Operationen werden in die Protokollsequenz geschrieben, aber DDL-Operationen werden wegen ihrer geringen Häufigkeit nur einem Kanal zugeordnet.
Kanäle 2
V-Kanäle werden in den zugrunde liegenden Log-Broker-Knoten verwaltet. Jeder Kanal ist physisch unteilbar und für jeden, aber nur für einen Knoten verfügbar. Wenn die Dateneingangsrate einen Engpass erreicht, sind zwei Dinge zu beachten: Ob der Log-Broker-Knoten überlastet ist und skaliert werden muss, und ob genügend Shards vorhanden sind, um den Lastausgleich für jeden Knoten zu gewährleisten.
Log-Sequenz schreiben
Das obige Diagramm zeigt die vier Komponenten, die am Prozess des Schreibens der Log-Sequenz beteiligt sind: Proxy, Log Broker, Datenknoten und Objektspeicher. Der Prozess umfasst vier Aufgaben: Validierung von DML-Anforderungen, Veröffentlichung und Abonnement von Log-Sequenzen, Konvertierung von Streaming Log in Log-Snapshots und Persistenz von Log-Snapshots. Die vier Aufgaben sind voneinander entkoppelt, um sicherzustellen, dass jede Aufgabe von dem entsprechenden Knotentyp bearbeitet wird. Knoten desselben Typs sind gleichberechtigt und können elastisch und unabhängig skaliert werden, um verschiedene Datenlasten, insbesondere massive und stark schwankende Streaming-Daten, zu bewältigen.
Indexaufbau
Der Indexaufbau wird von einem Indexknoten durchgeführt. Um häufige Indexerstellung bei Datenaktualisierungen zu vermeiden, wird eine Sammlung in Milvus weiter in Segmente unterteilt, die jeweils einen eigenen Index haben.
Indexerstellung
Milvus unterstützt die Indexerstellung für jedes Vektorfeld, Skalarfeld und Primärfeld. Sowohl die Eingabe als auch die Ausgabe des Indexaufbaus greifen auf den Objektspeicher zu: Der Indexknoten lädt die zu indizierenden Protokoll-Snapshots aus einem Segment (das sich im Objektspeicher befindet) in den Speicher, deserialisiert die entsprechenden Daten und Metadaten für den Indexaufbau, serialisiert den Index nach Abschluss des Indexaufbaus und schreibt ihn zurück in den Objektspeicher.
Der Indexaufbau umfasst hauptsächlich Vektor- und Matrixoperationen und ist daher rechen- und speicherintensiv. Vektoren können aufgrund ihrer hochdimensionalen Natur nicht effizient mit traditionellen baumbasierten Indizes indiziert werden, aber sie können mit Techniken indiziert werden, die in diesem Bereich ausgereifter sind, wie z. B. cluster- oder graphbasierte Indizes. Unabhängig von der Art des Indexes erfordert die Indexerstellung massive iterative Berechnungen für große Vektoren, wie Kmeans oder Graph Traverse.
Anders als bei der Indexierung skalarer Daten muss bei der Erstellung von Vektorindizes die SIMD-Beschleunigung (Single Instruction, Multiple Data) voll genutzt werden. Milvus bietet von Haus aus Unterstützung für SIMD-Befehlssätze, z. B. SSE, AVX2 und AVX512. Angesichts des "Schluckaufs" und der ressourcenintensiven Natur der Vektorindexerstellung ist Elastizität für Milvus in wirtschaftlicher Hinsicht von entscheidender Bedeutung. Zukünftige Milvus-Versionen werden die Erforschung von heterogenem Computing und serverloser Berechnung weiter vorantreiben, um die damit verbundenen Kosten zu senken.
Außerdem unterstützt Milvus auch skalare Filterung und Primärfeldabfragen. Es verfügt über eingebaute Indizes zur Verbesserung der Abfrageeffizienz, z. B. Bloom-Filter-Indizes, Hash-Indizes, baumbasierte Indizes und invertierte Indizes, und plant die Einführung weiterer externer Indizes, z. B. Bitmap-Indizes und grobe Indizes.
Datenabfrage
Die Datenabfrage bezieht sich auf das Durchsuchen einer bestimmten Sammlung nach k Vektoren, die einem Zielvektor am nächsten liegen, oder nach allen Vektoren innerhalb eines bestimmten Abstandsbereichs zum Vektor. Die Vektoren werden zusammen mit den entsprechenden Primärschlüsseln und Feldern zurückgegeben.
Datenabfrage
Eine Sammlung in Milvus ist in mehrere Segmente unterteilt, und die Abfrageknoten laden Indizes nach Segment. Wenn eine Suchanfrage eintrifft, wird sie an alle Abfrageknoten gesendet, um eine gleichzeitige Suche durchzuführen. Jeder Knoten durchforstet dann die lokalen Segmente, sucht nach Vektoren, die den Kriterien entsprechen, und reduziert die Suchergebnisse und gibt sie zurück.
Die Abfrageknoten sind bei einer Datenabfrage unabhängig voneinander. Jeder Knoten ist nur für zwei Aufgaben zuständig: Laden oder Freigeben von Segmenten gemäß den Anweisungen des Abfragekoordinators; Durchführen einer Suche innerhalb der lokalen Segmente. Und der Proxy ist für die Reduzierung der Suchergebnisse von jedem Abfrageknoten und die Rückgabe der endgültigen Ergebnisse an den Client verantwortlich.
Weiterleitung
Es gibt zwei Arten von Segmenten: wachsende Segmente (für inkrementelle Daten) und geschlossene Segmente (für historische Daten). Abfrageknoten abonnieren den vchannel, um aktuelle Aktualisierungen (inkrementelle Daten) als wachsende Segmente zu erhalten. Wenn ein wachsendes Segment einen vordefinierten Schwellenwert erreicht, wird es von der Datenkoordination versiegelt und der Indexaufbau beginnt. Dann werden die inkrementellen Daten durch eine vom Abfragekoordinator initiierte Weitergabeoperation in historische Daten umgewandelt. Die Abfragekoordination verteilt die versiegelten Segmente gleichmäßig auf alle Abfrageknoten entsprechend der Speichernutzung, dem CPU-Overhead und der Segmentanzahl.
Der nächste Schritt
- Erfahren Sie, wie Sie die Milvus-Vektordatenbank für Echtzeitabfragen nutzen können.
- Lernen Sie das Einfügen von Daten und die Datenpersistenz in Milvus kennen.
- Lernen Sie, wie Daten in Milvus verarbeitet werden.