跳到主要内容

第5章 Redis哨兵Sentinel

1. 哨兵介绍

主从复制架构的主要缺点是主节点故障需要人工切换,同时代码需要修改连接地址。Redis Sentinel 哨兵架构很好地解决了这个问题。

Redis Sentinel 是特殊的 Redis 节点,不参与数据存储和处理。哨兵采用分布式架构,可以运行多个节点,成员之间互相感知,即使某个哨兵节点故障,其他节点也能正常服务。

哨兵的主要功能

  1. 监控功能:监控主从节点是否正常工作,哨兵之间共享集群信息
  2. 自动故障转移:主节点故障时自动选举新主节点,无需人工介入
  3. 配置中心:客户端通过哨兵获取当前主节点地址,即使主从关系变化也无需修改代码

哨兵架构图

2. 部署规划

IP地址端口号角色
10.0.0.516379主节点
10.0.0.5126379哨兵节点
10.0.0.526379从节点
10.0.0.5226379哨兵节点
10.0.0.536379从节点
10.0.0.5326379哨兵节点

3. 部署Redis主从节点

以下是 db-51 的操作命令,db-52 和 db-53 只需修改 IP 地址:

cd /opt/
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxf redis-5.0.7.tar.gz -C /opt/
ln -s /opt/redis-5.0.7 /opt/redis
cd /opt/redis
make
make install

mkdir -p /opt/redis_6379/{conf,logs,pid}
mkdir -p /data/redis_6379
cat >/opt/redis_6379/conf/redis_6379.conf<<EOF
daemonize yes
bind 127.0.0.1 10.0.0.51
port 6379
pidfile "/opt/redis_6379/pid/redis_6379.pid"
logfile "/opt/redis_6379/logs/redis_6379.log"
dbfilename "redis.rdb"
dir "/data/redis_6379"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
EOF

groupadd redis -g 1000
useradd redis -u 1000 -g 1000 -M -s /sbin/nologin
chown -R redis:redis /opt/redis*
chown -R redis:redis /data/redis*
cat >/usr/lib/systemd/system/redis.service<<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/redis-server /opt/redis_6379/conf/redis_6379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start redis

4. 配置主从复制

redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
redis-cli -h 10.0.0.53 slaveof 10.0.0.51 6379
redis-cli -h 10.0.0.51 info replication

5. 部署哨兵节点

三台机器都需要执行以下操作:

mkdir -p /data/redis_26379
mkdir -p /opt/redis_26379/{conf,pid,logs}
cat >/opt/redis_26379/conf/redis_26379.conf << EOF
bind $(ifconfig eth0|awk 'NR==2{print $2}')
port 26379
daemonize yes
pidfile /opt/redis_26379/pid/redis_26379.pid
logfile /opt/redis_26379/logs/redis_26379.log
dir /data/redis_26379
sentinel monitor myredis 10.0.0.51 6379 2
sentinel down-after-milliseconds myredis 3000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 18000
EOF
chown -R redis:redis /data/redis*
chown -R redis:redis /opt/redis*
cat >/usr/lib/systemd/system/redis-sentinel.service<<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/redis-sentinel /opt/redis_26379/conf/redis_26379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli -h $(ifconfig eth0|awk 'NR==2{print $2}') -p 26379 shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start redis-sentinel
redis-cli -h $(ifconfig eth0|awk 'NR==2{print $2}') -p 26379

关键配置解释

sentinel monitor myredis 10.0.0.51 6379 2
# myredis主节点别名 主节点IP 端口 需要2个哨兵节点同意

sentinel down-after-milliseconds myredis 3000
# 认定服务器已经断线所需要的毫秒数

sentinel parallel-syncs myredis 1
# 向主节点发给复制操作的从节点个数,1表示轮训发起复制

sentinel failover-timeout myredis 18000
# 故障转移超时时间

6. 哨兵使用注意事项

⚠️ 哨兵注意事项
  • 哨兵发起故障转移的条件是 master 节点失联,从节点挂掉不会触发
  • 哨兵会自动维护配置文件,不需要手动修改
  • 主从结构变化时,哨兵之间会自动同步并更新配置
  • 哨兵启动后,不要再手动设置主从关系

7. 验证主节点

redis-cli -h 10.0.0.51 -p 26379 SENTINEL get-master-addr-by-name myredis

8. 哨兵常用命令

哨兵命令命令解释
sentinel masters打印所有主节点的详细信息
sentinel master myredis打印指定主节点的详细信息
sentinel slaves myredis打印所有从节点的详细信息
sentinel get-master-addr-by-name myredis获取当前主节点的 IP 和端口
sentinel failover myredis主动发起故障转移
sentinel ckquorum myredis检查哨兵节点是否满足选举要求

9. 故障转移测试

测试步骤

  • 关闭当前主节点
  • 观察其他节点是否发生选举
  • 查看哨兵配置文件是否更新
  • 查看从节点配置是否更新
  • 验证新主节点能否写入
  • 验证从节点同步是否正常

选举流程

  1. 从节点筛选:
    • 过滤不健康节点(主观下线、断线、5秒内未响应 ping、失联超过 down-after-milliseconds×10)
    • 选择 slave-priority 最高的从节点
    • 选择复制偏移量最大的从节点(数据最完整)
    • 选择 runid 最小的从节点

选举流程图

💡 故障转移结果
  • 哨兵选举新的主节点
  • 新主节点执行 slaveof no one
  • 从节点执行 slaveof 新主节点
  • 自动更新哨兵配置
  • 自动更新从节点配置

10. 故障恢复

故障节点重新上线后:

  • 启动 Redis 服务
  • 自动成为新主节点的从节点

11. 哨兵加权选举

查看节点权重

redis-cli -h 10.0.0.51 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.52 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.53 -p 6379 CONFIG GET slave-priority

设置节点权重

将 10.0.0.53 设为优先主节点:

redis-cli -h 10.0.0.51 -p 6379 CONFIG SET slave-priority 0
redis-cli -h 10.0.0.52 -p 6379 CONFIG SET slave-priority 0

验证设置

redis-cli -h 10.0.0.51 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.52 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.51 -p 26379 sentinel get-master-addr-by-name myredis

主动触发选举

redis-cli -h 10.0.0.51 -p 26379 sentinel failover myredis
redis-cli -h 10.0.0.51 -p 26379 sentinel get-master-addr-by-name myredis
💡 最佳实践
  • 生产环境至少部署 3 个哨兵节点,确保高可用
  • 合理设置 slave-priority,控制故障转移的主节点选择
  • 定期测试故障转移流程,确保配置正确

更新: 2025-01-14 16:34:38