Redis Sentinel с TLS — как получить полное доменное имя узла вместо IP?

Redis Sentinel с TLS — как получить полное доменное имя узла вместо IP?

Это может быть вопрос Serverfault или Stack Overflow, я пока не уверен:

Я настроил простую трехузловую систему Redis с главным и двумя узлами-репликами, управляя отказоустойчивостью с помощью Redis Sentinel. Сетевой трафик Redis и Sentinel защищен с помощью встроенной поддержки TLS Redis и обычных сертификатов, выпущенных CA.

Каждый экземпляр Sentinel настроен на объявление своего имени хоста и разрешение DNS:

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

У нас есть веб-сервис, использующий Servicestack для подключения к экземплярам Sentinel. Пока мы не проверяем сертификаты TLS и имена хостов, все работает хорошо: веб-сервис видит слушателей Redis Sentinel, и когда мы завершаем текущий Master, кластер Redis голосует за нового, и веб-сервис переключается на новый доступный для записи узел Redis.

Однако в то время как исходный главный узел отправляет отчеты с помощью своего полного доменного имени, два резервных узла отправляют отчеты ServiceStack только с помощью своих IP-адресов.

Фрагмент журнала Sentinel показывает, что резервные узлы, по-видимому, используют свои имена хостов:

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

Однако ServiceStack настаивает на том, что он получает обратно только IP-адреса серверов от группы серверов:

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.

Могу ли я что-то еще сделать на стороне конфигурации Redis и/или Sentinel, чтобы гарантировать, что ServiceStack получает фактические имена хостов узлов Redis, чтобы мы могли правильно проверять используемые сертификаты?

решение1

Журнал ServiceStack содержит необходимую подсказку о том, что пошло не так: Sentinel сделал именно то, что должен был, но резервные узлы Redis ссылались на IP-адрес.

Подобно тому, как Sentinel может возвращать строку, содержащую полное доменное имя в sentinel announce-ipоператоре конфигурации, Redis может делать то же самое с replica-announce-ipоператором конфигурации.

Решением стало добавление следующей строки в файл конфигурации Redis на всех резервных хостах:

replica-announce-ip servername.mydomain.com

В данном случае Servername — это, конечно, имя хоста машины, на которой запущен этот конкретный резервный узел.

Связанный контент