Keepalived 一主多从部署方案(生产环境实战文档)
目录
文档信息
| 项目 | 内容 |
|---|---|
| 文档版本 | V1.0 |
| 适用环境 | CentOS 7.9+ |
| 软件版本 | Keepalived 2.2.7(稳定版) |
| 部署模式 | 一主多从(VIP 漂移) |
| 文档用途 | 生产环境部署、运维参考 |
目录
1. 环境规划
1.1 服务器配置
| 角色 | IP 地址 | 主机名 | 操作系统 | 硬件配置(建议) | 备注 |
|---|---|---|---|---|---|
| Master | 192.168.10.100 | master | CentOS 7.9 | 8C16G,双网卡 | 主节点,优先级最高 |
| Backup 1 | 192.168.10.101 | backup01 | CentOS 7.9 | 8C16G,双网卡 | 从节点 1,优先级次之 |
| Backup 2 | 192.168.10.102 | backup02 | CentOS 7.9 | 8C16G,双网卡 | 从节点 2,优先级最低 |
| VIP | 192.168.10.200 | - | - | - | 虚拟 IP,对外提供服务 |
1.2 网络要求
- 所有节点位于同一局域网,网络延迟≤10ms
- 关闭防火墙或开放 VRRP 协议(协议号 112,组播地址 224.0.0.18)
- 建议配置双网卡绑定(bonding 模式 1 或 4),提升网络可用性
- 节点间无网络隔离,确保 VRRP 心跳包正常传输
2. 基础环境配置(所有节点执行)
2.1 关闭防火墙和 SELinux
# 关闭并禁用 firewalld
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭 SELinux
setenforce 0
# 永久关闭 SELinux(需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.2 安装依赖包
yum install -y gcc openssl-devel popt-devel curl policycoreutils-python chrony
2.3 时间同步(生产环境关键)
# 启动 chronyd 服务
systemctl start chronyd
systemctl enable chronyd
# 验证时间同步状态(出现 \* 表示同步成功)
chronyc sources
# 手动同步时间(可选)
chronyc -a makestep
2.4 配置主机名和 hosts(可选,便于管理)
# Master 节点配置
hostnamectl set-hostname master
cat >> /etc/hosts << EOF
192.168.10.100 master
192.168.10.101 backup01
192.168.10.102 backup02
EOF
# Backup01 节点配置
hostnamectl set-hostname backup01
cat >> /etc/hosts << EOF
192.168.10.100 master
192.168.10.101 backup01
192.168.10.102 backup02
EOF
# Backup02 节点配置(同 Backup01,主机名改为 backup02)
3. Keepalived 安装(所有节点执行)
3.1 下载稳定版源码包
# 进入源码目录
cd /usr/local/src
# 下载 Keepalived 2.2.7(稳定版,生产环境推荐)
wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
# 解压源码包
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
3.2 编译安装(指定生产级参数)
./configure \\
\--prefix=/usr/local/keepalived \\
\--sysconfdir=/etc \ # 配置文件放在 /etc 目录(符合系统规范)
\--with-systemd \ # 支持 systemd 管理
\--enable-snmp \ # 开启 SNMP 监控(便于集成监控系统)
\--enable-sha1 \ # 支持 SHA1 认证(增强安全性)
\--disable-fwmark # 禁用 fwmark(避免端口冲突)
# 编译并安装
make && make install
3.3 配置 systemd 服务(统一管理)
# 复制 systemd 服务文件
cp /usr/local/src/keepalived-2.2.7/keepalived/etc/systemd/keepalived.service /etc/systemd/system/
# 重新加载 systemd 配置
systemctl daemon-reload
# 设置开机自启(生产环境必做)
systemctl enable keepalived
3.4 验证安装
# 查看 Keepalived 版本
keepalived -v
# 输出示例(表示安装成功)
# Keepalived v2.2.7 (01/16,2022), git commit v2.2.7-0-g926948a9
4. 核心配置(生产级优化)
4.1 配置文件说明
- 主配置文件:
/etc/keepalived/keepalived.conf - 监控脚本目录:
/etc/keepalived/ - 日志文件:
/var/log/messages(默认)
4.2 Master 节点配置(192.168.10.100)
编辑 /etc/keepalived/keepalived.conf:
! Configuration File for keepalived
global\_defs {
router\_id LVS\_MASTER # 节点唯一标识(Master 专用)
vrrp\_skip\_check\_adv\_addr # 跳过对广告地址的检查
vrrp\_strict # 启用严格模式(防止脑裂)
vrrp\_garp\_interval 0 # 禁用 ARP 广播刷新
vrrp\_gna\_interval 0 # 禁用 NA 广播刷新
enable\_snmp\_traps # 开启 SNMP 陷阱(监控用)
snmp\_community keepalived\_public # SNMP 社区名(自定义)
}
\# 自定义脚本:监控业务进程(如 Nginx、MySQL,生产环境必配)
vrrp\_script check\_business {
script "/etc/keepalived/check\_business.sh" # 监控脚本路径
interval 3 # 检查间隔(3秒)
weight -20 # 检查失败权重减20(触发切换)
fall 3 # 连续3次失败视为故障
rise 2 # 连续2次成功恢复正常
}
vrrp\_instance VI\_1 {
state MASTER # 角色:主节点
interface eth0 # 绑定 VIP 的网卡(根据实际修改)
virtual\_router\_id 51 # VRRP 组 ID(所有节点必须一致)
priority 120 # 优先级(Master > Backup)
advert\_int 1 # 心跳间隔(1秒,生产环境推荐1-2秒)
authentication {
auth\_type PASS # 认证方式(PASS 或 AH)
auth\_pass 88888888 # 认证密码(8位,所有节点必须一致)
}
track\_script { # 绑定业务监控脚本
check\_business
}
virtual\_ipaddress { # VIP 配置(可多个,用空格分隔)
192.168.10.200/24 dev eth0 label eth0:1 # VIP + 网卡标签
}
\# 状态变更通知脚本(可选,生产环境推荐)
notify\_master "/etc/keepalived/notify.sh master" # 成为主节点时执行
notify\_backup "/etc/keepalived/notify.sh backup" # 成为从节点时执行
notify\_fault "/etc/keepalived/notify.sh fault" # 故障时执行
}
4.3 Backup 节点配置(192.168.10.101 / 192.168.10.102)
4.3.1 Backup01 节点配置
编辑 /etc/keepalived/keepalived.conf:
! Configuration File for keepalived
global\_defs {
router\_id LVS\_BACKUP01 # 节点唯一标识(Backup01 专用)
vrrp\_skip\_check\_adv\_addr
vrrp\_strict
vrrp\_garp\_interval 0
vrrp\_gna\_interval 0
enable\_snmp\_traps
snmp\_community keepalived\_public
}
vrrp\_script check\_business {
script "/etc/keepalived/check\_business.sh"
interval 3
weight -20
fall 3
rise 2
}
vrrp\_instance VI\_1 {
state BACKUP # 角色:从节点
interface eth0
virtual\_router\_id 51 # 与 Master 一致
priority 100 # 优先级低于 Master(100 < 120)
advert\_int 1
authentication {
auth\_type PASS
auth\_pass 88888888 # 与 Master 一致
}
track\_script {
check\_business
}
virtual\_ipaddress {
192.168.10.200/24 dev eth0 label eth0:1
}
notify\_master "/etc/keepalived/notify.sh master"
notify\_backup "/etc/keepalived/notify.sh backup"
notify\_fault "/etc/keepalived/notify.sh fault"
}
4.3.2 Backup02 节点配置
与 Backup01 配置一致,仅修改两处:
-
router_id LVS_BACKUP02(唯一标识) -
priority 90(优先级低于 Backup01,90 < 100)
4.4 业务监控脚本(/etc/keepalived/check_business.sh)
作用:监控核心业务进程(如 Nginx、MySQL),进程异常时触发 VIP 漂移
\#!/bin/bash
\# 生产环境可根据实际业务修改(以下以 Nginx 为例)
BUSINESS="nginx" # 业务进程名
RESTART\_CMD="systemctl restart nginx" # 重启命令
LOG\_FILE="/var/log/keepalived\_check.log" # 监控日志
\# 记录日志函数
log() {
echo "\[\$(date '+%Y-%m-%d %H:%M:%S')] \$1" >> \$LOG\_FILE
}
\# 检查业务进程是否存在
if pgrep -x "\$BUSINESS" > /dev/null; then
log "\$BUSINESS 进程正常"
exit 0
else
log "\$BUSINESS 进程异常,尝试重启..."
# 尝试重启业务
\$RESTART\_CMD
sleep 3 # 等待重启完成
# 再次检查
if pgrep -x "\$BUSINESS" > /dev/null; then
log "\$BUSINESS 重启成功"
exit 0
else
log "\$BUSINESS 重启失败,触发故障切换"
exit 1 # 退出非0,触发权重降低
fi
fi
4.5 故障通知脚本(/etc/keepalived/notify.sh)
作用:状态变更时发送邮件 / 短信通知(生产环境推荐)
\#!/bin/bash
\# 邮件通知配置(需安装 mailx:yum install -y mailx)
EMAIL="admin@example.com" # 接收通知的邮箱
SUBJECT="【Keepalived 状态变更】"
NODE\_IP=\$(hostname -I | awk '{print \$1}') # 当前节点 IP
STATUS=\$1 # 状态参数(master/backup/fault)
\# 拼接通知内容
case \$STATUS in
master)
CONTENT="节点: \$(hostname)(IP: \$NODE\_IP)\n状态: 切换为 MASTER 节点\n时间: \$(date '+%Y-%m-%d %H:%M:%S')\nVIP: 192.168.10.200"
;;
backup)
CONTENT="节点: \$(hostname)(IP: \$NODE\_IP)\n状态: 切换为 BACKUP 节点\n时间: \$(date '+%Y-%m-%d %H:%M:%S')"
;;
fault)
CONTENT="节点: \$(hostname)(IP: \$NODE\_IP)\n状态: 故障(FAULT)\n时间: \$(date '+%Y-%m-%d %H:%M:%S')\n请立即排查!"
;;
\*)
CONTENT="节点: \$(hostname)(IP: \$NODE\_IP)\n状态: 未知\n时间: \$(date '+%Y-%m-%d %H:%M:%S')"
;;
esac
\# 发送邮件
echo -e "\$CONTENT" | mail -s "\$SUBJECT" "\$EMAIL"
\# 记录本地日志
echo "\[\$(date '+%Y-%m-%d %H:%M:%S')] 状态: \$STATUS,已发送通知到 \$EMAIL" >> /var/log/keepalived\_notify.log
4.6 脚本权限配置(所有节点)
\# 赋予脚本执行权限
chmod +x /etc/keepalived/check\_business.sh
chmod +x /etc/keepalived/notify.sh
\# 日志文件授权
touch /var/log/keepalived\_check.log /var/log/keepalived\_notify.log
chmod 644 /var/log/keepalived\_check.log /var/log/keepalived\_notify.log
5. 启动与验证
5.1 启动 Keepalived 服务
\# 启动服务
systemctl start keepalived
\# 查看服务状态(确保 active (running))
systemctl status keepalived
\# 输出示例(成功状态)
\# ● keepalived.service - LVS and VRRP High Availability Monitor
\# Loaded: loaded (/etc/systemd/system/keepalived.service; enabled; vendor preset: disabled)
\# Active: active (running) since 三 2024-05-20 10:00:00 CST; 1min ago
5.2 基础验证
5.2.1 查看 VIP 绑定
\# 查看网卡信息(Master 节点应绑定 VIP)
ip addr show eth0
\# 输出示例(存在 192.168.10.200 表示绑定成功)
\# inet 192.168.10.100/24 brd 192.168.10.255 scope global eth0
\# inet 192.168.10.200/24 scope global secondary eth0:1
5.2.2 查看日志
\# 实时查看 Keepalived 日志
tail -f /var/log/messages | grep -E "Keepalived|VRRP"
\# Master 节点日志示例(成功启动)
\# May 20 10:00:00 master Keepalived\[1234]: Starting Keepalived v2.2.7 (01/16,2022)
\# May 20 10:00:00 master Keepalived\_vrrp\[1235]: VRRP\_Instance(VI\_1) Entering MASTER STATE
5.3 故障切换测试(生产环境必做)
测试 1:Master 节点服务停止
\# 在 Master 节点执行(停止 Keepalived 服务)
systemctl stop keepalived
\# 验证结果(在 Backup01 节点执行,查看 VIP 是否漂移)
ip addr show eth0
\# 预期结果:Backup01 节点网卡 eth0 绑定 192.168.10.200(因优先级 100 > Backup02 的 90)
\# 查看 Backup01 节点日志(确认状态切换)
tail -f /var/log/messages | grep "Entering MASTER STATE"
\# 预期日志:May 20 10:10:00 backup01 Keepalived\_vrrp\[5678]: VRRP\_Instance(VI\_1) Entering MASTER STATE
测试 2:Master 节点业务进程异常
\# 在 Master 节点执行(停止 Nginx 进程,模拟业务故障)
systemctl stop nginx
\# 查看监控脚本日志(确认重启尝试)
tail -f /var/log/keepalived\_check.log
\# 预期日志:\[2024-05-20 10:15:00] nginx 进程异常,尝试重启...
\# 预期日志:\[2024-05-20 10:15:03] nginx 重启失败,触发故障切换
\# 验证 VIP 漂移(在 Backup01 节点执行)
ip addr show eth0
\# 预期结果:VIP 从 Master 漂移到 Backup01(因 Master 权重降低 20 后,优先级 100 < Backup01 的 100)
测试 3:恢复 Master 节点服务
\# 在 Master 节点执行(恢复 Nginx 和 Keepalived 服务)
systemctl start nginx
systemctl start keepalived
\# 查看 Master 节点日志(确认恢复为 BACKUP 状态,因优先级 120 最高)
tail -f /var/log/messages | grep "Entering BACKUP STATE"
\# 预期日志:May 20 10:20:00 master Keepalived\_vrrp\[1235]: VRRP\_Instance(VI\_1) Entering BACKUP STATE
\# 说明:Master 恢复后,因优先级 120 > Backup01 的 100,VIP 会漂移回 Master 节点
测试 4:Backup01 节点故障(模拟多从节点切换)
\# 在 Backup01 节点执行(停止 Keepalived 服务)
systemctl stop keepalived
\# 验证 VIP 漂移(在 Backup02 节点执行)
ip addr show eth0
\# 预期结果:VIP 从 Backup01 漂移到 Backup02(因 Backup02 优先级 90 为剩余节点最高)
\# 查看 Backup02 节点日志
tail -f /var/log/messages | grep "Entering MASTER STATE"
\# 预期日志:May 20 10:25:00 backup02 Keepalived\_vrrp\[7890]: VRRP\_Instance(VI\_1) Entering MASTER STATE
6. 生产环境运维要点
6.1 日常监控
6.1.1 服务状态监控
\# 编写监控脚本(/etc/keepalived/monitor\_keepalived.sh)
\#!/bin/bash
if ! systemctl is-active --quiet keepalived; then
systemctl start keepalived
echo "\[\$(date '+%Y-%m-%d %H:%M:%S')] Keepalived 服务异常,已重启" >> /var/log/keepalived\_monitor.log
fi
\# 添加定时任务(每 1 分钟执行一次)
crontab -e
\# 添加内容:\* \* \* \* \* /etc/keepalived/monitor\_keepalived.sh
6.1.2 日志监控(推荐集成 ELK 或 Prometheus)
- 关键日志关键词:
- 状态切换:
Entering MASTER STATE、Entering BACKUP STATE、Entering FAULT STATE - 认证失败:
Authentication failed - 脚本执行异常:
script exited with status 1 - 日志切割配置(避免日志过大):
\# 创建 logrotate 配置文件(/etc/logrotate.d/keepalived)
/var/log/messages {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
6.2 配置备份与版本管理
\# 编写备份脚本(/etc/keepalived/backup\_config.sh)
\#!/bin/bash
BACKUP\_DIR="/data/keepalived\_backup/\$(date '+%Y%m%d')"
mkdir -p \$BACKUP\_DIR
cp /etc/keepalived/keepalived.conf \$BACKUP\_DIR/
cp /etc/keepalived/check\_business.sh \$BACKUP\_DIR/
cp /etc/keepalived/notify.sh \$BACKUP\_DIR/
echo "\[\$(date '+%Y-%m-%d %H:%M:%S')] 配置备份完成,路径:\$BACKUP\_DIR" >> /var/log/keepalived\_backup.log
\# 添加定时任务(每天凌晨 2 点执行)
crontab -e
\# 添加内容:0 2 \* \* \* /etc/keepalived/backup\_config.sh
6.3 避免脑裂(生产环境核心风险点)
- 启用 vrrp_strict 参数(已在配置中添加):
- 禁止 VIP 绑定在非物理网卡(如 lo)
- 禁止单节点时 VIP 激活,避免脑裂后多节点持有 VIP
- 双网卡绑定(推荐 bonding 模式 4,802.3ad 链路聚合):
\# 示例:bond0 配置(/etc/sysconfig/network-scripts/ifcfg-bond0)
TYPE=Bond
BOOTPROTO=static
IPADDR=192.168.10.100
PREFIX=24
GATEWAY=192.168.10.1
DNS1=8.8.8.8
BONDING\_OPTS="mode=4 miimon=100 lacp\_rate=fast"
NAME=bond0
DEVICE=bond0
ONBOOT=yes
- 添加额外监控脚本(检查 VIP 唯一性) :
\# /etc/keepalived/check\_vip\_unique.sh
\#!/bin/bash
VIP="192.168.10.200"
COUNT=\$(arping -c 2 -I eth0 \$VIP | grep "reply from" | wc -l)
if \[ \$COUNT -gt 1 ]; then
echo "\[\$(date '+%Y-%m-%d %H:%M:%S')] 发现脑裂!VIP \$VIP 存在多个节点" >> /var/log/keepalived\_brain.log
\# 可选:自动停止当前节点 Keepalived(需谨慎,建议先通知)
\# systemctl stop keepalived
fi
6.4 版本升级(生产环境操作规范)
- 升级前准备:
- 备份当前配置(
/etc/keepalived/ 目录) - 在测试环境验证新版本(推荐小版本升级,如 2.2.7 → 2.2.8)
- 升级步骤:
\# 1. 停止 Keepalived 服务(所有节点,建议先从 Backup 开始)
systemctl stop keepalived
\# 2. 卸载旧版本
rm -rf /usr/local/keepalived
rm -f /usr/sbin/keepalived
\# 3. 安装新版本(同 3.1-3.3 步骤,替换为新版本源码包)
wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
\# 后续编译安装步骤同上
\# 4. 恢复配置文件
cp /data/keepalived\_backup/20240520/keepalived.conf /etc/keepalived/
\# 5. 启动服务并验证
systemctl start keepalived
keepalived -v # 确认版本为 2.2.8
7. 常见问题排查
7.1 VIP 无法绑定到 Master 节点
| 问题现象 | 排查步骤 | 解决方案 |
|---|---|---|
Master 启动后,ip addr无 VIP | 1. 查看日志:grep "VRRP_Instance(VI_1)" /var/log/messages2. 检查网卡名称是否正确(ip link show) | 1. 若日志提示interface eth0 does not exist:修改配置中interface为实际网卡(如 ens33) 2. 若日志提示authentication failure:确保所有节点auth_pass一致 |
| VIP 绑定后立即消失 | 1. 检查是否开启vrrp_strict2. 检查节点间网络连通性(ping 192.168.10.101) | 1. 若为单节点测试:注释vrrp_strict(生产环境多节点需保留) 2. 若网络不通:检查交换机配置,确保 VRRP 组播包(224.0.0.18)可传输 |
7.2 故障切换不触发
| 问题现象 | 排查步骤 | 解决方案 |
|---|---|---|
| Master 服务停止,VIP 不漂移 | 1. 查看 Backup 节点日志:grep "received advert with higher priority"2. 检查 Backup 节点优先级配置 | 1. 若日志无此内容:确认virtual_router_id所有节点一致 2. 若 Backup 优先级 ≥ Master:降低 Backup 节点priority(如 Master 120,Backup 100/90) |
| 业务进程停止,监控脚本不生效 | 1. 手动执行脚本:/etc/keepalived/check_business.sh2. 查看 Keepalived 日志:grep "script exit status" | 1. 若脚本执行报错:检查BUSINESS进程名是否正确(如httpd而非apache) 2. 若日志提示permission denied:确保脚本有执行权限(chmod +x check_business.sh) |
7.3 脑裂现象(多节点持有 VIP)
| 问题现象 | 排查步骤 | 解决方案 |
|---|---|---|
arping 192.168.10.200显示多个 MAC 地址 | 1. 检查节点间网络是否中断(traceroute 192.168.10.100) 2. 检查是否禁用vrrp_strict | 1. 若网络中断:修复交换机或网卡故障,确保 VRRP 心跳包传输 2. 若未启用vrrp_strict:在配置中添加vrrp_strict参数 |
8. 参考文档
- 官方文档:
- Keepalived 官方手册:https://keepalived.org/documentation.html
- VRRP 协议标准(RFC 3768):https://datatracker.ietf.org/doc/html/rfc3768
- 环境配置参考:
- CentOS 7 双网卡绑定:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_bonding
- Chrony 时间同步:https://docs.centos.org/en-US/centos/7/system-administrators-guide/servers/Configuring_Chrony/
- 监控集成参考:
- Prometheus 监控 Keepalived:https://github.com/kiwigrid/keepalived-exporter
- Zabbix 监控 VRRP 状态:https://www.zabbix.com/integrations/keepalived
附录:配置文件快速索引
| 文件名 | 路径 | 作用 |
|---|---|---|
| keepalived.conf | /etc/keepalived/ | 核心配置文件(VRRP 实例、监控脚本绑定) |
| check_business.sh | /etc/keepalived/ | 业务进程监控脚本(触发故障切换) |
| notify.sh | /etc/keepalived/ | 状态变更通知脚本(邮件 / 短信) |
| monitor_keepalived.sh | /etc/keepalived/ | 服务状态监控脚本(自动重启) |
| backup_config.sh | /etc/keepalived/ | 配置备份脚本(定时备份) |
新增章节:9. Nginx 进程监听与故障漂移配置
9.1 需求说明
当 Nginx 进程异常停止(或端口无法访问)时,通过 Keepalived 监控脚本检测故障,自动降低当前节点优先级,触发 VIP 漂移到其他健康节点,确保业务不中断。
9.2 优化 Nginx 监控脚本(支持进程 + 端口双检)
替换原 check_business.sh 脚本(所有节点执行),新增端口检测(默认 80/443),确保 Nginx 不仅进程存活且能正常提供服务。
9.2.1 编写 Nginx 专用监控脚本
\# 创建脚本:/etc/keepalived/check\_nginx.sh
\#!/bin/bash
\# 监控目标:Nginx 进程 + 80/443 端口
NGINX\_PROCESS="nginx"
CHECK\_PORT=80 # 可根据业务修改(如 443)
LOG\_FILE="/var/log/keepalived\_nginx\_check.log"
RESTART\_CMD="systemctl restart nginx" # Nginx 重启命令
RETRY\_COUNT=2 # 重启重试次数
\# 日志记录函数
log() {
echo "\[\$(date '+%Y-%m-%d %H:%M:%S')] \$1" >> \$LOG\_FILE
}
\# 1. 检查 Nginx 进程是否存活
check\_process() {
if pgrep -x "\$NGINX\_PROCESS" > /dev/null; then
log "Nginx 进程存活"
return 0
else
log "Nginx 进程已停止"
return 1
fi
}
\# 2. 检查端口是否可访问(避免进程存活但端口堵塞)
check\_port() {
\# 使用 curl 检测端口(超时 3 秒,不校验证书)
if curl -s -o /dev/null -w "%{http\_code}" -m 3 "http://127.0.0.1:\$CHECK\_PORT" | grep -E "200|301|302" > /dev/null; then
log "Nginx \$CHECK\_PORT 端口可正常访问"
return 0
else
log "Nginx \$CHECK\_PORT 端口无法访问(可能端口堵塞或服务异常)"
return 1
fi
}
\# 3. 尝试重启 Nginx
restart\_nginx() {
local count=0
while \[ \$count -lt \$RETRY\_COUNT ]; do
log "第 \$((count+1)) 次尝试重启 Nginx..."
\$RESTART\_CMD
sleep 5 # 等待重启生效
\# 重启后检查进程和端口
if check\_process && check\_port; then
log "Nginx 重启成功"
return 0
fi
count=\$((count+1))
done
log "Nginx 重启 \$RETRY\_COUNT 次失败,触发 VIP 漂移"
return 1
}
\# 主逻辑:先检查进程,再检查端口;任一异常则重启,重启失败则触发漂移
if check\_process && check\_port; then
log "Nginx 状态正常,无需操作"
exit 0 # 状态正常,不影响 Keepalived 优先级
else
log "Nginx 异常,启动重启流程"
if restart\_nginx; then
exit 0 # 重启成功,保持当前节点优先级
else
exit 1 # 重启失败,触发 Keepalived 优先级降低(触发漂移)
fi
fi
9.2.2 赋予脚本执行权限
chmod +x /etc/keepalived/check\_nginx.sh
\# 手动测试脚本(验证是否正常执行)
/etc/keepalived/check\_nginx.sh
\# 查看日志确认结果
tail -f /var/log/keepalived\_nginx\_check.log
9.3 绑定 Nginx 监控脚本到 Keepalived 配置
修改所有节点的 /etc/keepalived/keepalived.conf,将原 check_business 脚本替换为 check_nginx,确保 Nginx 异常时触发权重调整。
9.3.1 Master 节点配置修改(192.168.10.100)
! Configuration File for keepalived
global\_defs {
router\_id LVS\_MASTER
vrrp\_skip\_check\_adv\_addr
vrrp\_strict
vrrp\_garp\_interval 0
vrrp\_gna\_interval 0
enable\_snmp\_traps
snmp\_community keepalived\_public
}
\# 替换为 Nginx 监控脚本(关键修改)
vrrp\_script check\_nginx {
script "/etc/keepalived/check\_nginx.sh" # 脚本路径
interval 3 # 每 3 秒检查一次
weight -30 # 检查失败权重减 30(确保优先级低于 Backup 节点)
fall 2 # 连续 2 次失败视为故障
rise 3 # 连续 3 次成功恢复权重
}
vrrp\_instance VI\_1 {
state MASTER
interface eth0
virtual\_router\_id 51
priority 120 # 初始优先级(高于 Backup 节点)
advert\_int 1
authentication {
auth\_type PASS
auth\_pass 88888888
}
\# 绑定 Nginx 监控脚本(关键修改)
track\_script {
check\_nginx
}
virtual\_ipaddress {
192.168.10.200/24 dev eth0 label eth0:1
}
notify\_master "/etc/keepalived/notify.sh master"
notify\_backup "/etc/keepalived/notify.sh backup"
notify\_fault "/etc/keepalived/notify.sh fault"
}
9.3.2 Backup 节点配置修改(192.168.10.101 / 192.168.10.202)
以 Backup01 为例(Backup02 配置相同,仅 router_id 和 priority 不同):
! Configuration File for keepalived
global\_defs {
router\_id LVS\_BACKUP01 # Backup02 改为 LVS\_BACKUP02
vrrp\_skip\_check\_adv\_addr
vrrp\_strict
vrrp\_garp\_interval 0
vrrp\_gna\_interval 0
enable\_snmp\_traps
snmp\_community keepalived\_public
}
\# 同样绑定 Nginx 监控脚本
vrrp\_script check\_nginx {
script "/etc/keepalived/check\_nginx.sh"
interval 3
weight -30
fall 2
rise 3
}
vrrp\_instance VI\_1 {
state BACKUP
interface eth0
virtual\_router\_id 51
priority 100 # Backup02 改为 90
advert\_int 1
authentication {
auth\_type PASS
auth\_pass 88888888
}
track\_script {
check\_nginx # 绑定脚本
}
virtual\_ipaddress {
192.168.10.200/24 dev eth0 label eth0:1
}
notify\_master "/etc/keepalived/notify.sh master"
notify\_backup "/etc/keepalived/notify.sh backup"
notify\_fault "/etc/keepalived/notify.sh fault"
}
9.4 重启 Keepalived 服务(所有节点)
\# 重启服务使配置生效
systemctl restart keepalived
\# 查看服务状态(确保无报错)
systemctl status keepalived
\# 查看 Keepalived 日志(确认脚本加载成功)
tail -f /var/log/messages | grep "check\_nginx"
\# 预期日志:May 20 14:30:00 master Keepalived\_vrrp\[1234]: Starting track script 'check\_nginx'
9.5 Nginx 故障漂移测试(生产环境验证)
测试步骤:模拟 Master 节点 Nginx 故障
- 在 Master 节点停止 Nginx 进程:
systemctl stop nginx
- 查看 Nginx 监控脚本日志(确认重启尝试):
tail -f /var/log/keepalived\_nginx\_check.log
\# 预期日志:
\# \[2024-05-20 14:35:00] Nginx 进程已停止
\# \[2024-05-20 14:35:00] Nginx 异常,启动重启流程
\# \[2024-05-20 14:35:00] 第 1 次尝试重启 Nginx...
\# \[2024-05-20 14:35:05] Nginx 进程已停止(若手动禁止启动,模拟重启失败)
\# \[2024-05-20 14:35:10] 第 2 次尝试重启 Nginx...
\# \[2024-05-20 14:35:15] Nginx 重启 2 次失败,触发 VIP 漂移
- 查看 Keepalived 日志(确认优先级降低):
tail -f /var/log/messages | grep "priority"
\# 预期日志:
\# May 20 14:35:16 master Keepalived\_vrrp\[1234]: VRRP\_Instance(VI\_1) priority is now 90 (120 - 30)
\# 说明:Master 优先级从 120 降至 90,低于 Backup01 的 100
- 验证 VIP 漂移结果:
- 在 Backup01 节点执行
ip addr show eth0,预期看到192.168.10.200/24 绑定 - 在 Master 节点执行
ip addr show eth0,预期 VIP 已消失 - 访问
http://192.168.10.200,预期能正常打开 Nginx 页面(由 Backup01 提供服务)
测试恢复:修复 Master 节点 Nginx
- 在 Master 节点重启 Nginx:
systemctl start nginx
- 查看监控脚本日志(确认恢复正常):
tail -f /var/log/keepalived\_nginx\_check.log
\# 预期日志:
\# \[2024-05-20 14:40:00] Nginx 进程存活
\# \[2024-05-20 14:40:00] Nginx 80 端口可正常访问
\# \[2024-05-20 14:40:00] Nginx 状态正常,无需操作
- 查看 Keepalived 日志(确认优先级恢复):
tail -f /var/log/messages | grep "priority"
\# 预期日志:
\# May 20 14:40:03 master Keepalived\_vrrp\[1234]: VRRP\_Instance(VI\_1) priority is now 120 (90 + 30)
- 验证 VIP 漂移回 Master:
- 在 Master 节点执行
ip addr show eth0,预期 VIP 重新绑定 - 在 Backup01 节点执行
ip addr show eth0,预期 VIP 消失
附录更新:配置文件快速索引(新增 Nginx 相关)
| 文件名 | 路径 | 作用 |
|---|---|---|
| check_nginx.sh | /etc/keepalived/ | Nginx 进程 + 端口双检脚本(触发漂移核心) |
| keepalived.conf | /etc/keepalived/ | 核心配置(已绑定 check_nginx 脚本) |
| keepalived_nginx_check.log | /var/log/ | Nginx 监控日志(排查故障用) |