Kubernetes上使用ot-redis-operator部署主从Redis集群的Spring Boot配置问题
K8s环境下Redis Operator部署集群的Spring Boot正确配置方案
核心原理说明
Redis Cluster 采用客户端分片架构,客户端需要获取全量集群节点拓扑才能直接将请求路由到正确节点,仅通过 Service 访问会出现 MOVED 重定向问题,且 StatefulSet 部署的 Redis Pod 重建后 IP 会变化,必须开启客户端拓扑自动刷新能力。
之前配置的问题说明
- 单节点配置
spring.redis.host:默认启用单点连接模式,客户端不会处理 Redis 返回的 MOVED 重定向响应,直接抛出异常 - 仅配置两个 Service 作为集群节点:若使用普通 ClusterIP Service,Lettuce 会将 Service IP 误识别为集群节点,无法正确拉取全量拓扑,NOAUTH 报错是因为新发现的节点未统一应用密码配置,节点感知不全存在路由错误隐患
- 写死6个Pod IP:Pod 重建后 IP 会变化,配置无法复用,确实不合理
正确配置方案
第一步:选择稳定的种子节点
无需配置动态的 Pod IP,可选两种稳定的种子节点配置方式:
- 优先使用 StatefulSet 稳定域名:Redis 集群 leader 节点的 StatefulSet 域名固定,格式为
<pod-name>.<headless-service-name>.<namespace>.svc.cluster.local:6379,配置3个leader域名作为种子节点即可。如果应用和Redis集群部署在同一个Namespace下,域名可简写为redis-cluster-leader-0.redis-cluster-leader:6379 - 若将
redis-cluster-leader配置为 Headless Service(spec.clusterIP: None),可直接配置redis-cluster-leader:6379作为唯一种子节点,Headless Service 会自动解析出所有 leader 节点的 IP
第二步:开启Lettuce拓扑自动刷新
必须开启集群拓扑自动刷新,才能在 Pod 重建、主从切换时自动更新客户端节点列表,解决删Pod后无路由、超时问题。
第三步:完整配置示例
application.properties 格式:
# 集群种子节点配置 spring.redis.cluster.nodes=redis-cluster-leader-0.redis-cluster-leader:6379,redis-cluster-leader-1.redis-cluster-leader:6379,redis-cluster-leader-2.redis-cluster-leader:6379 # 全局密码配置,自动应用到所有新发现的节点,解决NOAUTH报错 spring.redis.password=替换为你的Redis密码 # 开启Lettuce集群拓扑刷新 spring.redis.lettuce.cluster.refresh.enabled=true # 定时刷新周期,可根据业务调整 spring.redis.lettuce.cluster.refresh.period=10s # 开启自适应刷新,遇到MOVED/ASK重定向、节点离线时自动触发刷新 spring.redis.lettuce.cluster.refresh.adaptive=true # 可选:优先从从节点读取,分摊主节点压力 spring.redis.lettuce.cluster.read-from=REPLICA_PREFERRED # 连接池配置(按需添加) spring.redis.lettuce.pool.max-active=20 spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=2
application.yml 格式:
spring: redis: cluster: nodes: - redis-cluster-leader-0.redis-cluster-leader:6379 - redis-cluster-leader-1.redis-cluster-leader:6379 - redis-cluster-leader-2.redis-cluster-leader:6379 password: 替换为你的Redis密码 lettuce: cluster: refresh: enabled: true period: 10s adaptive: true read-from: REPLICA_PREFERRED pool: max-active: 20 max-idle: 8 min-idle: 2
验证方式
启动应用后可通过日志或Actuator端点确认,客户端可识别到全部6个集群节点,随机删除Pod后等待拓扑刷新完成,业务无报错即可。
内容的提问来源于stack exchange,提问作者Shadov
相关产品推荐
相关产品推荐

