服务器高可用架构的核心逻辑
服务器运维场景中,单点故障是最大的可用性杀手。一台物理机或云服务器的硬件故障、系统崩溃、网络中断,都会导致业务全面瘫痪。高可用集群的本质是用冗余消除单点——多台服务器组成集群,任何一台宕机,业务自动切换到存活节点,对用户透明。
Keepalived+HAProxy是中小规模场景下最成熟的高可用方案组合。Keepalived负责VIP(虚拟IP)故障漂移,HAProxy负责七层负载均衡和健康检查。两者配合实现双活架构:两台服务器同时对外提供服务,任意一台故障,另一台自动接管全部流量。
环境准备与网络拓扑
部署环境要求:
# 服务器规划
Master节点: 192.168.1.10 (hostname: ha-node1)
Backup节点: 192.168.1.11 (hostname: ha-node2)
VIP: 192.168.1.100 (对外服务的浮动IP)
# 操作系统:CentOS 7.9 / Ubuntu 22.04
# 内核版本:5.x+
两台服务器部署在同一个子网内,VIP通过VRRP协议在两台节点间漂移。客户端只访问VIP,不直接访问节点物理IP。
Keepalived安装与VRRP配置
在两台节点上分别安装Keepalived:
# CentOS
yum install -y keepalived
# Ubuntu
apt install -y keepalived
Master节点配置(ha-node1):
# /etc/keepalived/keepalived.conf - Master
global_defs {
router_id HA_NODE1
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MyS3cr3t!
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
Backup节点配置(ha-node2):
# /etc/keepalived/keepalived.conf - Backup
global_defs {
router_id HA_NODE2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass MyS3cr3t!
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
HAProxy健康检查与故障自动切换
Keepalived自身的VRRP心跳只能检测节点是否存活,无法判断HAProxy进程状态。需要配合检查脚本,当HAProxy异常时主动降低优先级触发VIP漂移:
# /etc/keepalived/check_haproxy.sh
#!/bin/bash
if ! killall -0 haproxy 2>/dev/null; then
exit 1
fi
exit 0
# 在keepalived.conf的global_defs后面添加
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
fall 2
rise 1
}
给脚本执行权限并启动服务:
chmod +x /etc/keepalived/check_haproxy.sh
systemctl enable keepalived && systemctl start keepalived
HAProxy七层负载均衡配置
两台节点上安装并配置HAProxy:
# /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
timeout connect 10s
timeout client 30s
timeout server 30s
retries 3
frontend http_front
bind *:80
stats enable
stats uri /haproxy?stats
stats auth admin:HaProxy2024!
default_backend http_back
backend http_back
balance roundrobin
option httpchk GET /health
server web1 192.168.1.10:8080 check inter 3000 rise 2 fall 3
server web2 192.168.1.11:8080 check inter 3000 rise 2 fall 3
配置要点:option httpchk通过HTTP健康检查判断后端是否可用,inter 3000表示每3秒检查一次,rise 2表示连续2次成功才标记为可用,fall 3表示连续3次失败才标记为不可用。
systemctl enable haproxy && systemctl start haproxy
故障切换验证与压测
部署完成后,必须验证故障切换行为:
# 1. 检查VIP在Master上
ip addr show eth0 | grep 192.168.1.100
# 2. 模拟HAProxy故障(在Master上执行)
systemctl stop haproxy
# 3. 观察VIP是否漂移到Backup
ip addr show eth0 | grep 192.168.1.100
# 4. 恢复Master的HAProxy
systemctl start haproxy
# 5. VIP应自动回漂到Master
切换时间取决于advert_int和fall参数。当前配置下,最坏情况切换时间 = 1s x 3 = 3秒。生产环境可根据业务容忍度调整。
服务器安全加固与生产环境注意事项
高可用集群暴露了VIP和多个端口,安全加固必须同步进行:
# 防火墙只放行必要端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
firewall-cmd --reload
# 禁用root远程登录
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
关键运维经验:两台节点的virtual_router_id必须一致,否则VRRP协商失败;生产环境务必配置authentication,防止同一网段非法VRRP抢占VIP;多组Keepalived实例共存时,每组使用不同的virtual_router_id;HAProxy的maxconn需要根据服务器硬件配置调整,过高会导致系统资源耗尽。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-gao-ke-yong-ji-qun-shi-zhan/