高可用集群架构选型与规划
生产环境中物理服务器的高可用性直接决定业务连续性。单点故障是运维最致命的风险——一台物理机宕机导致整个业务中断的教训在任何规模的企业都不罕见。Keepalived + LVS构成的HA集群是经过大规模验证的方案,故障切换时间控制在1-3秒内,适合Web服务、数据库、API网关等对可用性要求极高的场景。
集群规划的核心原则:至少2台节点(主备模式)或3台节点(多活模式),共享存储或数据同步机制,独立的健康检查通道,以及脑裂防护策略。
Keepalived主备模式部署配置
以两台CentOS 8物理服务器搭建Nginx高可用集群为例,VIP设置为192.168.1.100:
主节点配置(MASTER)192.168.1.101:
# /etc/keepalived/keepalived.conf
global_defs {
router_id NGINX_MASTER
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每2秒检测一次
weight -20 # 检测失败则权重降20
fall 3 # 连续3次失败才判定为down
rise 2 # 连续2次成功恢复
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100 # 主节点优先级高于备节点
advert_int 1 # VRRP通告间隔1秒
authentication {
auth_type PASS
auth_pass K8j2mNx # 主备节点必须一致
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 label eth0:1
}
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"
}
健康检查脚本:
#!/bin/bash
# /etc/keepalived/check_nginx.sh
if ! pidof nginx &>/dev/null; then
systemctl start nginx
sleep 2
if ! pidof nginx &>/dev/null; then
exit 1 # Nginx启动失败,触发故障切换
fi
fi
exit 0
脑裂防护与仲裁机制
当主备节点之间的网络分区时,两个节点都可能声称自己是MASTER,争夺VIP导致数据混乱。这是高可用集群中最危险的现象——脑裂。防护方案从两个层面实施:
网络层防护:使用独立的心跳链路(直连网线或串口线),避免业务网络故障影响VRRP通告。双网卡配置:
# 心跳网络使用独立接口eth1
vrrp_instance VI_1 {
interface eth1 # 心跳走独立网络
unicast_src_ip 10.0.0.1
unicast_peer {
10.0.0.2 # 对端心跳IP
}
}
仲裁层防护:引入第三个节点或仲裁脚本作为判定依据:
# /etc/keepalived/check_arbiter.sh
ARBITER_IP=192.168.1.103 # 仲裁节点
if ! ping -c 1 -W 1 $ARBITER_IP &>/dev/null; then
exit 1 # 无法连接仲裁节点,降级为BACKUP避免脑裂
fi
exit 0
多活模式下的负载均衡配置
主备模式存在50%的资源浪费——备节点始终处于待命状态。多活模式让所有节点同时提供服务,通过LVS DR模式实现流量分发:
# LVS DR模式 + Keepalived配置
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr # 加权轮询
lb_kind DR # Direct Routing模式
persistence_timeout 50 # 会话保持50秒
protocol TCP
real_server 192.168.1.101 80 {
weight 100
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
real_server 192.168.1.102 80 {
weight 100
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
real_server 192.168.1.103 80 {
weight 50 # 性能较低节点分配更少流量
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
每台Real Server需要配置ARP抑制和VIP绑定:
# /etc/sysctl.d/keepalived.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
# VIP绑定到lo接口
ip addr add 192.168.1.100/32 dev lo
sysctl -p /etc/sysctl.d/keepalived.conf
故障切换的性能优化与监控
默认Keepalived配置的故障切换窗口为3-9秒,通过调优通告间隔和检测策略将切换时间压缩到1秒内:
vrrp_instance VI_1 {
advert_int 0.5 # 500ms通告间隔
garp_master_refresh 5
garp_master_delay 1
preempt_delay 30 # 抢占延迟30秒,避免频繁切换
}
切换通知脚本是集群可观测性的关键组件:
#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
HOST=$(hostname)
VIP=192.168.1.100
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
case $STATE in
MASTER)
MSG="[$TIMESTAMP] $HOST 升级为MASTER,接管VIP $VIP"
;;
BACKUP)
MSG="[$TIMESTAMP] $HOST 降级为BACKUP,释放VIP $VIP"
;;
FAULT)
MSG="[$TIMESTAMP] $HOST 进入FAULT状态"
;;
esac
echo "$MSG" >> /var/log/keepalived-state.log
curl -s -X POST "https://hooks.example.com/alert" -H "Content-Type: application/json" -d '{"text": "'"$MSG"'"}'
高可用集群的搭建不是终点,持续的故障演练才是验证HA有效性的唯一标准。定期主动关闭主节点服务、断开心跳链路、模拟网络分区,确保切换逻辑在各种故障场景下都能正确执行。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/wu-li-fu-wu-qi-gao-ke-yong-ji-qun-da-jian-shi-zhan-cong/