keepalived(双机高可用)
将本次 Nginx + HAProxy + Keepalived 双机高可用(主备模式) 的完整部署过程梳理如下,方便归档和复盘。
一、 集群架构规划
VIP(虚拟 IP):
192.168.10.66主节点(lb01):
IP:
192.168.10.130绑定的物理网卡:
ens160运行服务:
Nginx+Keepalived (MASTER, priority 100)
备节点(lb02):
IP:根据实际分配(如
192.168.10.131)绑定的物理网卡:
ens160(若网卡名不同按实际填写)运行服务:
HAProxy+Keepalived (BACKUP, priority 90)
二、 基础环境准备(两台机器均需执行)
1. 关闭防火墙与 SELinux
Bash
# 停止并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2. 安装必要软件包
psmisc 提供 killall 命令,检查脚本依赖此工具:
Bash
dnf install -y keepalived psmisc
3. 开启非本机 IP 绑定(内核参数)
允许服务绑定尚未漂移过来的 VIP:
Bash
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p
三、 编写健康检查脚本
健康检查脚本用于探测本地代理进程。若挂掉,脚本返回退出码 1,Keepalived 探测失败后会自动扣除优先级,触发 VIP 漂移。
1. 主节点 lb01(探测 Nginx)
Bash
cat << 'EOF' > /etc/keepalived/check_lb.sh
#!/bin/bash
if ! killall -0 nginx &>/dev/null; then
exit 1
fi
exit 0
EOF
chmod +x /etc/keepalived/check_lb.sh
2. 备节点 lb02(探测 HAProxy)
Bash
cat << 'EOF' > /etc/keepalived/check_lb.sh
#!/bin/bash
if ! killall -0 haproxy &>/dev/null; then
exit 1
fi
exit 0
EOF
chmod +x /etc/keepalived/check_lb.sh
四、 Keepalived 核心配置
1. 主节点 lb01 配置 (/etc/keepalived/keepalived.conf)
Nginx
! Configuration File for keepalived
global_defs {
router_id lb01
script_user root
enable_script_security
}
vrrp_script check_lb {
script "/etc/keepalived/check_lb.sh"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens160 # 必须与 ip addr 显示的物理网卡名一致
virtual_router_id 51 # 主备必须一致 (1-255)
priority 100 # Master 优先级高于 Backup
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678 # 密码长度不超过 8 位,主备必须一致
}
virtual_ipaddress {
192.168.10.66/24 dev ens160 label ens160:vip
}
track_script {
check_lb
}
}
2. 备节点 lb02 配置 (/etc/keepalived/keepalived.conf)
Nginx
! Configuration File for keepalived
global_defs {
router_id lb02
script_user root
enable_script_security
}
vrrp_script check_lb {
script "/etc/keepalived/check_lb.sh"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens160 # 根据 lb02 实际网卡名调整
virtual_router_id 51 # 与 Master 保持完全一致
priority 90 # 备机优先级必须低于 Master
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678 # 与 Master 保持完全一致
}
virtual_ipaddress {
192.168.10.66/24 dev ens160 label ens160:vip
}
track_script {
check_lb
}
}
五、 启动服务与故障排查要点
1. 启动服务(两台机器均执行)
Bash
# 确保代理服务正常运行
systemctl enable --now nginx # lb01 执行
systemctl enable --now haproxy # lb02 执行
# 启动 Keepalived
systemctl enable --now keepalived
2. 本次踩坑复盘要点
网卡名称拼写:
keepalived.conf中的网卡名必须与ip addr show严格一致(如ens160,切勿误写为eth160或eth0)。密码截断警告:
auth_pass最长仅支持 8 字节,超过会被截断。脚本权限与安全配置:高版本 Keepalived 默认限制 root 执行脚本,需在
global_defs中显式指定script_user root与enable_script_security。依赖工具:检查脚本若使用
killall,必须保证系统已预装psmisc。
六、 功能验收测试
查看初始 VIP:
在
lb01执行ip addr show ens160,包含192.168.10.66。在
lb02执行ip addr show,不包含该 VIP(无脑裂)。
测试故障切换:
在
lb01模拟服务故障:systemctl stop nginx。观察
lb02执行ip addr show,VIP 应在 2 秒内漂移到lb02。
测试恢复抢占:
在
lb01恢复服务:systemctl start nginx。观察
lb01重新抢占回 VIP,lb02自动释放 VIP。
keepalived(双机高可用)
https://originspace.work/archives/10.12hao-ji-hua
评论