一、Redis 哨兵集群搭建
(一)架构说明
-
Redis 主从节点:1 主 2 从,端口分别为 6379、6380、6381。
-
哨兵节点:3 个哨兵,端口分别为 26379、26380、26381。
-
目标:实现自动故障转移和高可用。
(二)配置主从节点
主节点(6379)配置(redis-6379.conf)
bind 0.0.0.0
port 6379
daemonize yes
requirepass 123456 # 主节点密码
masterauth 123456 # 从节点同步时使用的密码
appendonly yes
从节点 1(6380)配置(redis-6380.conf)
bind 0.0.0.0
port 6380
daemonize yes
slaveof 127.0.0.1 6379 # 主节点 IP 和端口
masterauth 123456
requirepass 123456
从节点 2(6381)配置(redis-6381.conf)
bind 0.0.0.0
port 6381
daemonize yes
slaveof 127.0.0.1 6379
masterauth 123456
requirepass 123456
(三)配置哨兵节点
哨兵 1(26379)配置(sentinel-26379.conf)
port 26379
daemonize yes
sentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点,2 为法定人数
sentinel auth-pass mymaster 123456 # 主节点密码
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
哨兵 2(26380)配置(sentinel-26380.conf) `
port 26380
daemonize yes
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
哨兵 3(26381)配置(sentinel-26381.conf)
port 26381
daemonize yes
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
(四)启动服务
# 启动 Redis 节点
redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server redis-6381.conf
# 启动哨兵节点
redis-sentinel sentinel-26379.conf
redis-sentinel sentinel-26380.conf
redis-sentinel sentinel-26381.conf
(五)验证哨兵集群
# 查看哨兵监控信息
redis-cli -p 26379 sentinel masters
redis-cli -p 26379 sentinel slaves mymaster
# 模拟主节点宕机
redis-cli -h 127.0.0.1 -p 6379 -a 123456 DEBUG sleep 30
# 观察哨兵日志,确认自动故障转移
tail -f sentinel-26379.log
二、Spring Boot 整合哨兵模式(YAML 配置)
(一)添加依赖(pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
(二)配置 YAML(application.yml)
spring:
redis:
password: 123456 # Redis 密码(主从节点需一致)
sentinel:
master: mymaster # 哨兵配置的主节点名称
nodes: # 哨兵节点列表
- 127.0.0.1:26379
- 127.0.0.1:26380
- 127.0.0.1:26381
lettuce:
pool:
max-active: 100 # 连接池配置
max-idle: 50
min-idle: 10
max-wait: 5000ms
shutdown-timeout: 100ms
(三)配置 RedisTemplate
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
(四)使用 RedisTemplate
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void writeData(String key, Object value) {
redisTemplate.opsForValue().set(key, value); // 写操作自动路由到主节点
}
public Object readData(String key) {
return redisTemplate.opsForValue().get(key); // 读操作默认跟随哨兵策略
}
}
三、验证高可用性
(一)写入测试
@SpringBootTest
public class SentinelTest {
@Autowired
private RedisService redisService;
@Test
void testWrite() {
redisService.writeData("sentinel_test", "Hello Sentinel!");
System.out.println("写入成功");
}
}
(二)故障转移测试
-
手动关闭主节点:
redis-cli -h 127.0.0.1 -p 6379 -a 123456 shutdown
-
观察日志:
tail -f /var/log/redis/sentinel.log # 查看故障转移日志
-
验证新主节点:
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
四、注意事项
(一)密码一致性
-
所有 Redis 节点和哨兵节点需使用相同密码。
-
Spring Boot 配置中需明确指定密码。
(二)哨兵节点发现
-
至少配置 3 个哨兵节点以确保高可用。
-
确保哨兵节点之间网络互通。
(三)客户端行为
-
Lettuce 客户端默认自动发现主从节点变化。
-
若使用 Jedis,需配置
spring.redis.jedis.pool...
并启用自动刷新。
(四)连接池优化
lettuce:
pool:
max-active: 200 # 根据并发量调整
max-wait: 3000ms # 获取连接超时时间
test-on-borrow: true # 借出连接时校验
(五)日志监控
logging:
level:
org.springframework.data.redis: DEBUG # 开启 Redis 操作日志
通过以上配置,Spring Boot 项目即可实现:
-
✅ 自动连接哨兵集群
-
✅ 主节点故障自动切换
-
✅ 读写分离(默认跟随哨兵策略)
-
✅ 连接池优化管理