🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI
  • Home
  • Blog
  • Überblick über die verteilte Architektur

Überblick über die verteilte Architektur

  • Engineering
March 17, 2020
milvus

Milvus zielt darauf ab, eine effiziente Ähnlichkeitssuche und -analyse für Vektoren in großem Maßstab zu erreichen. Eine eigenständige Milvus-Instanz kann die Vektorsuche für Vektoren in Milliardengröße problemlos bewältigen. Für 10 Milliarden, 100 Milliarden oder noch größere Datensätze wird jedoch ein Milvus-Cluster benötigt. Der Cluster kann als eigenständige Instanz für Anwendungen auf höherer Ebene verwendet werden und erfüllt die geschäftlichen Anforderungen an niedrige Latenzzeiten und hohe Gleichzeitigkeit bei Massendaten. Ein Milvus-Cluster kann Anfragen weiterleiten, Lese- und Schreibvorgänge trennen, horizontal skalieren und dynamisch expandieren, so dass eine unbegrenzt erweiterbare Milvus-Instanz entsteht. Mishards ist eine verteilte Lösung für Milvus.

In diesem Artikel werden die Komponenten der Mishards-Architektur kurz vorgestellt. Ausführlichere Informationen werden in den folgenden Artikeln vorgestellt.

1-milvus-cluster-mishards.png 1-milvus-cluster-mishards.png

Überblick über die verteilte Architektur

2-distributed-architecture-overview.png 2-verteilte-architektur-uebersicht.png

Dienstverfolgung

3-service-tracing-milvus.png 3-dienst-verfolgung-milvus.png

Primäre Dienstkomponenten

  • Rahmenwerk zur Diensterkennung, wie ZooKeeper, etcd und Consul.
  • Lastausgleicher, wie Nginx, HAProxy, Ingress Controller.
  • Mishards-Knoten: zustandslos, skalierbar.
  • Schreibgeschützter Milvus-Knoten: Einzelner Knoten und nicht skalierbar. Sie müssen Hochverfügbarkeitslösungen für diesen Knoten verwenden, um einen Single-Point-of-Failure zu vermeiden.
  • Nur-lesender Milvus-Knoten: Stateful-Knoten und skalierbar.
  • Gemeinsamer Speicherdienst: Alle Milvus-Knoten verwenden einen gemeinsamen Speicherdienst zur gemeinsamen Nutzung von Daten, z. B. NAS oder NFS.
  • Metadaten-Dienst: Alle Milvus-Knoten nutzen diesen Dienst, um Metadaten gemeinsam zu nutzen. Derzeit wird nur MySQL unterstützt. Dieser Dienst erfordert eine Hochverfügbarkeitslösung für MySQL.

Skalierbare Komponenten

  • Mishards
  • Nur-Lese-Milvus-Knoten

Einführung der Komponenten

Mishards-Knoten

Mishards ist für die Aufteilung von Upstream-Anfragen und die Weiterleitung von Sub-Anfragen an Sub-Dienste zuständig. Die Ergebnisse werden zusammengefasst und an den Upstream zurückgegeben.

4-mishards-nodes.jpg 4-mishards-nodes.jpg

Wie aus dem obigen Diagramm hervorgeht, zerlegt Mishards nach der Annahme einer TopK-Suchanfrage die Anfrage zunächst in Teilanfragen und sendet die Teilanfragen an den nachgelagerten Dienst. Wenn alle Teilantworten gesammelt sind, werden die Teilantworten zusammengeführt und an den vorgelagerten Dienst zurückgeschickt.

Da es sich bei Mishards um einen zustandslosen Dienst handelt, speichert er keine Daten und führt keine komplexen Berechnungen durch. Daher haben die Knoten keine hohen Konfigurationsanforderungen, und die Rechenleistung wird hauptsächlich für die Zusammenführung von Teilergebnissen verwendet. Es ist also möglich, die Anzahl der Mishards-Knoten für eine hohe Gleichzeitigkeit zu erhöhen.

Milvus-Knoten

Milvus-Knoten sind für CRUD-bezogene Kernoperationen zuständig und haben daher relativ hohe Konfigurationsanforderungen. Erstens sollte die Speichergröße groß genug sein, um zu viele Festplatten-IO-Operationen zu vermeiden. Zweitens können sich auch die CPU-Konfigurationen auf die Leistung auswirken. Je größer der Cluster ist, desto mehr Milvus-Knoten sind erforderlich, um den Systemdurchsatz zu erhöhen.

Nur-Lese-Knoten und beschreibbare Knoten

  • Die Kernoperationen von Milvus sind das Einfügen von Vektoren und die Suche. Die Suche stellt extrem hohe Anforderungen an CPU- und GPU-Konfigurationen, während die Einfügung oder andere Operationen relativ geringe Anforderungen haben. Die Trennung des Knotens, der die Suche ausführt, von dem Knoten, der andere Operationen ausführt, führt zu einer wirtschaftlicheren Bereitstellung.
  • Im Hinblick auf die Dienstqualität ist die zugehörige Hardware bei der Durchführung von Suchvorgängen voll ausgelastet und kann die Dienstqualität anderer Vorgänge nicht gewährleisten. Daher werden zwei Knotentypen verwendet. Suchanfragen werden von Nur-Lese-Knoten und andere Anfragen von beschreibbaren Knoten bearbeitet.

Nur ein beschreibbarer Knoten ist erlaubt

  • Derzeit unterstützt Milvus nicht die gemeinsame Nutzung von Daten für mehrere beschreibbare Instanzen.

  • Bei der Bereitstellung muss ein Single-Point-of-Failure von beschreibbaren Knoten berücksichtigt werden. Hochverfügbarkeitslösungen müssen für beschreibbare Knoten vorbereitet werden.

Skalierbarkeit von Nur-Lese-Knoten

Bei extrem großen Datenmengen oder extrem hohen Latenzanforderungen können Sie Nur-Lese-Knoten als Stateful-Knoten horizontal skalieren. Angenommen, es gibt 4 Hosts und jeder hat die folgende Konfiguration: CPU-Kerne: 16, GPU: 1, Speicher: 64 GB. Das folgende Diagramm zeigt den Cluster bei horizontaler Skalierung von Stateful-Knoten. Sowohl die Rechenleistung als auch der Speicher skalieren linear. Die Daten werden in 8 Shards aufgeteilt, wobei jeder Knoten Anfragen von 2 Shards verarbeitet.

5-read-only-node-scalability-milvus.png 5-read-only-node-scalability-milvus.png

Wenn die Anzahl der Anfragen für einige Shards groß ist, können zustandslose Nur-Lese-Knoten für diese Shards eingesetzt werden, um den Durchsatz zu erhöhen. Nehmen Sie die oben genannten Hosts als Beispiel. Wenn die Hosts zu einem serverlosen Cluster kombiniert werden, steigt die Rechenleistung linear an. Da die zu verarbeitenden Daten nicht zunehmen, steigt auch die Verarbeitungsleistung für denselben Daten-Shard linear an.

6-read-only-node-scalability-milvus-2.png 6-read-only-node-scalability-milvus-2.png

Metadaten-Dienst

Schlüsselwörter: MySQL

Weitere Informationen zu den Milvus-Metadaten finden Sie unter Wie man Metadaten anzeigt. In einem verteilten System sind die beschreibbaren Milvus-Knoten die einzigen Produzenten von Metadaten. Mishards-Knoten, beschreibbare Milvus-Knoten und schreibgeschützte Milvus-Knoten sind alle Konsumenten von Metadaten. Derzeit unterstützt Milvus nur MySQL und SQLite als Speicher-Backend für Metadaten. In einem verteilten System kann der Dienst nur als hochverfügbares MySQL bereitgestellt werden.

Entdeckung des Dienstes

Schlüsselwörter: Apache Zookeeper, etcd, Consul, Kubernetes

7-service-discovery.png 7-dienst-entdeckung.png

Service Discovery liefert Informationen über alle Milvus-Knoten. Milvus-Knoten registrieren ihre Informationen, wenn sie online gehen und melden sich ab, wenn sie offline gehen. Milvus-Knoten können auch abnormale Knoten erkennen, indem sie regelmäßig den Gesundheitszustand von Diensten überprüfen.

Die Erkennung von Diensten umfasst eine Vielzahl von Frameworks, darunter etcd, Consul, ZooKeeper, usw. Mishards definiert die Schnittstellen zur Diensterkennung und bietet Möglichkeiten zur Skalierung durch Plugins. Derzeit bietet Mishards zwei Arten von Plugins, die Kubernetes-Clustern und statischen Konfigurationen entsprechen. Sie können Ihre eigene Service-Erkennung anpassen, indem Sie der Implementierung dieser Plugins folgen. Die Schnittstellen sind vorläufig und müssen neu gestaltet werden. Weitere Informationen zum Schreiben eines eigenen Plugins werden in den kommenden Artikeln behandelt.

Lastverteilung und Service Sharding

Schlüsselwörter: Nginx, HAProxy, Kubernetes

7-load-balancing-and-service-sharding.png 7-lastverteilung-und-dienstesplitting.png

Service Discovery und Load Balancing werden zusammen verwendet. Der Lastausgleich kann als Polling, Hashing oder konsistentes Hashing konfiguriert werden.

Der Load Balancer ist für die Weiterleitung von Benutzeranfragen an den Mishards-Knoten verantwortlich.

Jeder Mishards-Knoten erhält die Informationen aller nachgelagerten Milvus-Knoten über das Service Discovery Center. Alle zugehörigen Metadaten können über den Metadatendienst abgerufen werden. Mishards implementiert Sharding, indem es diese Ressourcen verbraucht. Mishards definiert die Schnittstellen für die Routing-Strategien und bietet Erweiterungen über Plugins. Derzeit bietet Mishards eine konsistente Hashing-Strategie, die auf der untersten Segmentebene basiert. Wie in der Grafik dargestellt, gibt es 10 Segmente, s1 bis s10. Gemäß der segmentbasierten konsistenten Hashing-Strategie leitet Mishards Anfragen, die s1, 24, s6 und s9 betreffen, an den Milvus-1-Knoten, s2, s3, s5 an den Milvus-2-Knoten und s7, s8, s10 an den Milvus-3-Knoten.

Basierend auf Ihren geschäftlichen Anforderungen können Sie das Routing anpassen, indem Sie dem Standard-Routing-Plugin für konsistentes Hashing folgen.

Nachverfolgung

Schlüsselwörter: OpenTracing, Jaeger, Zipkin

Angesichts der Komplexität eines verteilten Systems werden Anfragen an mehrere interne Dienstaufrufe gesendet. Um Probleme zu lokalisieren, müssen wir die Kette der internen Dienstaufrufe verfolgen. Da die Komplexität zunimmt, sind die Vorteile eines verfügbaren Tracing-Systems selbsterklärend. Wir haben uns für den CNCF OpenTracing-Standard entschieden. OpenTracing bietet plattform- und herstellerunabhängige APIs für Entwickler, um ein Tracing-System einfach zu implementieren.

8-tracing-demo-milvus.png 8-tracing-demo-milvus.png

Das vorherige Diagramm ist ein Beispiel für das Tracing während eines Suchaufrufs. Die Suche ruft get_routing, do_search und do_merge nacheinander auf. do_search ruft auch search_127.0.0.1 auf.

Der gesamte Trace-Datensatz bildet den folgenden Baum:

8-search-traceid-milvus.png 8-search-traceid-milvus.png

Die folgende Tabelle zeigt Beispiele für Anfrage-/Antwort-Informationen und Tags der einzelnen Knoten:

request-response-info-tags-node-milvus.png request-response-info-tags-node-milvus.png

OpenTracing wurde in Milvus integriert. Weitere Informationen werden in den kommenden Artikeln behandelt.

Überwachung und Alarmierung

Stichworte: Prometheus, Grafana

10-monitor-alert-milvus.jpg 10-überwachen-warnen-milvus.jpg

Zusammenfassung

Als Service-Middleware integriert Mishards Service Discovery, Routing Request, Result Merging und Tracing. Eine Plugin-basierte Erweiterung ist ebenfalls vorgesehen. Derzeit haben verteilte Lösungen, die auf Mishards basieren, noch die folgenden Nachteile:

  • Mishards verwendet einen Proxy als mittlere Schicht und hat Latenzkosten.
  • Die beschreibbaren Knoten von Milvus sind Ein-Punkt-Dienste.
  • Die Bereitstellung ist kompliziert, wenn es mehrere Shards gibt und ein einzelner Shard mehrere Kopien hat.
  • Es fehlt eine Cache-Schicht, z. B. für den Zugriff auf Metadaten.

Wir werden diese bekannten Probleme in den kommenden Versionen beheben, so dass Mishards bequemer in der Produktionsumgebung eingesetzt werden können.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Weiterlesen