如何接入 Keepalived + Redis Sentinel 构建浮动IP切换:实现客户端无感知高可用

如何接入 Keepalived + Redis Sentinel 构建浮动IP切换:实现客户端无感知高可用

虽然 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 原生哨兵机制的稳定性,又避免了客户端的复杂逻辑与不确定重连。对业务来说,这是一种极为实用的“高性价比高可用”方案,尤其适合高速缓存写入、金融交易、游戏状态等不容中断的场景。

未经允许不得转载:A5数据 » 如何接入 Keepalived + Redis Sentinel 构建浮动IP切换:实现客户端无感知高可用

相关文章

contact