Coordenador HA
Como se pode ver na arquitetura do Milvus, este é constituído por muitos componentes que funcionam de forma distribuída. Entre todos os componentes, o Milvus assegura a elevada disponibilidade dos trabalhadores através do aumento e da redução dos nós, tornando os coordenadores o único elo fraco da cadeia.
Visão geral
Na versão 2.2.3, o Milvus implementa alta disponibilidade para os coordenadores, fazendo com que eles trabalhem no modo ativo-em espera, mitigando possíveis pontos únicos de falha (SPoFs) que podem resultar em indisponibilidade do serviço.
Coordenador HA
A figura acima ilustra a forma como os coordenadores funcionam no modo de espera ativa. Quando um par de coordenadores é iniciado, eles se registram no etcd usando seu ID de servidor e competem pela função ativa. O coordenador que conseguir alugar a função ativa do etcd começará a servir, e o outro coordenador do par permanecerá em espera, observando a função ativa e pronto a servir se o coordenador ativo morrer.
Habilitar o coordenador HA
Com o Helm
Para iniciar vários coordenadores e fazê-los trabalhar no modo ativo-em espera, você deve fazer as seguintes alterações no seu arquivo values.yaml
.
- Defina
xxxCoordinator.replicas
como2
. - Defina
xxxCoordinator.activeStandby.enabled
comotrue
.
O seguinte trecho de código utiliza o RootCoord como exemplo. Você pode fazer o mesmo com coordenadores de outros 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.
Com o Docker
Para iniciar vários coordenadores e fazê-los trabalhar em modo de espera ativa, pode adicionar algumas definições ao ficheiro docker-compose
que utiliza para iniciar o seu cluster Milvus.
O trecho de código a seguir usa o RootCoord como exemplo. Pode fazer o mesmo com coordenadores de outros 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"
Com a shell Mac/Linux
Para iniciar vários coordenadores e fazê-los funcionar em modo de espera ativa, pode
Descarregar o código fonte do Milvus para o seu disco local, e iniciar um cluster Milvus a partir do código fonte como se segue:
sudo ./scripts/start_cluster.sh
O Milvus funciona com apenas um coordenador de cada tipo no final desta etapa.
Atualize
milvus.yaml
para alterar o número da porta do coordenador de cada tipo. A seguir, usamos o rootCoord como exemplo.rootCoord: address: localhost port: 53100 # change to 53001
Inicie o coordenador em espera.
sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
No final desta etapa, execute o seguinte comando para verificar se existem dois processos de coordenador.
ps aux|grep milvus
A saída deve ser semelhante 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 ...
E o coordenador em espera gera uma entrada de log a cada dez segundos, como segue:
[INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
Mate o coordenador ativo em um par e observe o comportamento do coordenador em espera.
É possível constatar que são necessários 60 segundos para que o coordenador em espera assuma a função ativa.
[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"]
Itens de configuração relacionados
A HA do coordenador é desativada por padrão. É possível ativar esse recurso manualmente alterando os seguintes itens no arquivo de configuração do Milvus.
Limites
Atualmente, não existe uma garantia de consistência forte entre o serviço ativo e o serviço em espera. Por conseguinte, o coordenador em espera necessita de recarregar os metadados ao assumir a função ativa.
O Etcd liberta uma concessão apenas depois de a sessão atual ter expirado. O tempo limite da sessão é predefinido para 60 segundos. Por conseguinte, existe um intervalo de 60 segundos entre o momento em que o coordenador ativo morre e o momento em que o coordenador em espera assume o papel ativo.