Como lidar com um erro quando uso Lettuce para conectar-se a uma instância de Redis Cluster após a modificação da especificação?
Sintoma
Se a quantidade de partições for alterada durante a modificação da especificação de uma instância do Redis Cluster, alguns slots serão migrados para novas partições. O erro a seguir ocorre quando você usa Lettuce para se conectar à instância.
Para obter detalhes, consulte Conexão com X não permitida. Este ponto de conexão não é conhecido na vista de cluster.
Análise
Processo de modificação de especificação de uma instância do Redis Cluster:
Após ser iniciado, o cliente obtém a topologia do nó de cluster usando o comando Cluster Nodes baseado em RESP2 e mantém a topologia em sua estrutura de dados na memória.
Para acesso a dados, o cliente usa o algoritmo CRC16 para calcular o slot de hash de uma chave e encaminha automaticamente as solicitações com base na topologia e nas informações de slot armazenadas na memória.
Se o número de partições mudar durante o dimensionamento, a topologia e o mapeamento de slot serão alterados. Nesse caso, o cliente precisa atualizar automaticamente a topologia. Caso contrário, a rota de solicitação pode falhar ou o local da rota pode estar incorreto. Como resultado, um erro é relatado durante a conexão do cliente.
Por exemplo, quando o número de partições em uma instância do Redis Cluster muda de três para seis, a topologia e o mapeamento de slots são alterados, conforme mostrado nas figuras a seguir.
Soluções
Solução 1 (recomendada)
Habilitar a atualização automatizada da topologia.
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() // Periodic refresh: every time milliseconds. .enablePeriodicRefresh(Duration.ofMillis(time)) // Triggers of adaptive refresh: MOVED redirection, ASK redirection, reconnection, unknown node (since 5.1), and slot not in any of the current shards (since 5.2). .enableAllAdaptiveRefreshTriggers() .build();
Para obter detalhes, consulte um exemplo de uso do Lettuce para se conectar a uma instância de Redis Cluster.
Se você usar o Lettuce para se conectar a uma instância do Redis Cluster e a atualização automatizada não estiver ativada, será necessário reiniciar o cliente após a modificação da especificação.
Solução 2
Desabilitar a validação da associação ao nó do cluster.
ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() .validateClusterNodeMembership(false) .build();
Se validateClusterNodeMembership for true, verifique se o endereço de conexão atual está na topologia do cluster obtida por meio de CLUSTER NODES, antes de se conectar ao cluster. Se não estiver na topologia, o erro ocorre.
Impacto da desativação da validação da associação ao nó do cluster:
- Falta de detecção de violação de segurança.
- Se a atualização automática da topologia estiver desativada, uma solicitação de redirecionamento MOVED poderá ser gerada depois que as especificações do Redis Cluster forem alteradas e a quantidade de partições aumentar. O redirecionamento aumenta a carga de rede do cluster e o tempo necessário para processar uma única solicitação. Se a quantidade de partições diminuir, as partições excluídas não poderão ser conectadas.