Redisson哨兵模式:高可用Redis集群的构建与维护
【免费下载链接】redisson 项目地址: https://gitcode.com/gh_mirrors/red/redisson
在分布式系统中,Redis作为高性能的缓存和数据存储解决方案,其高可用性至关重要。然而,单点Redis实例面临着故障风险,一旦宕机将导致服务不可用。Redisson哨兵模式(Sentinel Mode)通过引入哨兵节点实现了Redis集群的自动故障检测与主从切换,有效解决了这一痛点。本文将详细介绍如何使用Redisson构建和维护基于哨兵模式的高可用Redis集群,帮助你摆脱手动故障转移的繁琐流程。
哨兵模式核心原理
Redis哨兵(Sentinel)是一个分布式系统,用于监控Redis主从集群中的节点状态。当主节点出现故障时,哨兵会自动将从节点晋升为新的主节点,并通知客户端更新连接信息。Redisson作为Redis的Java客户端,深度集成了哨兵模式,提供了简洁的配置接口和自动发现机制。
架构组成
哨兵模式主要由三部分构成:
- 主节点(Master):处理读写请求的主要节点
- 从节点(Slave):复制主节点数据,提供读服务和故障备份
- 哨兵节点(Sentinel):监控主从节点,执行故障检测和自动故障转移
Redisson通过定期扫描哨兵节点(默认间隔1秒)获取集群状态,相关配置可在SentinelServersConfig.java中查看。当检测到主节点故障时,哨兵集群会协商选举新主节点,Redisson客户端会自动更新连接信息,整个过程对应用透明。
快速上手:Spring Boot集成哨兵模式
Redisson提供了专门的Spring Boot Starter,简化了在Spring应用中集成哨兵模式的配置流程。以下是基于最新版Redisson 3.30.0的实现步骤。
添加依赖
在pom.xml中添加Redisson Spring Boot Starter依赖:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.30.0</version>
</dependency>
如需适配特定Spring Boot版本,可参考redisson-spring-boot-starter/README.md中的版本对照表,通过排除默认依赖并显式指定兼容版本实现降级。
配置哨兵集群
在application.yml中添加哨兵模式配置:
spring:
redis:
redisson:
config: |
sentinelServersConfig:
idleConnectionTimeout: 10000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
password: null
subscriptionsPerConnection: 5
clientName: null
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
slaveConnectionMinimumIdleSize: 24
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 24
masterConnectionPoolSize: 64
readMode: "SLAVE"
subscriptionMode: "SLAVE"
sentinelAddresses:
- "redis://127.0.0.1:26379"
- "redis://127.0.0.1:26380"
- "redis://127.0.0.1:26381"
masterName: "mymaster"
database: 0
scanInterval: 1000
sentinelUsername: null
sentinelPassword: null
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
核心配置项说明:
sentinelAddresses:哨兵节点地址列表,至少配置2个以实现哨兵集群高可用masterName:主节点名称,需与Redis哨兵配置一致scanInterval:哨兵节点扫描间隔(毫秒),默认1000msreadMode:读操作路由模式,可选SLAVE(仅从节点)、MASTER(仅主节点)或MASTER_SLAVE(主从都可)
完整配置参数可参考SentinelServersConfig.java的字段定义及注释。
注入Redisson客户端
配置完成后,Redisson会自动创建RedissonClient等Spring Bean,可直接在应用中注入使用:
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RedisService {
private final RedissonClient redissonClient;
@Autowired
public RedisService(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
// 使用Redisson客户端操作Redis
public void setValue(String key, String value) {
redissonClient.getBucket(key).set(value);
}
public String getValue(String key) {
return (String) redissonClient.getBucket(key).get();
}
}
除RedissonClient外,还可注入RedissonReactiveClient或RedissonRxClient以支持响应式编程模型,具体可参考redisson-spring-boot-starter/README.md。
高级配置与性能优化
连接池调优
Redisson采用异步连接池管理Redis连接,合理配置连接池参数对性能至关重要。核心参数包括:
| 参数名称 | 说明 | 默认值 |
|---|---|---|
masterConnectionPoolSize | 主节点连接池最大容量 | 64 |
masterConnectionMinimumIdleSize | 主节点连接池最小空闲连接数 | 24 |
slaveConnectionPoolSize | 从节点连接池最大容量 | 64 |
slaveConnectionMinimumIdleSize | 从节点连接池最小空闲连接数 | 24 |
这些参数可根据应用的并发量进行调整。例如,对于读多写少的场景,可适当增加slaveConnectionPoolSize以提高读操作吞吐量。参数定义位于BaseMasterSlaveServersConfig.java(SentinelServersConfig的父类)。
读写分离策略
Redisson支持灵活的读写分离配置,通过readMode参数可设置读操作的路由策略:
SLAVE:读操作仅发送到从节点MASTER:读操作仅发送到主节点MASTER_SLAVE:读操作随机发送到主节点或从节点
配置示例:
sentinelServersConfig:
readMode: "SLAVE"
subscriptionMode: "SLAVE"
当设置为SLAVE模式时,Redisson会自动排除处于"down"状态或"syncing"状态的从节点(可通过checkSlaveStatusWithSyncing参数控制),确保读取到的数据是最新的。相关逻辑实现可参考SentinelServersConfig.java。
故障检测优化
Redisson提供了多项配置来优化哨兵模式的故障检测能力:
checkSentinelsList:启动时检查哨兵节点列表可用性,默认truesentinelsDiscovery:启用哨兵节点自动发现,默认truescanInterval:哨兵节点扫描间隔,默认1000ms
这些参数可根据实际需求调整,例如在网络不稳定的环境中,可适当增大scanInterval以减少网络开销。配置方法:
sentinelServersConfig:
checkSentinelsList: true
sentinelsDiscovery: true
scanInterval: 2000 # 增加扫描间隔至2秒
监控与维护
集群状态监控
Redisson客户端会定期扫描哨兵节点获取集群状态,可通过以下方式监控集群健康状况:
-
日志监控:Redisson会在日志中记录主从切换事件,例如:
[redisson-netty-1-2] INFO org.redisson.connection.MasterSlaveConnectionManager - Master changed! New master address: redis://127.0.0.1:6380 -
指标收集:通过Redisson的
getNodesGroup()方法获取集群节点信息:Collection<RedisNode> nodes = redissonClient.getNodesGroup().getNodes(); for (RedisNode node : nodes) { System.out.println("Node: " + node.getAddr() + ", Status: " + node.getStatus()); }
配置动态更新
在某些场景下需要动态调整哨兵集群配置(如增减哨兵节点),Redisson支持两种方式:
-
通过配置文件更新:修改
application.yml后,通过Spring Cloud Config等配置中心实现动态刷新 -
编程方式更新:通过
Config对象动态修改配置并重新创建RedissonClient:Config config = redissonClient.getConfig(); SentinelServersConfig sentinelConfig = config.useSentinelServers(); sentinelConfig.addSentinelAddress("redis://127.0.0.1:26382"); // 添加新哨兵节点 // 关闭旧客户端,创建新客户端 redissonClient.shutdown(); RedissonClient newRedissonClient = Redisson.create(config);
注意:动态更新哨兵地址后,需要重启RedissonClient才能生效。生产环境中建议采用双实例交替重启的方式避免服务中断。
常见问题处理
1. 哨兵节点连接失败
症状:应用启动时报错Unable to connect to sentinel
排查步骤:
- 检查哨兵节点地址是否正确,端口是否开放
- 确认哨兵节点是否正常运行(
redis-cli -p 26379 info sentinel) - 检查防火墙设置,确保应用服务器能访问哨兵节点端口
- 查看
checkSentinelsList配置是否为true(默认),如设为false会跳过启动时的哨兵列表检查
2. 主从切换后客户端未更新
症状:主节点故障后,应用仍连接到旧主节点
排查步骤:
- 检查
scanInterval配置是否过小,建议不小于1000ms - 确认哨兵集群已成功选举新主节点(
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster) - 检查Redisson日志,查看是否有
Master changed的记录 - 确认
natMapper配置是否正确(如使用NAT网络)
相关配置可参考SentinelServersConfig.java中的natMapper和scanInterval字段说明。
总结
Redisson哨兵模式通过简洁的配置和强大的自动故障转移能力,为Redis集群提供了高可用保障。本文从核心原理、快速集成、高级配置到监控维护,全面介绍了Redisson哨兵模式的使用方法。关键要点包括:
- 哨兵模式通过监控节点状态实现自动故障转移,无需人工干预
- Spring Boot应用可通过redisson-spring-boot-starter快速集成,减少配置工作量
- 合理调整连接池大小和读写分离策略可显著提升性能
- 通过日志监控和节点状态检查可及时发现集群问题
Redisson还提供了其他高级特性,如分布式锁、分布式集合等,可参考项目README.md进一步探索。掌握Redisson哨兵模式,将为你的分布式系统构建坚实的缓存层高可用基础。
【免费下载链接】redisson 项目地址: https://gitcode.com/gh_mirrors/red/redisson
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



