Redis 哨兵模式高可用配置教程
Redis Sentinel(哨兵)是 Redis 官方提供的高可用解决方案,通过独立的哨兵进程监控 Redis 主从节点,在主节点故障时自动执行故障切换。相比 Redis Cluster,哨兵模式架构更简单,适合数据量不大但需要高可用保障的场景。本文将在搬瓦工 VPS 上搭建一主两从三哨兵的经典架构。
一、架构概述
- Redis Master:192.168.1.10:6379,处理写请求。
- Redis Slave 1:192.168.1.20:6379,同步主节点数据,处理读请求。
- Redis Slave 2:192.168.1.30:6379,同步主节点数据,处理读请求。
- Sentinel 1:192.168.1.10:26379
- Sentinel 2:192.168.1.20:26379
- Sentinel 3:192.168.1.30:26379
哨兵数量必须为奇数(至少 3 个),以便通过多数派投票决定是否执行故障切换。
二、安装 Redis
在三台搬瓦工 VPS 上安装 Redis:
apt update
apt install redis-server -y
redis-server --version
三、配置 Redis 主从
3.1 主节点配置
编辑 /etc/redis/redis.conf:
bind 0.0.0.0
port 6379
daemonize yes
pidfile /var/run/redis/redis-server.pid
logfile /var/log/redis/redis-server.log
dir /var/lib/redis
# 安全配置
requirepass YourStrongPassword123!
masterauth YourStrongPassword123!
# 持久化
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 内存限制(根据 VPS 内存调整)
maxmemory 256mb
maxmemory-policy allkeys-lru
注意:masterauth 在主节点上也要设置,因为故障切换后当前主节点可能变成从节点。
3.2 从节点配置
从节点在主节点配置基础上添加:
replicaof 192.168.1.10 6379
replica-read-only yes
3.3 启动并验证主从
# 三台服务器都重启 Redis
systemctl restart redis-server
# 在主节点检查
redis-cli -a YourStrongPassword123! INFO replication
应该看到 role:master 和两个已连接的 slave。
四、配置 Redis Sentinel
4.1 创建哨兵配置文件
在三台服务器上创建 /etc/redis/sentinel.conf:
port 26379
daemonize yes
pidfile /var/run/redis/redis-sentinel.pid
logfile /var/log/redis/redis-sentinel.log
dir /var/lib/redis
# 监控主节点,最后的 2 表示需要 2 个哨兵同意才执行故障切换
sentinel monitor mymaster 192.168.1.10 6379 2
# 主节点密码
sentinel auth-pass mymaster YourStrongPassword123!
# 主节点不可达超时时间(毫秒)
sentinel down-after-milliseconds mymaster 5000
# 故障切换超时时间
sentinel failover-timeout mymaster 60000
# 同时同步的从节点数量
sentinel parallel-syncs mymaster 1
# 哨兵自身密码(可选但推荐)
requirepass SentinelPass123!
4.2 启动哨兵
# 设置配置文件权限
chown redis:redis /etc/redis/sentinel.conf
# 启动哨兵
redis-sentinel /etc/redis/sentinel.conf
# 或使用 systemd
systemctl start redis-sentinel
如果系统没有 redis-sentinel 服务文件,创建 /etc/systemd/system/redis-sentinel.service:
[Unit]
Description=Redis Sentinel
After=network.target
[Service]
Type=forking
User=redis
Group=redis
ExecStart=/usr/bin/redis-sentinel /etc/redis/sentinel.conf
PIDFile=/var/run/redis/redis-sentinel.pid
Restart=always
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable redis-sentinel
systemctl start redis-sentinel
4.3 验证哨兵状态
# 连接哨兵
redis-cli -p 26379 -a SentinelPass123!
# 查看主节点信息
SENTINEL master mymaster
# 查看从节点
SENTINEL replicas mymaster
# 查看其他哨兵
SENTINEL sentinels mymaster
# 获取当前主节点地址
SENTINEL get-master-addr-by-name mymaster
五、故障切换测试
5.1 模拟主节点故障
# 停止主节点
redis-cli -a YourStrongPassword123! -h 192.168.1.10 DEBUG sleep 30
# 或直接停止服务
systemctl stop redis-server
等待 5-10 秒(down-after-milliseconds + 选举时间),查看哨兵日志:
tail -f /var/log/redis/redis-sentinel.log
日志中会依次显示:sdown(主观下线)、odown(客观下线)、vote(投票)、failover(切换完成)。
5.2 验证新主节点
redis-cli -p 26379 -a SentinelPass123! SENTINEL get-master-addr-by-name mymaster
应返回新的主节点地址。原主节点恢复后会自动变为从节点。
六、客户端连接配置
应用程序应通过哨兵连接 Redis,而不是直连固定的主节点地址。
6.1 Python 示例(redis-py)
from redis.sentinel import Sentinel
sentinel = Sentinel([
('192.168.1.10', 26379),
('192.168.1.20', 26379),
('192.168.1.30', 26379)
], socket_timeout=0.5, password='SentinelPass123!')
# 获取主节点连接(用于写操作)
master = sentinel.master_for('mymaster', password='YourStrongPassword123!')
master.set('key1', 'value1')
# 获取从节点连接(用于读操作)
slave = sentinel.slave_for('mymaster', password='YourStrongPassword123!')
print(slave.get('key1'))
6.2 Node.js 示例(ioredis)
const Redis = require('ioredis');
const redis = new Redis({
sentinels: [
{ host: '192.168.1.10', port: 26379 },
{ host: '192.168.1.20', port: 26379 },
{ host: '192.168.1.30', port: 26379 }
],
sentinelPassword: 'SentinelPass123!',
password: 'YourStrongPassword123!',
name: 'mymaster'
});
七、监控与告警
# 查看哨兵运行信息
redis-cli -p 26379 -a SentinelPass123! INFO sentinel
# 订阅哨兵事件通知
redis-cli -p 26379 -a SentinelPass123! SUBSCRIBE +sdown +odown +switch-master
# 配置通知脚本(在 sentinel.conf 中)
sentinel notification-script mymaster /usr/local/bin/sentinel-notify.sh
sentinel client-reconfig-script mymaster /usr/local/bin/sentinel-reconfig.sh
八、常见问题
- 脑裂问题:网络分区可能导致两个主节点同时存在。通过设置
min-replicas-to-write 1和min-replicas-max-lag 10可以缓解。 - 哨兵配置被修改:哨兵会自动重写配置文件,这是正常行为。不要在运行期间手动编辑。
- 故障切换后旧主节点数据丢失:异步复制可能导致少量未同步的数据丢失,这是设计上的权衡。
- 防火墙配置:确保 6379 和 26379 端口在所有节点之间互通。
ufw allow from 192.168.1.0/24 to any port 6379
ufw allow from 192.168.1.0/24 to any port 26379
总结
Redis 哨兵模式为主从架构提供了自动故障切换能力,是中小型应用实现 Redis 高可用的首选方案。如果你的数据量超出单节点容量限制,可以参考 Redis Cluster 集群搭建教程 实现水平扩展。更多 Redis 相关教程还有 Redis Stream 消息流处理。选购搬瓦工 VPS 请查看 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣,通过 bwh81.net 进入官网。