Coordinador HA
Como se muestra en la arquitectura de Milvus, Milvus consta de muchos componentes y los hace trabajar de forma distribuida. Entre todos los componentes, Milvus garantiza la alta disponibilidad de los trabajadores mediante el escalado de los nodos, haciendo de los coordinadores el único eslabón débil de la cadena.
Visión general
En la versión 2.2.3, Milvus implementa la alta disponibilidad de los coordinadores para que funcionen en modo activo-standby, mitigando los posibles puntos únicos de fallo (SPoF) que pueden provocar la indisponibilidad del servicio.
Alta disponibilidad de los coordinadores
La figura anterior ilustra cómo funcionan los coordinadores en el modo activo-espera. Cuando se inicia un par de coordinadores, se registran en etcd utilizando su ID de servidor y compiten por el rol activo. El coordinador que consiga alquilar el rol activo al etcd empezará a servir, y el otro coordinador de la pareja permanecerá en espera, vigilando el rol activo y listo para servir si el coordinador activo muere.
Habilitar HA de coordinador
Con Helm
Para iniciar múltiples coordinadores y hacer que trabajen en modo activo-standby, debería hacer los siguientes cambios en su archivo values.yaml
.
- Cambie
xxxCoordinator.replicas
a2
. - Establezca
xxxCoordinator.activeStandby.enabled
entrue
.
El siguiente fragmento de código utiliza RootCoord como ejemplo. Puede hacer lo mismo con coordinadores de otros tipos.
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
Para iniciar múltiples coordinadores y hacer que trabajen en modo activo-standby, puede añadir algunas definiciones al archivo docker-compose
que utiliza para iniciar su cluster Milvus.
El siguiente fragmento de código utiliza RootCoord como ejemplo. Puede hacer lo mismo con coordinadores de otros tipos.
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 Mac/Linux shell
Para iniciar varios coordinadores y hacer que funcionen en modo activo-espera, puede
Descargar el código fuente de Milvus a su disco local, y arrancar un cluster Milvus desde el código fuente como sigue:
sudo ./scripts/start_cluster.sh
Milvus se ejecuta con un solo coordinador de cada tipo al final de este paso.
Actualice
milvus.yaml
para cambiar el número de puerto del coordinador de cada tipo. A continuación se utiliza rootCoord como ejemplo.rootCoord: address: localhost port: 53100 # change to 53001
Inicie el coordinador en espera.
sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
Al final de este paso, ejecute el siguiente comando para verificar que existen dos procesos de coordinador.
ps aux|grep milvus
La salida debería ser similar 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 ...
Y el coordinador en espera emite una entrada de registro cada diez segundos como sigue:
[INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
Elimine el coordinador activo de un par y observe el comportamiento del coordinador en espera.
Puede comprobar que el coordinador en espera tarda 60 segundos en asumir el papel activo.
[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"]
Elementos de configuración relacionados
La HA del coordinador está desactivada por defecto. Puede activar esta función manualmente cambiando los siguientes elementos en su archivo de configuración de Milvus.
Límites
Actualmente, no existe una garantía de coherencia sólida entre el servicio activo y el servicio en espera. Por lo tanto, el coordinador en espera necesita recargar los metadatos cuando asume el papel activo.
Etcd libera un contrato de arrendamiento sólo cuando la sesión actual ha expirado. El tiempo de espera de la sesión es por defecto de 60 segundos. Por lo tanto, hay un intervalo de 60 segundos entre el momento en que el coordinador activo muere y el momento en que el coordinador en espera asume el rol activo.