Spring Boot中Redisson连接本地Docker Redis Sentinel失败问题咨询
Redisson完全支持本地外部访问Docker中的Redis Sentinel集群,你的问题并非Redisson的限制导致,而是Docker网络配置和Sentinel参数设置不当引发的。
核心问题分析
- 主节点地址配置错误
你将Sentinel的REDIS_MASTER_HOST设为127.0.0.1,但对于Docker容器而言,这个地址指向容器自身,而非宿主机或同一Compose中的Redis主节点容器。这会导致:
- Sentinel无法正确发现Redis主节点
- 本地应用通过Sentinel获取主节点地址时,得到的是容器内部的
127.0.0.1,本地进程无法连接该地址 - Sentinel集群内部节点通信异常,Redisson无法获取足够的可用Sentinel节点
Sentinel节点的网络可见性问题
Docker Compose默认使用内部网络,Sentinel会将自身的内部主机名(如redis-sentinel)注册到集群中。当本地应用访问Sentinel时,Sentinel返回的其他Sentinel节点地址是容器内部的主机名,本地无法解析这些地址,最终Redisson只能连接到单个Sentinel节点,触发"至少需要两个Sentinel节点"的报错。Master名称不匹配
你本地应用配置的master: mymaster,与容器化应用中使用的redismaster不一致,这也会导致Sentinel集群无法识别指定的主节点。
解决步骤
1. 修正Docker Compose中Sentinel的配置
将Sentinel的主节点地址改为同一Compose中Redis主节点的服务名,并配置对外宣告的IP和端口:
# Redis主节点服务示例 redis-master: image: bitnami/redis:latest environment: - REDIS_PASSWORD=redispassword - REDIS_REPLICATION_MODE=master ports: - "6379:6379" # Sentinel服务示例(复制3份对应你的3个节点) redis-sentinel: image: bitnami/redis-sentinel:latest environment: - REDIS_MASTER_HOST=redis-master # 用Redis主节点的服务名,而非127.0.0.1 - REDIS_MASTER_PASSWORD=redispassword - REDIS_MASTER_NAME=redismaster # 统一master名称 - REDIS_SENTINEL_ANNOUNCE_IP=192.168.1.100 # 替换为你的宿主机IP - REDIS_SENTINEL_ANNOUNCE_PORT=26379 # 对应宿主机映射的端口 ports: - "26379:26379"
2. 修正本地Spring Boot的Redisson配置
确保master名称与Sentinel配置一致,节点地址使用宿主机IP和映射端口:
spring: data: redis: password: redispassword sentinel: master: redismaster nodes: - 192.168.1.100:26379 - 192.168.1.100:26380 - 192.168.1.100:26381
3. 重启服务
执行docker compose down停止现有服务,再执行docker compose up -d启动修正后的集群,最后重启本地Spring Boot应用。
总结
问题的本质是Docker网络隔离特性导致的地址配置错误,而非Redisson不支持本地访问。通过正确配置Sentinel的主节点地址和对外宣告的IP/端口,同时保持master名称一致,本地应用即可正常连接Docker中的Redis Sentinel集群。
内容的提问来源于stack exchange,提问作者sub

