
虽然 Redis Sentinel 可以快速切换主节点,但客户端仍需感知主节点变化并重连。如果业务代码未正确实现哨兵发现逻辑,一旦主节点切换,连接就会失效。在高并发业务中,这种情况可能引发级联故障。为了解决这个“客户端重连成本问题”,我在香港的 Redis 集群部署中引入了 Keepalived + VIP(虚拟IP)机制,配合哨兵完成真正的“秒切不掉线”。
本篇将详解我在香港服务器环境下如何将 Keepalived 与 Redis Sentinel 结合,实现 VIP自动漂移 与 Redis主节点的自动绑定切换,从而让客户端始终连接一个固定的 IP 地址,无需感知后端变化。
一、架构设计与流转机制
1.1 整体架构说明
我们在 Redis 主节点与所有哨兵节点部署 Keepalived,定义一个 VIP(如 10.0.0.100),并通过 Sentinel 脚本机制将 VIP 绑定至当前主节点。切换流程如下:
- Redis 主节点被判定故障;
- Sentinel 完成新主节点选举;
- 触发 notification-script 调用自定义脚本;
- 脚本将 VIP 从旧主节点解绑,绑定至新主节点;
- 客户端仍访问 VIP,无感知连接新主节点。
1.2 组件角色说明
| 组件 | 角色 |
|---|---|
| Redis Sentinel | 哨兵机制,负责主节点监控与切换 |
| Redis Master | 当前主节点,绑定 VIP |
| Redis Slave | 被提升为主节点时接管 VIP |
| Keepalived | 提供 VIP 管理与健康检查 |
| 脚本 | Sentinel 调用,实现 VIP 切换 |
二、Keepalived 环境部署与配置
2.1 安装 Keepalived(所有 Redis 节点)
sudo apt install keepalived -y
2.2 主节点配置示例(10.0.0.11)
# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass redisvip
}
virtual_ipaddress {
10.0.0.100
}
track_script {
chk_redis
}
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/check_redis.sh"
interval 2
weight -10
}
2.3 Redis 状态探测脚本
# /etc/keepalived/scripts/check_redis.sh
#!/bin/bash
if ! redis-cli ping | grep -q PONG; then
exit 1
fi
exit 0
赋权并确保可执行:
chmod +x /etc/keepalived/scripts/check_redis.sh
其余从节点配置 priority 设为 90、80 等较低值。
三、Sentinel 切换绑定 VIP 脚本
3.1 配置 Sentinel 调用通知脚本
在每台哨兵节点中配置:
# sentinel.conf
sentinel notification-script mymaster /etc/redis/scripts/sentinel_vip_switch.sh
3.2 脚本实现逻辑
# /etc/redis/scripts/sentinel_vip_switch.sh
#!/bin/bash
MASTER_IP="$6" # 新主节点 IP
VIP="10.0.0.100"
# 所有节点都尝试绑定 VIP,如果当前节点 IP 与 MASTER_IP 相等则绑定,否则解绑
if hostname -I | grep -q "$MASTER_IP"; then
ip addr add $VIP/24 dev eth0 || true
else
ip addr del $VIP/24 dev eth0 || true
fi
说明:此脚本在所有哨兵节点上执行,通过本机 IP 与主节点对比,实现 VIP 迁移。
确保脚本具备执行权限并被 Redis 用户可调用:
chmod +x /etc/redis/scripts/sentinel_vip_switch.sh
四、客户端接入与验证
4.1 客户端连接逻辑
将客户端 Redis 地址指向 VIP 地址:
redis-cli -h 10.0.0.100
无需关注主从切换细节,业务端透明。
4.2 故障演练验证
关闭主节点服务:
sudo systemctl stop redis-server
查看 VIP 是否漂移至新主节点:
ip addr show dev eth0 | grep 10.0.0.100
确认客户端访问不受影响:
redis-cli -h 10.0.0.100 ping
五、实践经验与优化策略
5.1 多网卡支持
如服务器采用多网卡或私网与公网分离,需将 dev 参数指定为 Redis 所在业务网卡(如 eth1)。
5.2 高可用性保障建议
- Redis 节点网络需稳定可靠,防止频繁误判切换;
- VIP 最好划归与 Redis 同一子网,避免 L2 路由广播问题;
- Keepalived 使用 nopreempt 模式可避免频繁抢占 VIP;
- Sentinel 与 Keepalived 进程应加入 systemd 启动依赖链,避免顺序错乱。
我们通过将 Redis Sentinel 与 Keepalived 配合使用,在香港服务器部署环境下成功实现了真正的“秒级无感知切换”,既保留了 Redis 原生哨兵机制的稳定性,又避免了客户端的复杂逻辑与不确定重连。对业务来说,这是一种极为实用的“高性价比高可用”方案,尤其适合高速缓存写入、金融交易、游戏状态等不容中断的场景。











