服务器高可用集群是企业核心业务连续性的基础保障。本文以Keepalived配合Nginx为技术方案,完整演示双机热备到负载均衡的部署流程,涵盖架构设计、安装配置、故障切换测试和日常运维监控。适用于需要搭建高可用Web服务、API网关等场景的运维实践。
高可用集群架构设计:VIP漂移与健康检查机制
Keepalived基于VRRP(虚拟路由冗余协议)实现VIP(虚拟IP)在多台服务器之间的自动漂移。主节点故障时,备节点在秒级内接管VIP,对外服务不中断。整体架构如下:
# 架构示意
# 客户端请求
# |
# VIP: 192.168.1.100
# / \
# Master(主节点) Backup(备节点)
# 192.168.1.101 192.168.1.102
# Nginx :80 Nginx :80
# Keepalived Keepalived
# \ /
# 后端应用服务器集群
VRRP协议的工作机制:主节点定期发送VRRP通告包(默认每1秒),备节点在3个通告周期内未收到主节点通告,则认为主节点故障,触发VIP漂移。Keepalived同时执行应用层健康检查,当Nginx进程异常但服务器本身正常时,也能触发故障切换。
服务器环境准备与基础配置
两台服务器均使用CentOS Stream 9 / Ubuntu 22.04,关闭防火墙或放行VRRP协议,确保时间同步。
# 两台服务器均执行
# 安装依赖
yum install -y nginx keepalived pcre-devel openssl-devel
# Ubuntu: apt install -y nginx keepalived
# 放行VRRP协议(firewalld方式)
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
# 或iptables方式
iptables -I INPUT -p vrrp -j ACCEPT
# 确保时间同步
timedatectl set-ntp true
chronyc sources
基础Nginx配置(两台相同),作为反向代理将请求转发到后端应用服务器:
# /etc/nginx/conf.d/ha-proxy.conf
upstream backend {
server 192.168.1.201:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.202:8080 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://backend;
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 3s;
proxy_read_timeout 30s;
}
location /health {
access_log off;
return 200 "ok\n";
}
}
Keepalived配置详解:主节点与备节点
主节点Keepalived配置:
# /etc/keepalived/keepalived.conf (Master节点 192.168.1.101)
global_defs {
router_id HA_MASTER
enable_script_security
}
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
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
备节点配置只需修改三处:state改为BACKUP,priority设为90,router_id改为HA_BACKUP。其余配置与主节点完全一致,确保virtual_router_id和auth_pass相同。
健康检查脚本与故障通知配置
Nginx进程检测脚本,当Nginx进程不存在时尝试重启,重启失败则停止Keepalived让VIP漂移:
#!/bin/bash
# /etc/keepalived/check_nginx.sh
NGINX_PID=$(pgrep -x nginx | head -1)
if [ -z "$NGINX_PID" ]; then
systemctl restart nginx
sleep 2
NGINX_PID=$(pgrep -x nginx | head -1)
if [ -z "$NGINX_PID" ]; then
exit 1
fi
fi
exit 0
故障切换通知脚本,通过企业微信/钉钉Webhook发送告警:
#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.1.100"
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
case "$STATE" in
master)
MSG="高可用切换告警 主机:${HOSTNAME} 状态:MASTER VIP:${VIP}"
;;
backup)
MSG="高可用状态变更 主机:${HOSTNAME} 状态:BACKUP VIP:${VIP}"
;;
fault)
MSG="高可用故障告警 主机:${HOSTNAME} 状态:FAULT VIP:${VIP}"
;;
esac
curl -s -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d '{"msgtype":"text","text":{"content":"'"$MSG"'"}}'
赋予脚本执行权限并启动服务:
chmod +x /etc/keepalived/check_nginx.sh
chmod +x /etc/keepalived/notify.sh
systemctl enable keepalived nginx
systemctl start keepalived nginx
# 查看VIP绑定状态
ip addr show eth0 | grep 192.168.1.100
故障切换测试:模拟主节点宕机验证VIP漂移
部署完成后必须进行切换测试。测试场景包括Nginx进程崩溃、主节点网络断开、主节点关机三种情况:
# 场景1: 在主节点停止Nginx,观察VIP是否漂移
systemctl stop nginx
# 在Backup节点观察VIP是否接管
ip addr show eth0 | grep 192.168.1.100
# 查看Keepalived日志
journalctl -u keepalived -f --no-pager
# 场景2: 恢复主节点Nginx,观察VIP是否回切
systemctl start nginx
sleep 3
ip addr show eth0 | grep 192.168.1.100
# 场景3: 持续请求测试,验证切换过程的中断时间
while true; do
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" http://192.168.1.100/
sleep 0.5
done
正常情况下,VIP漂移在1-3秒内完成,客户端请求会有短暂超时但不影响整体服务。对于要求零中断的场景,可以在客户端配置重试机制或使用DNS层面的负载均衡配合。
服务器安全加固:Keepalived集群防护要点
高可用集群的安全加固容易被忽视。以下是几个关键安全措施:
# 1. 限制VRRP协议只接受对端节点
iptables -I INPUT -p vrrp -s 192.168.1.102 -j ACCEPT # Master节点
iptables -I INPUT -p vrrp -s 192.168.1.101 -j ACCEPT # Backup节点
iptables -A INPUT -p vrrp -j DROP
# 2. Keepalived认证密码使用强密码(至少16位)
# 3. 限制管理端口访问
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 4. Nginx隐藏版本号
# nginx.conf 中添加 server_tokens off;
# 5. 配置syslog远程日志,防止单点日志丢失
高可用集群上线后,定期进行切换演练(建议每月一次),验证切换流程的可靠性。同时部署Prometheus + Grafana监控Keepalived状态和Nginx健康指标,设置告警规则在VIP状态异常时及时通知运维团队。IDC数据中心环境下,还需考虑跨机柜冗余和双上行链路设计,避免单点物理故障导致整个集群不可用。硬件性能测评应定期进行,确保服务器负载在安全范围内。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-gao-ke-yong-ji-qun-da-jian-keepalivednginx/