Redis Sentinel(启用TLS)如何让ServiceStack获取节点FQDN而非IP以通过证书验证?
我来帮你梳理下解决这个问题的关键方向——核心是要让Redis从节点自己主动向Sentinel报告FQDN,而不是让Sentinel用IP来识别它们。你现在遇到的问题,大概率是只配置了Sentinel的announce参数,却忘了给Redis从节点也做同样的配置:
给每个Redis从节点配置announce参数
别只盯着Sentinel的配置!每个Redis主从节点(包括从节点)都需要在redis.conf里加上以下配置,这样它们才会向Sentinel报告自己的FQDN:resolve-hostnames yes announce-hostnames yes announce-ip "redistest2.mydomain.com" # 每个从节点替换成自己的对应FQDN配置完成后重启Redis从节点,Sentinel就能获取到它们的域名而非IP了。你可以在Sentinel实例上执行
SENTINEL slaves redistest(这里的redistest是你的主节点名称),查看返回的从节点地址是否已经变成FQDN,来验证配置是否生效。区分Sentinel日志里的两种地址信息
你之前看到Sentinel日志里有从节点的FQDN,那是Sentinel实例之间互相通信的地址,不是Redis从节点向Sentinel报告的自身服务地址——这一点要区分开。只有Redis节点自己配置了announce参数,Sentinel才会把对应的FQDN返回给ServiceStack。检查Redis证书的SAN字段
虽然你用了CA签发的证书,但要确保每个Redis节点的证书里的**Subject Alternative Name(SAN)**包含对应的FQDN。比如redistest2.mydomain.com必须出现在证书的SAN列表里,这样ServiceStack拿到FQDN后,证书验证才能顺利通过,不会出现“远程证书无效”的错误。ServiceStack侧的小确认
确保ServiceStack的Redis客户端配置里没有强制使用IP的选项,不过只要Redis节点正确返回FQDN,ServiceStack应该会自动使用这个地址进行连接和证书验证。如果还是有问题,可以查看ServiceStack的客户端日志,确认它从Sentinel获取的节点地址是否已经更新为FQDN。
如果配置后还是没生效,可以查看Redis从节点的日志,看看有没有关于announce配置的报错;或者看Sentinel日志里有没有+slave slave redistest2.mydomain.com:6379 ...这类更新从节点地址的记录,这能帮你快速定位问题出在哪一步。
备注:内容来源于stack exchange,提问作者Mikael H

