Redis Sentinel基于Stunnel启用TLS后节点间及与主节点通信失败问题
解决Redis Sentinel + Stunnel TLS通信问题的排查方案
我之前也碰到过类似的Redis Sentinel搭配Stunnel实现TLS通信的坑,给你梳理几个关键的排查点和修复建议:
一、先检查Stunnel配置是否覆盖了所有需要转发的端口
你提到主从复制已经正常,但Sentinel之间/与主节点通信失败,大概率是Stunnel没正确处理Sentinel的端口转发。确保你的stunnel.conf里有针对Redis主从和Sentinel节点的独立转发规则:
示例Stunnel配置(针对主节点和Sentinel)
; 转发Redis主节点的TLS连接 [redis-master] client = yes accept = 127.0.0.1:63790 # 本地监听端口,供Sentinel连接 connect = <master-public-ip>:6379 cert = /path/to/your/cert.pem key = /path/to/your/key.pem CAfile = /path/to/your/ca.pem verify = 2 # 开启证书验证,确保通信安全 ; 转发远程Sentinel的TLS连接 [sentinel-node1] client = yes accept = 127.0.0.1:26280 # 本地监听的Sentinel端口,对应你执行命令的端口 connect = <sentinel1-public-ip>:26379 cert = /path/to/your/cert.pem key = /path/to/your/key.pem CAfile = /path/to/your/ca.pem verify = 2
注意:每个远程Sentinel节点都需要单独的转发块,独立配置更清晰。
二、修正Sentinel的核心配置
Sentinel的配置必须指向本地Stunnel的监听端口,而不是直接指向远程节点的真实端口:
关键Sentinel配置项
; 监控主节点:这里的IP和端口是本地Stunnel转发主节点的地址 sentinel monitor redisftdev 127.0.0.1 63790 2 sentinel down-after-milliseconds redisftdev 30000 sentinel failover-timeout redisftdev 180000 ; 重要:配置Sentinel对外宣告的地址(如果是云环境/跨主机部署) ; 让其他Sentinel能通过Stunnel访问到当前节点 sentinel announce-ip <your-sentinel-public-ip> sentinel announce-port <stunnel-forwarded-sentinel-port>
如果没设置announce-ip和announce-port,Sentinel会把本地私有IP告诉其他节点,导致跨主机的Sentinel无法建立连接,这是很多人踩的坑!
三、日志排查是关键
不管是Stunnel还是Sentinel,开启详细日志能快速定位问题:
- Stunnel日志:在
stunnel.conf里加debug = 7,启动后看日志里有没有连接失败、证书验证错误的信息。 - Sentinel日志:查看Sentinel的日志文件,搜索关键词
Can't connect、sentinel、redisftdev,会看到它尝试连接主节点或其他Sentinel的失败记录,比如端口不通、证书问题等。
四、可选方案:直接用Redis原生TLS替代Stunnel
如果你的Redis版本是6.0+,其实Sentinel本身已经原生支持TLS了,不需要再用Stunnel中转,配置更简单:
主从节点TLS配置示例
port 0 tls-port 6379 tls-cert-file /path/to/cert.pem tls-key-file /path/to/key.pem tls-ca-cert-file /path/to/ca.pem tls-auth-clients yes
Sentinel节点TLS配置示例
port 0 tls-port 26379 tls-cert-file /path/to/cert.pem tls-key-file /path/to/key.pem tls-ca-cert-file /path/to/ca.pem tls-auth-clients yes ; 直接用TLS端口监控主节点 sentinel monitor redisftdev <master-ip> 6379 2 sentinel sentinel-tls-yesredisftdev yes # 开启Sentinel与主节点的TLS通信
这个方案能避免Stunnel的端口转发配置错误,推荐优先尝试。
测试步骤
- 先在本地执行
redis-cli -p 26280,输入sentinel masters,看是否能返回主节点信息;如果不能,说明Sentinel到主节点的Stunnel转发有问题。 - 手动测试Stunnel连接:用
telnet 127.0.0.1 26280,看是否能建立连接,排除端口占用或Stunnel未启动的问题。
内容的提问来源于stack exchange,提问作者Mangaku
相关产品推荐
相关产品推荐

