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 wählen, wie viele Shards eine Sammlung in Milvus verwendet - jeder Shard ist einem virtuellen Kanal(vchannel) zugeordnet. Wie unten dargestellt, weist Milvus dann jeden vChannel einem physischen Channel(pChannel) zu, und jeder pChannel ist an einen bestimmten Streaming-Knoten gebunden.
VKanal PC-Kanal und StreamingNode
Nach der Datenüberprüfung teilt der Proxy die geschriebene Nachricht in verschiedene Datenpakete von Shards gemäß den festgelegten Shard-Routing-Regeln auf.
Kanäle 1
Dann werden die geschriebenen Daten eines Shards(vchannel) an den entsprechenden Streaming Node von pchannel gesendet.
Schreibfluss
Der Streaming-Knoten weist jedem Datenpaket ein Zeitstempel-Orakel (TSO) zu, um eine Gesamtreihenfolge der Vorgänge festzulegen. Er führt Konsistenzprüfungen an der Nutzlast durch, bevor er sie in das zugrunde liegende Write-Ahead-Log (WAL) schreibt. Sobald die Daten dauerhaft im WAL gespeichert sind, gehen sie garantiert nicht mehr verloren - selbst im Falle eines Absturzes kann der StreamingNode das WAL erneut abspielen, um alle anstehenden Vorgänge vollständig wiederherzustellen.
In der Zwischenzeit zerlegt der StreamingNode die übertragenen WAL-Einträge asynchron in einzelne Segmente. Es gibt zwei Segmenttypen:
- Wachsendes Segment: alle Daten, die noch nicht im Objektspeicher vorhanden sind.
- Versiegeltes Segment: alle Daten wurden in den Objektspeicher persistiert, die Daten des versiegelten Segments sind unveränderlich.
Der Übergang eines wachsenden Segments in ein versiegeltes Segment wird als Flush bezeichnet. Der Streaming Node löst einen Flush aus, sobald er alle verfügbaren WAL-Einträge für dieses Segment aufgenommen und geschrieben hat, d. h. wenn es keine ausstehenden Datensätze mehr im zugrunde liegenden Write-Ahead-Log gibt.
Indexaufbau
Der Indexaufbau wird von den Datenknoten 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 der Indexerstellung greifen auf die Objektspeicherung zu: Der Datenknoten 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 aufgeteilt; der Streaming-Knoten lädt wachsende Segmente und verwaltet Echtzeitdaten, während die Abfrageknoten versiegelte Segmente laden.
Wenn eine Abfrage/Suchanfrage eintrifft, sendet der Proxy die Anfrage an alle Streaming Nodes, die für die entsprechenden Shards zuständig sind, um eine gleichzeitige Suche zu ermöglichen.
Wenn eine Abfrageanfrage eintrifft, fordert der Proxy die Streaming Nodes, die die entsprechenden Shards halten, gleichzeitig auf, die Suche durchzuführen.
Jeder Streaming-Knoten erstellt einen Abfrageplan, durchsucht seine lokalen wachsenden Daten und kontaktiert gleichzeitig entfernte Abfrageknoten, um historische Ergebnisse abzurufen, und fasst diese dann zu einem einzigen Shard-Ergebnis zusammen.
Schließlich sammelt der Proxy alle Shard-Ergebnisse, führt sie zu einem Endergebnis zusammen und sendet es an den Client zurück.
Weiterleitung
Wenn das wachsende Segment auf einem Streaming-Knoten in ein versiegeltes Segment gespült wird - oder wenn ein Datenknoten eine Verdichtung abschließt - initiiert der Koordinator eine Übergabeoperation, um diese wachsenden Daten in historische Daten umzuwandeln. Anschließend verteilt der Koordinator die versiegelten Segmente gleichmäßig auf alle Abfrageknoten, wobei er die Speichernutzung, den CPU-Overhead und die Segmentanzahl ausgleicht, und gibt alle redundanten Segmente frei.
Was kommt als Nächstes?
- 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.