一、最终架构
假设有:
| 角色 | IP |
|---|---|
| LB01 | 192.168.1.10 |
| LB02 | 192.168.1.11 |
| VIP | 192.168.1.100 |
| Web01 | 192.168.1.20:8080 |
| Web02 | 192.168.1.21:8080 |
架构:
用户
│
↓
VIP 192.168.1.100
│
┌────────┴────────┐
↓ ↓
LB01 192.168.1.10 LB02 192.168.1.11
HAProxy + Keepalived HAProxy + Keepalived
MASTER BACKUP
│ │
└─────────┬───────────┘
↓
┌───────┴───────┐
↓ ↓
Web01:8080 Web02:8080
正常情况下:
VIP → LB01
LB01 挂掉:
VIP → LB02
用户始终访问 192.168.1.100。
二、第一步:两台 LB 安装软件
两台机器都执行。
Rocky / Alma / CentOS
dnf install -y haproxy keepalived
Ubuntu:
apt update
apt install -y haproxy keepalived
检查:
haproxy -v
keepalived --version
三、第二步:配置 HAProxy
两台机器都配置 HAProxy。
编辑:
vim /etc/haproxy/haproxy.cfg
配置:
global
log /dev/log local0
log /dev/log local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
option dontlognull
timeout connect 5s
timeout client 30s
timeout server 30s
retries 3
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health
server web01 192.168.1.20:8080 check
server web02 192.168.1.21:8080 check
这里的逻辑非常简单:
VIP:80
↓
HAProxy
↓
192.168.1.20:8080
192.168.1.21:8080
四、第三步:检查 HAProxy
两台机器分别执行:
haproxy -c -f /etc/haproxy/haproxy.cfg
必须看到:
Configuration file is valid
然后:
systemctl enable --now haproxy
检查:
systemctl status haproxy
确认 80 端口:
ss -lntp | grep :80
五、第四步:配置 Keepalived
这一步才是整个架构的关键。
Keepalived负责:
让 VIP 在 LB01 和 LB02 之间漂移。
六、LB01 配置 Keepalived
编辑:
vim /etc/keepalived/keepalived.conf
假设网卡叫:
eth0
配置:
global_defs {
router_id LB01
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_haproxy
}
}
这里最重要的是:
state MASTER
priority 150
LB01 是主节点。
七、LB02配置
LB02 同样编辑:
vim /etc/keepalived/keepalived.conf
配置:
global_defs {
router_id LB02
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_haproxy
}
}
注意:
LB01 priority = 150
LB02 priority = 100
所以正常情况下:
LB01 → MASTER
LB02 → BACKUP
VIP:
192.168.1.100
会在 LB01 上。
八、为什么还要检测 HAProxy?
这是生产环境非常重要的一点。
如果只检测 Keepalived:
Keepalived ✅
HAProxy ❌
VIP仍然在LB01
那么:
用户
↓
VIP
↓
LB01
↓
HAProxy ❌
服务还是挂了。
所以们让 Keepalived 检查 HAProxy。
创建:
vim /etc/keepalived/check_haproxy.sh
写:
#!/bin/bash
if systemctl is-active --quiet haproxy; then
exit 0
else
exit 1
fi
增加执行权限:
chmod +x /etc/keepalived/check_haproxy.sh
测试:
/etc/keepalived/check_haproxy.sh
echo $?
正常应该:
0
九、启动 Keepalived
两台机器分别:
systemctl enable --now keepalived
查看:
systemctl status keepalived
十、检查 VIP
在 LB01:
ip addr
应该看到:
192.168.1.100
LB02:
ip addr
正常情况下不会看到 VIP。
也就是:
LB01
192.168.1.10
192.168.1.100 ← VIP
LB02
192.168.1.11
十一、测试故障转移
这是部署完成以后必须测试的东西。
测试一:停止 HAProxy
在 LB01:
systemctl stop haproxy
等待几秒。
然后:
ip addr
LB01 的 VIP 应该消失。
再去 LB02:
ip addr
应该出现:
192.168.1.100
架构从:
VIP
↓
LB01
变成:
VIP
↓
LB02
十二、测试 LB01 整台服务器故障
甚至可以直接:
reboot
LB01 重启后:
LB01 ❌
↓
Keepalived发现MASTER消失
↓
LB02成为MASTER
↓
VIP漂移到LB02
用户仍然访问:
192.168.1.100
后面的业务继续工作。
十三、测试后端服务器故障
假设:
Web01 ❌
Web02 ✅
HAProxy 会通过:
check
发现 Web01 不可用。
然后:
HAProxy
/ \
❌ ↓
Web01 Web02
请求自动全部发送到 Web02。
十四、生产环境最终效果
最终得到的是:
Client
│
↓
VIP 192.168.1.100
│
┌──────────┴──────────┐
↓ ↓
LB01 192.168.1.10 LB02 192.168.1.11
HAProxy + Keepalived HAProxy + Keepalived
MASTER BACKUP
│ │
└──────────┬──────────┘
↓
┌────────┴────────┐
↓ ↓
Web01:8080 Web02:8080
对应关系可以记成:
Keepalived
↓
解决 LB 自己的高可用
↓
VIP 漂移
HAProxy
↓
解决后端服务的负载均衡
↓
流量分发 + 健康检查
Web01/Web02
↓
解决业务服务的高可用
最重要的一句话
HAProxy 本身不负责 VIP 高可用,Keepalived 负责 VIP 漂移;HAProxy 负责流量转发。
所以生产环境经常看到:
HAProxy + Keepalived
两者是配合关系,而不是二选一。