Keepalived双机热备配置实战:VRRP协议与高可用集群故障切换方案

Keepalived是基于VRRP协议实现的高可用软件,通过主备节点间的健康检查与故障切换机制保障服务连续性。在服务器运维场景中,Keepalived常用于Web服务器、数据库、负载均衡器等关键组件的双机热备部署。配合LVS或Nginx可实现四层/七层负载均衡的高可用架构,是服务器高可用集群建设的核心组件。

VRRP协议原理与Keepalived工作机制

VRRP(虚拟路由冗余协议)将多台物理服务器抽象为一个虚拟路由器,对外提供虚拟IP(VIP)。集群中只有一个节点处于MASTER状态,其余为BACKUP。MASTER节点定期发送VRRP组播报文通告自身存活,BACKUP节点在超时未收到报文时触发优先级选举,接管VIP。

Keepalived在VRRP基础上增加了健康检查模块,可对TCP端口、HTTP接口、自定义脚本进行探测。当MASTER节点上的服务异常时,Keepalived主动降低VRRP优先级,触发故障切换。状态机流转如下:

# VRRP状态机流转
INIT → BACKUP → MASTER(优先级最高者当选)
              ↓
         MASTER故障 → 优先级降级 → BACKUP接管VIP
              ↓
         MASTER恢复 → 优先级恢复 → 抢占或非抢占模式决定是否切回

Keepalived安装与主备节点配置

Keepalived在CentOS上通过yum安装,Ubuntu上通过apt安装。安装后需要编辑keepalived.conf文件,核心配置包括global_defs全局定义、vrrp_script健康检查脚本、vrrp_instance VRRP实例。

主节点配置:

# /etc/keepalived/keepalived.conf - 主节点
global_defs {
    router_id LVS_MASTER
    vrrp_skip_check_adv_addr
    vrrp_strict
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass YourPass123
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        chk_nginx
    }
}

备节点配置差异在于state设为BACKUP、priority设为90,其余参数保持一致。virtual_router_id必须相同,同一VRRP实例内所有节点使用相同值。priority值越大优先级越高,MASTER故障时BACKUP根据priority值选举接管VIP。

健康检查脚本与故障切换测试

健康检查脚本返回0表示正常,非0表示异常。以Nginx为例,检查脚本如下:

#!/bin/bash
# /etc/keepalived/check_nginx.sh
if [ -f /var/run/nginx.pid ]; then
    if /usr/bin/curl -s http://127.0.0.1:80 > /dev/null 2>&1; then
        exit 0
    fi
fi
exit 1

脚本需添加执行权限:chmod +x /etc/keepalived/check_nginx.sh。weight参数设为-20表示检查失败时优先级降低20,当MASTER优先级100-20=80低于BACKUP的90时触发切换。故障切换测试步骤:

# 1. 在主节点上查看VIP绑定状态
ip addr show eth0 | grep 192.168.1.100

# 2. 停止主节点Nginx服务模拟故障
systemctl stop nginx

# 3. 等待2-4秒,在备节点查看VIP是否接管
ip addr show eth0 | grep 192.168.1.100

# 4. 恢复主节点Nginx,观察VIP是否抢占回来
systemctl start nginx

双主模式与LVS负载均衡集成

单主模式下备节点处于闲置状态,资源利用率低。双主模式通过两个VRRP实例实现互为主备,两台服务器同时对外提供服务,VIP分别绑定在不同节点上。客户端通过DNS轮询或上层负载均衡将流量分发到两个VIP。

# 双主模式 - 节点A配置
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    virtual_ipaddress { 192.168.1.100/24 }
    track_script { chk_nginx }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    virtual_ipaddress { 192.168.1.101/24 }
    track_script { chk_nginx }
}

# 节点B配置:VI_1设为BACKUP/priority 90,VI_2设为MASTER/priority 100

Keepalived与LVS集成可实现四层负载均衡高可用。LVS通过IPVS内核模块实现请求转发,Keepalived负责管理LVS规则和后端服务器健康检查:

virtual_server 192.168.1.100 80 {
    delay_loop 6
    lb_algo rr          # 轮询调度
    lb_kind DR          # 直接路由模式
    protocol TCP

    real_server 192.168.1.11 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
        }
    }

    real_server 192.168.1.12 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
        }
    }
}

脑裂问题排查与防护配置

脑裂(Split-Brain)是指主备节点因网络分区同时认为自己处于MASTER状态,导致VIP冲突。防护措施包括配置VRRP组播检查、使用独立心跳网络、引入第三方仲裁。基础防护配置:

vrrp_instance VI_1 {
    # ...
    preempt_delay 5        # 抢占延迟5秒,避免频繁切换
    garp_master_delay 1   # GARP延迟

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault  "/etc/keepalived/notify.sh fault"
}

# notify.sh - 切换通知脚本
#!/bin/bash
case "$1" in
    master)
        systemctl start nginx
        echo "$(date) - MASTER" >> /var/log/keepalived_switch.log
        ;;
    backup)
        systemctl stop nginx
        echo "$(date) - BACKUP" >> /var/log/keepalived_switch.log
        ;;
esac

生产环境建议开启vrrp_strict模式遵守VRRP规范,配置抢占延迟避免服务恢复时频繁切换,定期模拟故障切换验证高可用方案有效性。监控方面应采集VRRP状态变化、VIP漂移事件、健康检查结果,接入告警系统实现故障自动感知。Keepalived日志默认输出到/var/log/messages,可通过修改syslog配置将日志单独分流便于排查。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/keepalived-shuang-ji-re-bei-pei-zhi-shi-zhan-vrrp-xie-yi-yu/

(0)
小编小编
上一篇 6小时前
下一篇 6小时前

相关推荐