
Esta pode ser uma questão de Serverfault ou Stack Overflow, ainda não tenho certeza:
Configurei um sistema Redis simples de três nós com um nó mestre e dois nós de réplica, gerenciando failover com o Redis Sentinel. O tráfego de rede do Redis e do Sentinel é protegido usando o suporte TLS integrado do Redis e certificados regulares emitidos por CA.
Cada instância do Sentinel é configurada para anunciar seu nome de host e resolver DNS:
sentinel resolve-hostnames yes
sentinel announce-hostnames yes
sentinel announce-ip "redistest2.mydomain.com"
Temos um serviço web usando Servicestack para conectar-se às instâncias do Sentinel. Contanto que não validemos certificados TLS e nomes de host, tudo funciona bem: o serviço da web pode ver os ouvintes do Redis Sentinel e, quando encerramos o mestre atual, o cluster Redis vota em um novo e o serviço da web muda para o novo nó Redis gravável.
No entanto, embora o nó mestre original reporte seu FQDN, os dois nós de backup apenas parecem reportar ao ServiceStack seus endereços IP.
Um trecho do log do Sentinel indica que os nós de backup parecem usar seus nomes de host:
28011:X 15 Feb 2023 15:23:10.817 * +sentinel sentinel <hex-string> redistest2.mydomain.com 26379 @ redistest redistest1.mydomain.com 6379
28011:X 15 Feb 2023 15:23:10.821 * Sentinel new configuration saved on disk
28011:X 15 Feb 2023 15:23:10.897 * +sentinel sentinel <other-hex-string> redistest3.mydomain.com 26379 @ redistest redistest1.mydomain.com 6379
28011:X 15 Feb 2023 15:23:10.901 * Sentinel new configuration saved on disk
No entanto, o ServiceStack insiste em receber apenas os endereços IP do servidor do grupo de servidores:
Starting with sentinel.
Sentinel hosts: redistest1.mydomain.com:26379?ssl=true, redistest2.mydomain.com:26379?ssl=true, redistest3.mydomain.com:26379?ssl=true
Sentinel created
Host filter set.
Hostfilter: redistest1.mydomain.com:6379
Hostfilter: 10.100.60.72:6379
Hostfilter: 10.100.60.73:6379
RedisManager started.
Redis sentinel info: redistest primary: redistest1.mydomain.com:6379, replicas: 10.100.60.72:6379, 10.100.60.73:6379
Hostfilter: 10.100.60.72:6379
Hostfilter: 10.100.60.73:6379
Ping error with read only client: ServiceStack.Redis.RedisException: [14:23:47.626] Unable to Connect: sPort: 0, Error: One or more errors occurred.
(...)
---> System.AggregateException: One or more errors occurred. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
Há mais alguma coisa que eu possa fazer no lado da configuração do Redis e/ou do Sentinel para garantir que o ServiceStack receba os nomes de host reais dos nós do Redis para que possamos validar corretamente os certificados usados?
Responder1
O log do ServiceStack contém a pista necessária sobre o que deu errado: o Sentinel fez exatamente o que deveria, mas os nós de backup do Redis estavam sendo referenciados pelo endereço IP.
Semelhante à forma como o Sentinel pode retornar uma string contendo o FQDN na sentinel announce-ip
instrução de configuração, o Redis pode fazer o mesmo com a replica-announce-ip
instrução de configuração.
A solução foi adicionar a seguinte linha ao arquivo de configuração do Redis em todos os hosts de backup:
replica-announce-ip servername.mydomain.com
O nome do servidor, neste caso, é obviamente o nome do host da máquina que executa este nó de backup específico.