文档信息​

项目内容
文档版本V1.0
适用环境CentOS 7.9+
软件版本Keepalived 2.2.7(稳定版)
部署模式一主多从(VIP 漂移)
文档用途生产环境部署、运维参考

目录

  1. 环境规划
  2. 基础环境配置
  3. Keepalived 安装
  4. 核心配置(生产级优化)
  5. 启动与验证
  6. 生产环境运维要点
  7. 常见问题排查
  8. 参考文档

1. 环境规划

1.1 服务器配置

角色IP 地址主机名操作系统硬件配置(建议)备注
Master192.168.10.100masterCentOS 7.98C16G,双网卡主节点,优先级最高
Backup 1192.168.10.101backup01CentOS 7.98C16G,双网卡从节点 1,优先级次之
Backup 2192.168.10.102backup02CentOS 7.98C16G,双网卡从节点 2,优先级最低
VIP192.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 配置一致,仅修改两处:

  1. router_id LVS_BACKUP02​(唯一标识)
  2. 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 避免脑裂(生产环境核心风险点)

  1. 启用 vrrp_strict 参数(已在配置中添加):
  • 禁止 VIP 绑定在非物理网卡(如 lo)
  • 禁止单节点时 VIP 激活,避免脑裂后多节点持有 VIP
  1. 双网卡绑定(推荐 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
  1. 添加额外监控脚本(检查 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 版本升级(生产环境操作规范)

  1. 升级前准备
  • 备份当前配置(/etc/keepalived/​ 目录)
  • 在测试环境验证新版本(推荐小版本升级,如 2.2.7 → 2.2.8)
  1. 升级步骤
\# 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​无 VIP1. 查看日志:grep "VRRP_Instance(VI_1)" /var/log/messages​2. 检查网卡名称是否正确(ip link show​)1. 若日志提示interface eth0 does not exist​:修改配置中interface​为实际网卡(如 ens33) 2. 若日志提示authentication failure​:确保所有节点auth_pass​一致
VIP 绑定后立即消失1. 检查是否开启vrrp_strict​2. 检查节点间网络连通性(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.sh​2. 查看 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_strict1. 若网络中断:修复交换机或网卡故障,确保 VRRP 心跳包传输 2. 若未启用vrrp_strict​:在配置中添加vrrp_strict​参数

8. 参考文档

  1. 官方文档
  1. 环境配置参考
  1. 监控集成参考

附录:配置文件快速索引

文件名路径作用
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 故障

  1. 在 Master 节点停止 Nginx 进程
systemctl stop nginx
  1. 查看 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 漂移
  1. 查看 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
  1. 验证 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

  1. 在 Master 节点重启 Nginx
systemctl start nginx
  1. 查看监控脚本日志(确认恢复正常):
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 状态正常,无需操作
  1. 查看 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)
  1. 验证 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 监控日志(排查故障用)