
在 Kubernetes (k8s) 环境下使用 Redis Sentinel 进行高可用部署时,可能会遇到 failover 超时、Sentinel 误判、Spring Boot 连接失败 以及 Redisson 配置错误等问题。本文将对这些问题进行汇总分析,并提供详细的解决方案。
Redis Sentinel 是 Redis 的高可用组件,主要功能包括:
Redis Sentinel 关键配置(sentinel.conf):
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1down-after-milliseconds mymaster 5000:如果 5 秒内主节点无响应,认为其不可用。failover-timeout mymaster 60000:Sentinel 允许 60 秒内完成故障转移。failover-timeout1️⃣ 检查 Redis 副本同步状态:
kubectl exec -it redis-master-0 -- redis-cli INFO replication如果 connected_slaves: 0,说明没有可用副本,Sentinel 可能无法完成切换。
2️⃣ 增大 failover-timeout:
sentinel failover-timeout mymaster 120000 # 增加至 120 秒然后重启 Sentinel:
kubectl delete pod -l app=redis-sentinel3️⃣ 检查 Sentinel 是否足够:
kubectl get pods -l app=redis-sentinel如果 num-other-sentinels: 0,需要增加副本:
spec:
replicas: 3 # 至少 3 个 Sentineladded 和 is downspring.redis.sentinel.master 配置错误,导致 Spring Boot 连接不上 Redis Sentinel。sentinel.conf 里 mymaster 拼写错误,导致 Sentinel 无法正确发现主节点。1️⃣ 检查 sentinel.conf 配置
kubectl exec -it redis-sentinel-0 -- redis-cli -p 26379 SENTINEL MASTER mymaster如果 mymaster 不存在,说明 Sentinel 配置错误。
2️⃣ 检查 Spring Boot 配置
spring:
redis:
sentinel:
master:mymaster# 必须和 Sentinel 配置一致
nodes:
-redis-sentinel-0:26379
-redis-sentinel-1:26379
-redis-sentinel-2:26379
password:yourpassword3️⃣ 调整 timeout 以减少误判
spring:
redis:
timeout: 5000
lettuce:
pool:
max-active: 10
max-wait: 5000Redisson 是一个高效的 Redis 客户端,支持 Redis Sentinel 模式。
在 pom.xml 中引入:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.23.2</version>
</dependency>RedissonClientimport org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
publicclass RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSentinelServers()
.setMasterName("mymaster")
.addSentinelAddress("redis://redis-sentinel-0:26379",
"redis://redis-sentinel-1:26379",
"redis://redis-sentinel-2:26379")
.setPassword("yourpassword")
.setTimeout(5000)
.setConnectTimeout(10000);
return Redisson.create(config);
}
}import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclass RedisController {
privatefinal RedissonClient redissonClient;
public RedisController(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
@GetMapping("/set")
public String set(@RequestParam String key, @RequestParam String value) {
RBucket<String> bucket = redissonClient.getBucket(key);
bucket.set(value);
return"Set " + key + " = " + value;
}
@GetMapping("/get")
public String get(@RequestParam String key) {
RBucket<String> bucket = redissonClient.getBucket(key);
return"Get " + key + " = " + bucket.get();
}
}Unable to connect to Redis Sentinel✅ 解决方案
mymaster 不存在,说明 Sentinel 配置有误。🚀 Redis Sentinel + Redisson 高可用方案的关键要点:1️⃣ Redis Sentinel 需配置正确,mymaster 名称需一致,failover-timeout 需足够长。
2️⃣ Spring Boot 连接 Redis Sentinel 时,spring.redis.sentinel.master 需要匹配 Sentinel 配置。
3️⃣ Redisson 连接 Sentinel 需要手动配置 RedissonClient,并保证 sentinel.conf 正确。
4️⃣ 故障排查时,手动执行 SENTINEL MASTER mymaster,检查主节点状态。
📢 如果你仍然遇到问题,可以提供 redis-cli 的 SENTINEL MASTER mymaster 输出,我可以帮你分析!🚀
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。