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/