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 1min-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 进入官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。