Wie verdichtet man Daten in Milvus?
Binlog Titelbild
Von Bingyi Sun und Angela Ni.
Mit der offiziellen Veröffentlichung von Milvus 2.0 GA wird eine Reihe neuer Funktionen unterstützt. Darunter ist die Verdichtung eine der neuen Funktionen, die Ihnen helfen kann, Speicherplatz zu sparen.
Die Verdichtung bezieht sich auf den Prozess des Zusammenfügens kleiner Segmente zu großen Segmenten und der Bereinigung logisch gelöschter Daten. Mit anderen Worten: Die Verdichtung reduziert den Speicherplatzbedarf, indem gelöschte oder abgelaufene Entitäten in Bin-Logs bereinigt werden. Es handelt sich um eine Hintergrundaufgabe, die von der Datenkoordination ausgelöst und vom Datenknoten in Milvus ausgeführt wird.
In diesem Artikel werden das Konzept und die Implementierung der Verdichtung in Milvus erläutert.
Was ist Verdichtung?
Bevor wir uns in die Details der Implementierung von Verdichtung in Milvus 2.0 vertiefen, ist es wichtig, herauszufinden, was Verdichtung in Milvus ist.
Als Milvus-Benutzer haben Sie sich vielleicht schon öfters über den zunehmenden Speicherplatzbedarf auf der Festplatte geärgert. Ein weiteres Problem ist, dass ein Segment mit weniger als 1.024 Zeilen nicht indiziert wird und nur die Brute-Force-Suche zur Bearbeitung von Abfragen unterstützt. Kleine Segmente, die durch Auto-Flush oder vom Benutzer ausgelöste Flushs verursacht werden, können die Abfrageeffizienz beeinträchtigen.
Um die beiden oben genannten Probleme zu lösen und die Festplattennutzung zu verringern und die Abfrageeffizienz zu verbessern, unterstützt Milvus daher die Verdichtung.
Datenbanken wie LevelDB und RocksDB hängen Daten an sortierte Stringtabellen (SSTables) an. Die durchschnittlichen Festplattenlesevorgänge pro Abfrage steigen mit der Anzahl der SSTables, was zu ineffizienten Abfragen führt. Um die Leseverstärkung zu verringern und Festplattenspeicherplatz freizugeben, komprimieren diese Datenbanken die SSTables in eine einzige. Die Verdichtungsprozesse laufen automatisch im Hintergrund ab.
In ähnlicher Weise fügt Milvus eingefügte und gelöschte Daten an die binlogs an. Je größer die Anzahl der binlogs ist, desto mehr Festplattenplatz wird verbraucht. Um Festplattenspeicherplatz freizugeben, komprimiert Milvus Binlogs von gelöschten und eingefügten Daten. Wenn eine Entität eingefügt und später gelöscht wird, existiert sie nicht mehr in den Binlogs, die das Einfügen oder Löschen von Daten aufzeichnen, sobald sie komprimiert wurden. Darüber hinaus verdichtet Milvus auch Segmente - Datendateien, die automatisch von Milvus erstellt werden, um eingefügte Daten zu speichern.
Wie wird die Komprimierung konfiguriert?
Die Konfiguration der Verdichtung in Milvus umfasst hauptsächlich zwei Parameter: dataCoord.enableCompaction
und common.retentionDuration
.
dataCoord.enableCompaction
gibt an, ob die Verdichtung aktiviert werden soll. Sein Standardwert ist true
.
common.retentionDuration
gibt einen Zeitraum an, in dem die Verdichtung nicht ausgeführt wird. Seine Einheit ist Sekunde. Wenn Sie Daten verdichten, werden alle gelöschten Entitäten für die Suche mit Time Travel unzugänglich gemacht. Wenn Sie also eine Suche mit Time Travel planen, müssen Sie eine Zeitspanne angeben, in der die Verdichtung nicht ausgeführt wird und sich nicht auf gelöschte Daten auswirkt. Um genaue Suchergebnisse mit Time Travel zu gewährleisten, bewahrt Milvus Daten auf, die in einem durch common.retentionDuration
festgelegten Zeitraum bearbeitet wurden. Das heißt, Daten, die in diesem Zeitraum bearbeitet wurden, werden nicht komprimiert. Weitere Einzelheiten finden Sie unter Suche mit Zeitreise.
Die Verdichtung ist in Milvus standardmäßig aktiviert. Wenn Sie die Verdichtung deaktiviert haben, sie aber später manuell aktivieren möchten, können Sie die folgenden Schritte ausführen:
- Rufen Sie die Methode
collection.compact()
auf, um einen globalen Verdichtungsprozess manuell auszulösen. Beachten Sie jedoch, dass dieser Vorgang längere Zeit in Anspruch nehmen kann. - Nach dem Aufruf der Methode wird eine Verdichtungs-ID zurückgegeben. Rufen Sie die Methode
collection.get_compaction_state()
auf, um den Verdichtungsstatus anzuzeigen.
Nachdem die Verdichtung aktiviert wurde, wird sie automatisch im Hintergrund ausgeführt. Da der Verdichtungsprozess lange dauern kann, werden Verdichtungsanforderungen asynchron verarbeitet, um Zeit zu sparen.
Wie wird die Verdichtung implementiert?
In Milvus können Sie die Verdichtung entweder manuell oder automatisch durchführen.
Bei der manuellen Verdichtung von binlogs oder Segmenten müssen keine Triggerbedingungen erfüllt werden. Wenn Sie also die Verdichtung manuell auslösen, werden die Binprotokolle oder Segmente auf jeden Fall verdichtet.
Wenn Sie jedoch die automatische Verdichtung aktivieren möchten, müssen bestimmte Triggerbedingungen erfüllt sein, damit das System Ihre Segmente oder Binslogs verdichtet.
Generell gibt es zwei Arten von Objekten, die in Milvus verdichtet werden können: Binglogs und Segmente.
Binlog-Verdichtung
Ein Binlog ist ein binäres Protokoll oder eine kleinere Einheit in einem Segment, das die Aktualisierungen und Änderungen von Daten in der Milvus-Vektordatenbank aufzeichnet und verarbeitet. Die Daten eines Segments werden in mehreren Binlogs aufbewahrt. Bei der Binlog-Verdichtung gibt es in Milvus zwei Arten von Binlogs: Insert-Binlogs und Delta-Binlogs.
Delta-Binlogs werden erzeugt, wenn Daten gelöscht werden, während Insert-Binlogs unter den folgenden drei Umständen erzeugt werden.
- Wenn eingefügte Daten angehängt werden, erreicht das Segment die obere Grenze der Größe und wird automatisch auf die Festplatte gespült.
- DataCoord löscht automatisch Segmente, die über einen längeren Zeitraum nicht versiegelt wurden.
- Einige APIs wie
collection.num_entities
,collection.load()
, und andere rufen automatisch Flush auf, um Segmente auf die Festplatte zu schreiben.
Daher bezieht sich die Binlog-Verdichtung, wie der Name schon sagt, auf die Verdichtung von Binlogs innerhalb eines Segments. Genauer gesagt, werden bei der Binlog-Verdichtung alle Delta-Binlogs und Insert-Binlogs, die nicht beibehalten werden, verdichtet.
Binlog-Verdichtung
Wenn ein Segment auf die Festplatte gespült wird oder wenn Milvus eine globale Verdichtung anfordert, weil die Verdichtung lange Zeit nicht gelaufen ist, muss mindestens eine der beiden folgenden Bedingungen erfüllt sein, um die automatische Verdichtung auszulösen:
- Die Zeilen in den Delta-Binlogs machen mehr als 20 % der gesamten Zeilen aus.
- Die Größe der Delta-Binlogs übersteigt 10 MB.
Segmentverdichtung
Ein Segment ist eine Datendatei, die von Milvus automatisch erstellt wird, um eingefügte Daten zu speichern. Es gibt zwei Arten von Segmenten in Milvus: wachsende Segmente und geschlossene Segmente.
Ein wachsendes Segment nimmt so lange neue Daten auf, bis es versiegelt wird. Ein versiegeltes Segment empfängt keine neuen Daten mehr und wird in den Objektspeicher gespült, so dass neue Daten in ein neu erstelltes wachsendes Segment eingefügt werden können.
Daher bezieht sich die Segmentverdichtung auf die Verdichtung mehrerer versiegelter Segmente. Genauer gesagt werden bei der Segmentverdichtung kleine Segmente zu größeren Segmenten verdichtet.
Segmentverdichtung
Jedes nach der Verdichtung erzeugte Segment darf die Obergrenze der Segmentgröße nicht überschreiten, die standardmäßig 512 MB beträgt. Lesen Sie die Systemkonfigurationen, um zu erfahren, wie Sie die Obergrenze für die Segmentgröße ändern können.
Wenn ein Segment auf die Festplatte geleert wird oder wenn Milvus eine globale Verdichtung anfordert, weil die Verdichtung lange Zeit nicht gelaufen ist, muss die folgende Bedingung erfüllt sein, um die automatische Verdichtung auszulösen:
- Segmente kleiner als 0,5 *
MaxSegmentSize
ist größer als 10.
Wie geht es nun weiter?
Wie geht es nach dem Erlernen der Grundlagen der Verdichtung in Milvus weiter? Derzeit sind nicht alle Parameter zur Konfiguration der Verdichtung in der Datei milvus.yaml
enthalten, und die Strategien zur Planerstellung sind relativ einfach. Kommen Sie und tragen Sie zu Milvus bei, dem Open-Source-Projekt, wenn Sie interessiert sind!
In der Blogserie zu den neuen Funktionen 2.0 möchten wir Ihnen das Design der neuen Funktionen erklären. Lesen Sie mehr in dieser Blogserie!
- Wie Milvus Streaming-Daten in einem verteilten Cluster löscht
- Wie verdichtet man Daten in Milvus?
- Wie gleicht Milvus die Abfragelast über die Knoten aus?
- Wie Bitset die Vielseitigkeit der Vektorähnlichkeitssuche ermöglicht
Über den Autor
Bingyi Sun, Senior Software Engineer des Milvus-Projekts, erwarb seinen Master-Abschluss in Software Engineering an der Shanghai Jiao Tong University. Er ist hauptsächlich für die Entwicklung von speicherbezogenen Komponenten in Milvus 2.0 verantwortlich. Sein Interessengebiet sind Datenbanken und verteilte Systeme. Er ist ein großer Fan von Open-Source-Projekten und ein Feinschmecker, der in seiner Freizeit gerne Videospiele spielt und liest.
- Was ist Verdichtung?
- Wie wird die Komprimierung konfiguriert?
- Wie wird die Verdichtung implementiert?
- Binlog-Verdichtung
- Segmentverdichtung
- Wie geht es nun weiter?
- Über den Autor
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word