Redis-主从+哨兵的搭建
下面以 3 台服务器,每台运行一个 Redis 和一个哨兵 为例。
| 服务器 | Redis 端口与初始角色 | 哨兵端口 |
|---|---|---|
A:10.0.0.21 |
6379,主库 |
26379 |
B:10.0.0.22 |
6379,从库 |
26379 |
C:10.0.0.23 |
6379,从库 |
26379 |
1. 配置 Redis 主从
三台服务器的 redis.conf 都配置:
port 6379
# 三台 Redis 使用相同的数据访问密码,请替换示例值
requirepass RedisDataPass_change_me
# 当前节点成为从库时,连接主库使用的密码
masterauth RedisDataPass_change_me
replica-read-only yes
每台再配置自己的监听地址。例如 A:
bind 127.0.0.1 10.0.0.21
B、C 分别替换成自己的 IP,并且额外增加:
# 初始主库为 A
replicaof 10.0.0.21 6379
A 不加 replicaof。随后在三台服务器分别启动:
redis-server /etc/redis/redis.conf
此时关系是:
A 主库
├── B 从库
└── C 从库
2. 配置三个哨兵
三台服务器分别创建 sentinel.conf,内容基本相同:
port 26379
# 哨兵自身的访问密码,三个哨兵保持一致
requirepass SentinelPass_change_me
# 监控名为 mymaster 的主库 A
# 2 表示至少两个哨兵判定主库不可用
sentinel monitor mymaster 10.0.0.21 6379 2
# 哨兵访问 Redis 数据节点使用的密码
sentinel auth-pass mymaster RedisDataPass_change_me
# 连续 5 秒未收到有效响应,判定该节点主观下线
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
# 切换后,每次允许一个从库重新同步新主库
sentinel parallel-syncs mymaster 1
每台再加自己的监听地址,例如 A:
bind 127.0.0.1 10.0.0.21
分别启动:
redis-server /etc/redis/sentinel.conf --sentinel
注意:
- 哨兵会自动发现 B、C,不用逐个填写。
- 实际故障转移还需要多数哨兵授权。
sentinel.conf及其所在目录需要允许哨兵进程写入,以保存发现的节点和切换结果。- 服务器之间要能访问相应的
6379、26379端口。
3. Spring Boot 配置 Lettuce
引入依赖,默认客户端就是 Lettuce:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Boot 3.x 的 application.yml:
spring:
data:
redis:
# Redis 数据节点密码
password: ${REDIS_PASSWORD}
connect-timeout: 2s
timeout: 2s
sentinel:
master: mymaster
# 哨兵自身的密码
password: ${REDIS_SENTINEL_PASSWORD}
nodes:
- 10.0.0.21:26379
- 10.0.0.22:26379
- 10.0.0.23:26379
两个环境变量分别填写前面设置的两类密码。
这里不需要连接池,也不需要额外开启读写分离,就可以支持发现新主库。 业务继续使用 StringRedisTemplate 即可。
4. 验证配置
查看主从状态,输入 Redis 数据密码:
redis-cli -h 10.0.0.21 -p 6379 --askpass INFO replication
分别检查三台:初始 A 应为 role:master,B、C 应为 role:slave。
向哨兵查询当前主库,输入哨兵密码:
redis-cli -h 10.0.0.21 -p 26379 --askpass SENTINEL get-master-addr-by-name mymaster
初始应返回 A 的地址。可以在测试环境停止 A 的 Redis 进程,验证主库地址是否切换,以及应用能否恢复读写。
整个过程是:
你配置初始主从
→ 哨兵监控并负责故障切换
→ Lettuce 查询哨兵,连接当前主库
切换期间可能短暂报错,异步复制也意味着切换存在丢失部分写入的风险。

浙公网安备 33010602011771号