Redis Sentinel con TLS: ¿cómo obtener el FQDN del nodo en lugar de la IP?

Redis Sentinel con TLS: ¿cómo obtener el FQDN del nodo en lugar de la IP?

Esto puede ser una pregunta sobre Serverfault o Stack Overflow, todavía no estoy seguro:

Configuré un sistema Redis simple de tres nodos con un nodo maestro y dos nodos de réplica, administrando la conmutación por error con Redis Sentinel. El tráfico de red de Redis y Sentinel está protegido mediante el soporte TLS integrado de Redis y certificados emitidos por CA regulares.

Cada instancia de Sentinel está configurada para anunciar su nombre de host y resolver DNS:

sentinel resolve-hostnames yes
sentinel announce-hostnames yes
sentinel announce-ip "redistest2.mydomain.com"

Tenemos un servicio web que utiliza Servicestack para conectarnos a las instancias de Sentinel. Mientras no validemos los certificados TLS y los nombres de host, todo funciona bien: el servicio web puede ver los oyentes de Redis Sentinel y, cuando finalizamos el maestro actual, el clúster de Redis vota por uno nuevo y el servicio web cambia al Nuevo nodo Redis grabable.

Sin embargo, mientras que el nodo maestro original informa con su FQDN, los dos nodos de respaldo solo parecen informar a ServiceStack con sus direcciones IP.

Un extracto del registro de Sentinel indica que los nodos de respaldo parecen usar sus nombres 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

Sin embargo, ServiceStack insiste en que solo recibe las direcciones IP del servidor del 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.

¿Hay algo más que pueda hacer en el lado de la configuración de Redis y/o Sentinel para garantizar que ServiceStack reciba los nombres de host reales de los nodos de Redis para que podamos validar correctamente los certificados utilizados?

Respuesta1

El registro de ServiceStack contiene la pista necesaria de lo que salió mal: Sentinel hizo exactamente lo que debía, pero se hacía referencia a los nodos de respaldo de Redis mediante la dirección IP.

De manera similar a cómo Sentinel puede devolver una cadena que contiene el FQDN en la sentinel announce-ipdeclaración de configuración, Redis puede hacer lo mismo con la replica-announce-ipdeclaración de configuración.

La solución fue agregar la siguiente línea al archivo de configuración de Redis en todos los hosts de respaldo:

replica-announce-ip servername.mydomain.com

El nombre del servidor en este caso, por supuesto, es el nombre de host de la máquina que ejecuta este nodo de respaldo específico.

información relacionada