Redis5 哨兵(Sentinel)集群完整搭建教程
架构:1 主 2 从 + 3 哨兵(生产标准最小架构,避免脑裂)节点规划示例(可自行改 IP、端口)
| 角色 | IP | 端口 |
|---|---|---|
| 主节点 master | 192.168.1.100 | 6379 |
| 从节点 slave1 | 192.168.1.101 | 6379 |
| 从节点 slave2 | 192.168.1.102 | 6379 |
| 哨兵 sentinel-1 | 192.168.1.100 | 26379 |
| 哨兵 sentinel-2 | 192.168.1.101 | 26379 |
| 哨兵 sentinel-3 | 192.168.1.102 | 26379 |
前提:所有机器已经装好 Redis5(源码编译 /usr/local/redis),所有服务器互通、防火墙放行 6379、26379 端口
重要:Redis5 哨兵不支持配置文件动态重写密码,主从密码必须统一!
一、先部署主从复制(所有 redis 实例操作)
1. redis.conf 关键配置(master 节点)
bind 0.0.0.0 protected-mode no port 6379 daemonize yes pidfile /usr/local/redis/redis.pid logfile "/usr/local/redis/logs/redis.log" dir /usr/local/redis/data requirepass Redis@123456 # 统一密码 masterauth Redis@123456 # 主从密码一致,故障切换必备 dbfilename dump.rdb appendonly yes
2. slave 节点额外增加从配置
slaveof 192.168.1.100 6379
slave-read-only yes
# 同样配置 requirepass、masterauth 和master保持一致
3. 启动所有 redis 服务
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
验证主从:登录 master
redis-cli -a Redis@123456 info replication
能看到两个 slave 信息代表主从正常。
二、部署 Sentinel 哨兵(3 台机器都部署)
1. 创建哨兵配置文件
mkdir -p /usr/local/redis/conf
cp /usr/local/src/redis-5.0.14/sentinel.conf /usr/local/redis/conf/sentinel.conf
2. 修改 sentinel.conf(三台哨兵配置仅 IP 对应,内容几乎一致)
清空原有内容,直接写入下面模板
bind 0.0.0.0 port 26379 daemonize yes pidfile /usr/local/redis/sentinel.pid logfile "/usr/local/redis/logs/sentinel.log" # 格式:sentinel monitor 主节点名称 主IP 主端口 投票法定人数(quorum) # quorum=2:3个哨兵至少2个判定主节点失联才启动故障转移 sentinel monitor mymaster 192.168.1.100 6379 2 # 主节点密码(必须配置!否则哨兵无法监控、切换失败) sentinel auth-pass mymaster Redis@123456 # 哨兵多久没收到主节点响应,判定主观下线(毫秒) sentinel down-after-milliseconds mymaster 5000 # 故障转移时,新主同时并行同步的从节点数量,建议1 sentinel parallel-syncs mymaster 1 # 故障转移超时时间 180000ms=3分钟 sentinel failover-timeout mymaster 180000 # 禁止哨兵使用保护模式 protected-mode no
注意:不要手动修改配置文件里自动生成的从节点、其他哨兵信息,启动后哨兵自动发现集群节点。
三、启动哨兵(三台分别执行)
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf
验证哨兵状态
redis-cli -p 26379 # 查看集群监控信息 sentinel master mymaster sentinel slaves mymaster sentinel sentinels mymaster
正常可以看到:1 主、2 从、3 个哨兵全部识别。
四、配置 systemd 哨兵服务(可选,开机自启)
新建 /usr/lib/systemd/system/redis-sentinel.service
[Unit] Description=Redis Sentinel After=network.target redis.service [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown PrivateTmp=true [Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl enable redis-sentinel systemctl start redis-sentinel
五、防火墙放行端口(所有节点)
firewall-cmd --add-port=6379/tcp --permanent firewall-cmd --add-port=26379/tcp --permanent firewall-cmd --reload
六、故障模拟测试
1、停止 master redis
redis-cli -a Redis@123456 shutdown
-
2、观察哨兵日志
/usr/local/redis/logs/sentinel.log哨兵会进行投票,将其中一个 slave 提升为新 master;剩余另一个 slave 自动指向新 master。 - 3、旧 master 重新启动:自动变成新 master 的从节点。
七、重点避坑(Redis5 高频问题)
- 设置了密码但忘记
sentinel auth-pass mymaster xxx→ 哨兵无法连接 redis,故障转移失效 - 从节点缺少
masterauth主从切换后,新从节点无法同步新主,一直同步失败 - quorum 数值设置错误
3 哨兵推荐 quorum=2;不要设置成 3,网络抖动容易无法触发切换 - 不要单哨兵部署!极易脑裂,生产最少 3 哨兵
- Redis5 哨兵没有 acl,只能全局密码,所有实例密码统一
- Lettuce 高版本连接 Redis5 哨兵报错:使用 Lettuce5.x,或者切换 Jedis
八、客户端连接哨兵示例(Java 思路)
客户端连接哨兵端口 26379,询问
mymaster 地址,自动获取当前主节点,不要直连固定 redis 地址。
浙公网安备 33010602011771号