Keepalived双机热备基础架构与适用场景
Keepalived基于VRRP协议实现高可用集群,是Linux系统管理中最常用的网络层高可用方案。Nginx作为反向代理和负载均衡器,配合Keepalived可以实现VIP漂移,当主节点故障时备用节点自动接管流量,业务无感知切换。这个组合在电商大促、金融交易等对可用性要求极高的场景中广泛部署。
高可用集群的架构设计需要明确几个关键参数:检测间隔(多久检查一次主节点状态)、权重配置(主备优先级差值)、故障切换阈值(连续几次检测失败才触发切换)。这些参数直接影响故障切换的速度和稳定性,配置不当会导致频繁误切或切换延迟过大。
环境准备与网络拓扑规划
以典型双机热备场景为例:两台服务器分别作为MASTER和BACKUP,共享一个VIP对外提供服务。服务器之间通过专用心跳线通信,避免业务网络抖动导致误判断。
网络规划:
– 主节点(MASTER):192.168.10.11,运行Nginx
– 备节点(BACKUP):192.168.10.12,运行Nginx
– VIP:192.168.10.100,对外暴露的虚拟IP
– 心跳网络:10.0.0.0/24(独立网段)
两台机器均安装CentOS 7/8或Ubuntu 20.04+,系统内核版本不低于3.10。开始配置前确认防火墙放行VRRP协议(IP协议号112)。
Nginx安装与反向代理配置
两台服务器执行相同操作。以yum安装方式为例:
# 安装依赖
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 编译安装Nginx
cd /usr/local/src
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream
make && make install
# 创建系统服务
cat > /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=Nginx HTTP Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
Nginx反向代理核心配置(/usr/local/nginx/conf/nginx.conf):
upstream backend_pool {
server 192.168.20.101:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.20.102:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.20.103:8080 weight=3 max_fails=3 fail_timeout=30s backup;
}
server {
listen 80;
server_name 192.168.10.100;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
}
location /health {
access_log off;
return 200 "ok";
}
}
max_fails和fail_timeout配合实现后端健康检查。Nginx默认的被动健康检查机制在节点恢复后自动重新纳入负载均衡。
Keepalived安装与VRRP配置
安装Keepalived:
yum install -y keepalived
# 或编译安装获取最新版本
cd /usr/local/src
wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
tar zxvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8
./configure --prefix=/usr/local/keepalived
make && make install
主节点(MASTER)配置文件 /etc/keepalived/keepalived.conf:
global_defs {
router_id NGINX_MASTER
enable_script_security
script_user root
}
vrrp_script check_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 MyStr0ngP@ss
}
virtual_ipaddress {
192.168.10.100/24 dev eth0
}
track_script {
check_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
关键参数解读:priority 100为主节点优先级,weight -20表示检测脚本失败时扣20分,扣分后低于备节点优先级即触发切换。fall 2表示连续2次检测失败才判定故障,rise 1表示恢复后1次成功即判定恢复。
备节点(BACKUP)配置文件:
global_defs {
router_id NGINX_BACKUP
enable_script_security
script_user root
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass MyStr0ngP@ss
}
virtual_ipaddress {
192.168.10.100/24 dev eth0
}
track_script {
check_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
}
主备配置差异只有三处:router_id、state、priority。virtual_router_id必须一致,否则两台机器各自形成独立VRRP组。
Nginx健康检查脚本编写
check_nginx.sh脚本是触发切换的关键环节:
#!/bin/bash
# /etc/keepalived/check_nginx.sh
NGINX_PORT=80
NGINX_PROCESS=$(pgrep -c nginx)
# 检查进程是否存活
if [ "$NGINX_PROCESS" -eq 0 ]; then
# 尝试重启Nginx
systemctl restart nginx
sleep 2
NGINX_PROCESS=$(pgrep -c nginx)
if [ "$NGINX_PROCESS" -eq 0 ]; then
echo "Nginx restart failed, triggering failover"
exit 1
fi
fi
# 检查端口是否响应
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:${NGINX_PORT}/health | grep -q "200"
if [ $? -ne 0 ]; then
echo "Nginx health check failed"
exit 1
fi
exit 0
脚本退出码为1时Keepalived触发weight扣分。脚本中加入了自动重启逻辑——单次Nginx崩溃不应该立即触发切换,先尝试本地恢复。
故障切换通知脚本
notify.sh用于切换时发送告警通知:
#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.10.100"
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
case "$STATE" in
master)
TITLE="高可用集群告警:节点切换为MASTER"
CONTENT="主机 ${HOSTNAME} 已接管VIP ${VIP},请检查原主节点状态"
;;
backup)
TITLE="高可用集群通知:节点切换为BACKUP"
CONTENT="主机 ${HOSTNAME} 已释放VIP ${VIP},当前降级为备用节点"
;;
fault)
TITLE="高可用集群告警:节点状态异常"
CONTENT="主机 ${HOSTNAME} Keepalived进入FAULT状态,需立即排查"
;;
esac
curl -s -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"${TITLE}\n${CONTENT}\"}}" \
"$WEBHOOK_URL"
chmod +x /etc/keepalived/check_nginx.sh
chmod +x /etc/keepalived/notify.sh
systemctl enable keepalived
systemctl start keepalived
故障切换验证与脑裂问题排查
部署完成后必须进行切换测试。模拟主节点故障的方法:
# 在主节点执行
systemctl stop nginx
# 等待4秒(interval 2 × fall 2),观察VIP是否漂移
# 在备节点检查VIP
ip addr show eth0 | grep 192.168.10.100
# 恢复主节点
systemctl start nginx
# 主节点优先级恢复为100,高于备节点90,VIP回切
脑裂问题是高可用集群中最危险的故障模式。两台服务器都认为自己持有VIP,导致IP冲突和流量混乱。常见原因与排查方法:
原因1:心跳网络不通。VRRP报文无法在主备之间传递,双方各自判断对方已宕机。排查命令tcpdump -i eth0 vrrp查看VRRP报文是否正常收发。解决方案是增加冗余心跳链路,或使用_serial_模式在串口线传输心跳。
原因2:防火墙阻断VRRP协议。VRRP使用IP协议号112,并非TCP/UDP端口。防火墙规则要显式放行:
# iptables放行VRRP
iptables -A INPUT -p 112 -j ACCEPT
# firewalld放行
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
原因3:服务器高负载导致心跳超时。CPU满载时Keepalived调度不及时,心跳报文延迟。解决方案是配置服务器安全加固措施中限制业务进程CPU使用率上限,或为Keepalived设置进程实时优先级:
# 提高Keepalived进程优先级
renice -n -5 -p $(pidof keepalived)
日志分析与运行状态监控
Keepalived日志默认输出到syslog。配置独立日志文件便于故障排查:
# 修改/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
# /etc/rsyslog.conf 添加
local0.* /var/log/keepalived.log
systemctl restart rsyslog keepalived
日常运维中需要关注的日志关键字:Entering MASTER STATE(成为主节点)、Entering BACKUP STATE(降级为备节点)、VRRP_Script(健康检查脚本结果)。日志中出现频繁的状态切换记录,说明高可用集群的稳定性存在隐患,需要从网络质量、服务器负载、健康检查脚本逻辑三个方向排查。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/keepalivednginx-gao-ke-yong-ji-qun-da-jian-shi-zhan-shuang/