Koordinator HA
Wie in der Milvus-Architektur dargestellt, besteht Milvus aus vielen Komponenten und lässt sie verteilt arbeiten. Von allen Komponenten sorgt Milvus für die hohe Verfügbarkeit der Arbeiter durch das Hoch- und Runterskalieren der Knoten, wobei die Koordinatoren das einzige schwache Glied in der Kette sind.
Überblick
In der Version 2.2.3 implementiert Milvus Hochverfügbarkeit für Koordinatoren, um sie im Aktiv-Standby-Modus arbeiten zu lassen und so mögliche Single Points of Failure (SPoFs) zu entschärfen, die zur Nichtverfügbarkeit von Diensten führen können.
Koordinator HA
Die obige Abbildung veranschaulicht, wie Koordinatoren im Active-Standby-Modus arbeiten. Wenn ein Koordinatorenpaar startet, registrieren sie sich mit ihrer Server-ID bei etcd und konkurrieren um die aktive Rolle. Der Koordinator, dem es gelingt, die aktive Rolle vom etcd zu leasen, beginnt mit dem Dienst, während der andere Koordinator des Paares in Bereitschaft bleibt, die aktive Rolle überwacht und bereit ist, den Dienst zu übernehmen, wenn der aktive Koordinator ausfällt.
Aktivieren von Koordinator-HA
Mit Helm
Um mehrere Koordinatoren zu starten und sie im Aktiv-Standby-Modus arbeiten zu lassen, sollten Sie die folgenden Änderungen an Ihrer Datei values.yaml
vornehmen.
- Setzen Sie
xxxCoordinator.replicas
auf2
. - Setzen Sie
xxxCoordinator.activeStandby.enabled
auftrue
.
Der folgende Codeschnipsel verwendet RootCoord als Beispiel. Sie können das Gleiche für Koordinatoren anderer Typen tun.
rootCoordinator:
enabled: true
# You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.
replicas: 2 # Otherwise, remove this configuration item.
resources: {}
nodeSelector: {}
affinity: {}
tolerations: []
extraEnv: []
heaptrack:
enabled: false
profiling:
enabled: false # Enable live profiling
activeStandby:
enabled: true # Set this to true to have RootCoordinators work in active-standby mode.
Mit Docker
Um mehrere Koordinatoren zu starten und sie im Aktiv-Standby-Modus arbeiten zu lassen, können Sie einige Definitionen in die Datei docker-compose
einfügen, die Sie zum Starten Ihres Milvus-Clusters verwenden.
Der folgende Codeschnipsel verwendet RootCoord als Beispiel. Sie können das Gleiche für andere Koordinatoren tun.
rootcoord:
container_name: milvus-rootcoord
image: milvusdb/milvus:v2.2.3
command: ["milvus", "run", "rootcoord"]
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
PULSAR_ADDRESS: pulsar://pulsar:6650
ROOT_COORD_ADDRESS: rootcoord:53100
# add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
depends_on:
- "etcd"
- "pulsar"
- "minio"
# add the following to have RootCoords work in active-standby mode
# rootcoord-1:
# container_name: milvus-rootcoord-1
# image: milvusdb/milvus:v2.2.3
# command: ["milvus", "run", "rootcoord"]
# environment:
# ETCD_ENDPOINTS: etcd:2379
# MINIO_ADDRESS: minio:9000
# PULSAR_ADDRESS: pulsar://pulsar:6650
# ROOT_COORD_ADDRESS: rootcoord-1:53100
# # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
# ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
# depends_on:
# - "etcd"
# - "pulsar"
# - "minio"
Mit Mac/Linux-Shell
Um mehrere Koordinatoren zu starten und sie im Aktiv-Standby-Modus arbeiten zu lassen, können Sie
Laden Sie den Milvus-Quellcode auf Ihr lokales Laufwerk herunter, und starten Sie einen Milvus-Cluster aus dem Quellcode wie folgt:
sudo ./scripts/start_cluster.sh
Am Ende dieses Schrittes läuft Milvus mit nur einem Koordinator jedes Typs.
Aktualisieren Sie
milvus.yaml
, um die Portnummer des Koordinators jedes Typs zu ändern. Im Folgenden wird rootCoord als Beispiel verwendet.rootCoord: address: localhost port: 53100 # change to 53001
Starten Sie den Standby-Koordinator.
sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
Führen Sie am Ende dieses Schritts den folgenden Befehl aus, um zu überprüfen, ob zwei Coordinator-Prozesse vorhanden sind.
ps aux|grep milvus
Die Ausgabe sollte in etwa so aussehen
> ps aux|grep milvus root 12813 0.7 0.2 410709648 82432 ?? S 5:18PM 0:33.28 ./bin/milvus run rootcoord root 12816 0.5 0.2 409487968 62352 ?? S 5:18PM 0:22.69 ./bin/milvus run proxy root 17739 0.1 0.3 410289872 91792 s003 SN 6:01PM 0:00.30 ./bin/milvus run rootcoord ...
Und der Standby-Koordinator gibt alle zehn Sekunden einen Protokolleintrag wie folgt aus:
[INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
Beenden Sie den aktiven Koordinator eines Paares und beobachten Sie das Verhalten des Standby-Koordinators.
Sie können feststellen, dass es 60 Sekunden dauert, bis der Standby-Koordinator die aktive Rolle übernommen hat.
[2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord\" mod_revision:167 "] [2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord-15\" mod_revision:167 "] [2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] ["stop watching ACTIVE key"] [2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] ["start retrying to register as ACTIVE service..."] [2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] ["register ACTIVE service successfully"] [ServerID=19] [2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] ["quit STANDBY mode, this node will become ACTIVE"] [2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] ["rootcoord switch from standby to active, activating"] [2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] ["RootCoord Register Finished"] [2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] ["RootCoord start done ..."] [2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] ["RootCoord successfully started"]
Zugehörige Konfigurationselemente
Coordinator HA ist standardmäßig deaktiviert. Sie können diese Funktion manuell aktivieren, indem Sie die folgenden Elemente in Ihrer Milvus-Konfigurationsdatei ändern.
Begrenzt
Derzeit gibt es keine starke Konsistenzgarantie zwischen dem aktiven und dem Standby-Dienst. Daher muss der Standby-Koordinator die Metadaten neu laden, wenn er die aktive Rolle übernimmt.
Etcd gibt einen Lease erst dann frei, wenn die aktuelle Sitzung eine Zeitüberschreitung aufweist. Der Standardwert für die Sitzungsdauer beträgt 60 Sekunden. Daher vergehen 60 Sekunden zwischen dem Tod des aktiven Koordinators und der Übernahme der aktiven Rolle durch den Standby-Koordinator.