Coordinatore HA
Come mostrato nell'architettura di Milvus, Milvus è composto da molti componenti e li fa lavorare in modo distribuito. Tra tutti i componenti, Milvus assicura l'alta disponibilità dei lavoratori attraverso lo scaling up e lo scaling out dei nodi, rendendo i coordinatori l'unico anello debole della catena.
Panoramica
Nella versione 2.2.3, Milvus implementa l'alta disponibilità per i coordinatori per farli lavorare in modalità active-standby, mitigando i possibili single point of failure (SPoF) che possono causare l'indisponibilità del servizio.
Coordinatore HA
La figura precedente illustra il funzionamento dei coordinatori in modalità active-standby. Quando una coppia di coordinatori si avvia, si registra con etcd utilizzando il proprio ID server e compete per il ruolo attivo. Il coordinatore che riesce ad affittare il ruolo attivo da etcd inizierà a servire, mentre l'altro coordinatore della coppia rimarrà in standby, controllando il ruolo attivo e pronto a servire se il coordinatore attivo muore.
Abilitare il coordinatore HA
Con Helm
Per avviare più coordinatori e farli lavorare in modalità active-standby, occorre apportare le seguenti modifiche al file values.yaml
.
- Impostare
xxxCoordinator.replicas
su2
. - Impostare
xxxCoordinator.activeStandby.enabled
sutrue
.
Il seguente frammento di codice utilizza RootCoord come esempio. È possibile fare lo stesso per coordinatori di altro tipo.
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.
Con Docker
Per avviare più coordinatori e farli lavorare in modalità active-standby, si possono aggiungere alcune definizioni al file docker-compose
che si usa per avviare il cluster Milvus.
Il seguente frammento di codice utilizza RootCoord come esempio. È possibile fare lo stesso per i coordinatori di altro tipo.
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"
Con la shell Mac/Linux
Per avviare più coordinatori e farli lavorare in modalità active-standby, è possibile
Scaricare il codice sorgente di Milvus sul disco locale e avviare un cluster Milvus dal codice sorgente come segue:
sudo ./scripts/start_cluster.sh
Alla fine di questa fase, Milvus funziona con un solo coordinatore per tipo.
Aggiornare
milvus.yaml
per cambiare il numero di porta del coordinatore di ciascun tipo. Di seguito si utilizza rootCoord come esempio.rootCoord: address: localhost port: 53100 # change to 53001
Avviare il coordinatore in standby.
sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
Al termine di questa fase, eseguire il comando seguente per verificare che esistano due processi di coordinatore.
ps aux|grep milvus
L'output dovrebbe essere simile a
> 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 ...
Il coordinatore standby emette una voce di registro ogni dieci secondi come segue:
[INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
Uccidere il coordinatore attivo di una coppia e osservare il comportamento del coordinatore in standby.
Si può notare che il coordinatore in standby impiega 60 secondi per assumere il ruolo attivo.
[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"]
Elementi di configurazione correlati
Il coordinatore HA è disattivato per impostazione predefinita. È possibile attivare questa funzione manualmente modificando le seguenti voci nel file di configurazione di Milvus.
Limiti
Attualmente non esiste una forte garanzia di coerenza tra il servizio attivo e quello in standby. Pertanto, il coordinatore in standby deve ricaricare i metadati quando assume il ruolo attivo.
Etcd rilascia un lease solo dopo il timeout della sessione corrente. Il timeout della sessione è predefinito a 60 secondi. Pertanto, c'è un intervallo di 60 secondi tra la morte del coordinatore attivo e l'assunzione del ruolo attivo da parte del coordinatore in standby.