O Tair oferece suporte a trocas imperceptíveis para arquiteturas de cluster e standalone. Por meio da colaboração em toda a cadeia entre o protocolo do kernel, o SDK do cliente e as camadas de rede, ele atinge zero erros e nenhuma interrupção de conexão durante o dimensionamento, o failover de alta disponibilidade e as atualizações de versões secundárias.
Contexto
Em bancos de dados de código aberto, como Redis ou Valkey, as principais arquiteturas de alta disponibilidade são:
Standalone: O nó primário fornece services de leitura e gravação, e o nó secundário atua como candidato a failover. A comunidade geralmente introduz o Sentinel como um componente independente de monitoramento e arbitragem, que inicia automaticamente o failover quando o nó primário fica inacessível.
Cluster: Todo o espaço de chaves é dividido em 16.384 slots distribuídos por vários nós mestres, cada um com nós de réplica opcionais. Quando um mestre falha, sua réplica é promovida automaticamente por meio de um mecanismo de votação. Os clientes realizam o failover de roteamento automático ao receber redirecionamentos MOVED/ASK.
Nessas arquiteturas, atualizações de versão, failovers de alta disponibilidade ou operações de dimensionamento inevitavelmente causam interrupções de conexão, erros ou bloqueios na migração de dados. O Tair fornece recursos de troca imperceptível tanto para arquiteturas de cluster quanto standalone.
Dimensionamento sem interrupções na arquitetura de cluster
Durante o dimensionamento (adição ou remoção de shards), o Tair usa a migração de dados sem interrupções baseada na replicação de Slots para eliminar os erros -ASK e -TRYAGAIN que os clusters nativos do Redis podem produzir.
Migração de dados no Redis Cluster de código aberto: princípios e pontos de dor
O Redis Cluster de código aberto migra Slots usando a abordagem Per Key, concluindo a migração de um único Slot ao percorrer e migrar chaves em lotes. O fluxo específico é o seguinte:
Defina o status de importação no shard de destino.
Defina o status de migração no shard source.
Recupere a lista de chaves do Slot a ser migrado do shard source.
Envie o comando migrate para o shard source com um lote de chaves. O comando migrate é síncrono e bloqueante. Ele envia as chaves para o shard de destino para restauração e, em seguida, as exclui do source. Isso se repete até que a lista de chaves esteja vazia.
Use o comando setslot para atribuir o Slot migrado ao nó de destino.
A abordagem de migração Per Key apresenta os seguintes pontos de dor:
O comando migrate é síncrono e bloqueante, impedindo o processamento de outras requisições. A migração de chaves grandes causa bloqueios prolongados.
Quando uma chave não existe no shard source, a requisição é redirecionada para o shard de destino, adicionando um salto extra de roteamento.
Requisições de comandos de múltiplas chaves podem receber um erro TRYAGAIN.
Os dados de um único Slot são distribuídos por dois shards. Se ocorrer uma exceção, a migração não poderá ser revertida de forma tranquila.
Migração de dados sem interrupções baseada na replicação de Slots do Tair
Com base na replicação primário-réplica, o Tair desenvolveu a tecnologia de replicação de Slots (Slot Mig) no nível do kernel. Ele sincroniza dados entre nós replicando Slots, em combinação com um controlador central (CS) que controla o bloqueio de gravação Slot Wait no nível de milissegundos. Quando a topologia do cluster é alterada, as requisições do cliente são redirecionadas por meio da semântica MOVED.
O fluxo específico da migração Slot Mig é o seguinte:
O CS envia o comando de migração slotRepl para o shard de destino.
O nó de destino envia um comando slotPsync para o nó source.
O nó source gera um snapshot do Slot a ser migrado.
O nó de destino recebe os dados do snapshot.
O nó source sincroniza os dados incrementais com o nó de destino.
O CS avalia dinamicamente a lacuna de sincronização e envia slotReplWait para bloquear gravações no nível de milissegundos. Se o bloqueio exceder o limiar, uma reversão é acionada automaticamente.
O CS altera a topologia do cluster após a conclusão da sincronização. As requisições antigas do cliente são redirecionadas pela semântica MOVED.
O nó source exclui os dados do Slot migrado.
A migração Slot Mig apresenta as seguintes vantagens:
Nenhum erro de somente leitura e nenhuma queda de conexão.
Semântica MOVED apenas após a alteração de topologia, sem semântica ASK.
Chaves grandes e requisições de múltiplas chaves não são afetadas.
Os dados de um único Slot não são mais divididos, e o processo pode ser revertido em uma única etapa.
Comparação: Tair Slot Mig vs. Per Key da comunidade
|
Item |
Tair Slot Mig |
Per Key da comunidade |
|
status da requisição durante a migração |
Dois estados: acesso normal antes da troca; redirecionamento MOVED depois, sem ASK. |
Três estados: redirecionamento MOVED/ASK; erro TRYAGAIN; bloqueado durante o migrate. |
|
Erros de somente leitura |
Não |
Não |
|
Bloqueio de gravação |
Bloqueio de Slot no nível de milissegundos. |
Múltiplas chaves com chaves ausentes; bloqueio do comando migrate. |
|
Quedas de conexão |
Não |
Não |
|
Reversão antes da conclusão |
Sim |
Não |
Observações
No modo de conexão direta, o cliente deve lidar com comandos MOVED.
No modo de proxy, a redução de dimensionamento libera nós de proxy, causando quedas de conexão. O cliente deve ter capacidade de reconexão.
Comandos que não são de dados (como PING, INFO), além dos comandos PUB/SUB e BLOCKING, não podem ser redirecionados automaticamente após a migração de Slots. atualize periodicamente a tabela de roteamento da aplicação.
Para garantir a consistência dos dados, a latência de requisições de gravação para o Slot correspondente pode aumentar durante a etapa final da migração, mas não falhará.
Failover de alta disponibilidade imperceptível na arquitetura de cluster
De acordo com o protocolo padrão RESP do Redis, após uma troca primário-réplica em um cluster, a réplica retorna MOVED para as requisições existentes. O cliente atualiza sua tabela de roteamento e tenta novamente, alcançando uma troca imperceptível.
O Tair aprimorou a arquitetura de cluster de conexão direta com as seguintes melhorias:
Introduziu o mecanismo VIP para garantir a conectividade do link após a troca.
Substituiu o protocolo gossip por um Config Server centralizado para distribuição unificada da tabela de roteamento, eliminando a incerteza do protocolo distribuído.
Troca imperceptível na arquitetura standalone
Ao contrário da capacidade nativa de redirecionamento da arquitetura de cluster, a arquitetura standalone enfrenta dois desafios: a incompatibilidade de protocolo entre os modos standalone e cluster, e a incapacidade do Sentinel de controlar o comportamento de conexão no nível do kernel. O Tair alcançou a troca imperceptível por meio de três camadas de inovação.
Camada de kernel: protocolo REDIRECT
O Tair implementou o protocolo de troca imperceptível no nível do kernel, que foi integrado à comunidade Valkey. O novo formato de protocolo é REDIRECT HOST PORT, em que REDIRECT indica que o cliente deve redirecionar a requisição para o nó de destino.
Camada de cliente: suporte a SDK
O Tair implementou o suporte a trocas imperceptíveis no cliente Valkey-Java. Para conexões em trânsito, um mecanismo de bloqueio de duas camadas controla a reinicialização do pool de conexões: a primeira camada usa o tryLock do ReentrantLock para renovação de candidatos, e a segunda usa o ReentrantReadWriteLock para controle de leitura e gravação.
atualize os clientes para o Valkey-Java 5.3.0 ou posterior:
<dependency>
<groupId>io.valkey</groupId>
<artifactId>valkey-java</artifactId>
<version>5.3.0</version>
</dependency>
Camada de rede: Connection Draining
O Tair usa uma arquitetura "LB + VIP". Após a troca de VIP, o mecanismo Connection Draining mantém as conexões antigas ativas por um período configurável, garantindo que o primário antigo tenha tempo suficiente para entregar o comando REDIRECT antes de encerrar a conexão de forma controlada.
Resultados dos testes
Usando o Tair-pulse (uma ferramenta de código aberto para avaliar erros de cliente e RT durante a troca), os testes comparativos mostram:
A abordagem original encontra 5 tipos de erros; a troca imperceptível não encontra nenhum erro.
A abordagem original apresenta cerca de 5 segundos de indisponibilidade; a troca imperceptível apresenta cerca de 1 segundo de aumento no RT.
A abordagem de troca imperceptível usa pausa de gravação, o que pode causar tempos limite de comando (até cerca de 1 segundo). Aumente o tempo limite para garantir zero erros.
Limitações
Limitações do dimensionamento sem interrupções na arquitetura de cluster
A instância deve usar discos cloud.
A instância deve usar a arquitetura de cluster.
Versões suportadas: Redis OSS 5.0 (secundária 5.2.0+), 6.0 (secundária 6.0.2.0+), 7.0; Tair Memory-Optimized compatível com Redis 5.0 (secundária 5.0.34+), 6.0, 7.0; Tair Persistent Memory; Tair Disk-Based.
O cliente deve lidar com comandos MOVED (modo direto) ou ter capacidade de reconexão (modo de proxy).
Limitações da troca imperceptível na arquitetura standalone
A troca imperceptível para a arquitetura standalone possui os seguintes requisitos de versão secundária:
Redis OSS: Apenas a versão 7.0, versão secundária 0.2.9 ou posterior.
Tair (Enterprise): Todas as versões principais, versão secundária 25.11.0.0 ou posterior.
Também é necessário o cliente Valkey-Java 5.3.0 ou posterior.