Coordinateur HA
Comme le montre l'architecture Milvus, Milvus est constitué de nombreux composants qui fonctionnent de manière distribuée. Parmi tous les composants, Milvus assure la haute disponibilité des travailleurs grâce à la mise à l'échelle des nœuds, ce qui fait des coordinateurs le seul maillon faible de la chaîne.
Vue d'ensemble
Dans la version 2.2.3, Milvus met en œuvre la haute disponibilité pour les coordinateurs afin qu'ils fonctionnent en mode actif-standby, en atténuant les éventuels points de défaillance uniques (SPoF) qui peuvent entraîner l'indisponibilité du service.
Coordinateur HA
La figure ci-dessus illustre le fonctionnement des coordinateurs en mode actif-veille. Lorsqu'une paire de coordinateurs démarre, ils s'enregistrent auprès d'etcd en utilisant leur ID de serveur et sont en compétition pour le rôle actif. Le coordinateur qui réussit à louer le rôle actif auprès de l'etcd commencera à servir, et l'autre coordinateur de la paire restera en veille, surveillant le rôle actif et prêt à servir si le coordinateur actif meurt.
Activer le coordinateur HA
Avec Helm
Pour démarrer plusieurs coordinateurs et les faire travailler en mode actif-standby, vous devez apporter les modifications suivantes à votre fichier values.yaml
.
- Remplacez
xxxCoordinator.replicas
par2
. - Remplacez
xxxCoordinator.activeStandby.enabled
partrue
.
L'extrait de code suivant utilise RootCoord comme exemple. Vous pouvez faire de même pour les coordinateurs d'autres types.
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.
Avec Docker
Pour démarrer plusieurs coordinateurs et les faire travailler en mode actif-standby, vous pouvez ajouter quelques définitions au fichier docker-compose
que vous utilisez pour démarrer votre cluster Milvus.
L'extrait de code suivant utilise RootCoord comme exemple. Vous pouvez faire de même pour les coordinateurs d'autres types.
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"
Avec le shell Mac/Linux
Pour démarrer plusieurs coordinateurs et les faire fonctionner en mode actif-veille, vous pouvez
Télécharger le code source de Milvus sur votre disque local et démarrer un cluster Milvus à partir du code source comme suit :
sudo ./scripts/start_cluster.sh
Milvus fonctionne avec un seul coordinateur de chaque type à la fin de cette étape.
Mettez à jour
milvus.yaml
pour modifier le numéro de port du coordinateur de chaque type. Ce qui suit utilise rootCoord comme exemple.rootCoord: address: localhost port: 53100 # change to 53001
Démarrez le coordinateur de secours.
sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
À la fin de cette étape, exécutez la commande suivante pour vérifier que deux processus de coordinateur existent.
ps aux|grep milvus
La sortie doit être similaire à
> 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 ...
Et le coordinateur en attente produit une entrée de journal toutes les dix secondes, comme suit :
[INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
Tuez le coordinateur actif d'une paire et observez le comportement du coordinateur en attente.
Vous pouvez constater qu'il faut 60 secondes au coordinateur en attente pour reprendre le rôle actif.
[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"]
Éléments de configuration connexes
Coordinator HA est désactivé par défaut. Vous pouvez activer cette fonction manuellement en modifiant les éléments suivants dans votre fichier de configuration Milvus.
Limites
Actuellement, il n'y a pas de garantie de cohérence forte entre le service actif et le service en attente. Par conséquent, le coordinateur en attente doit recharger les métadonnées lorsqu'il reprend le rôle actif.
Etcd ne libère un bail que lorsque la session en cours a expiré. Le délai d'expiration de la session est fixé par défaut à 60 secondes. Il y a donc un intervalle de 60 secondes entre le moment où le coordinateur actif meurt et le moment où le coordinateur en attente reprend le rôle actif.