Keepalived应用部署:实现双机热备实战

48 阅读6分钟

Keepalived 实现 Nginx 双机热备(CentOS 7 版)

基于 CentOS 7 环境,通过 Keepalived 为 Nginx 搭建高可用集群,实现 VIP 自动漂移,解决单点故障问题

一、环境说明

节点系统版本IP 地址角色网卡名称虚拟IP(VIP)
Nginx01CentOS 7 64bit192.168.200.10主节点ens33192.168.200.12
Nginx02CentOS 7 64bit192.168.200.20备节点ens33192.168.200.12

二、操作前置说明

以下标注「两台节点均执行」的步骤,需在 Nginx01 和 Nginx02 同时操作;标注「Nginx01/02 专属」的步骤,仅对应节点执行。

三、安装环境依赖(两台节点均执行)

# 安装编译依赖
yum -y install gcc gcc-c++ make libssl-devel popt-devel openssl-devel
# 安装 Nginx(若未安装)
yum -y install epel-release
yum -y install nginx

四、安装 Keepalived(两台节点均执行)

1. 下载并解压源码包

# 下载 Keepalived 2.3.4(官网源,若慢可换国内镜像)
wget https://www.keepalived.org/software/keepalived-2.3.4.tar.gz
# 解压
tar -zxvf keepalived-2.3.4.tar.gz
cd keepalived-2.3.4/

2. 编译安装

# 配置安装路径
./configure --prefix=/opt/keepalived
# 编译并安装
make && make install

3. 配置系统软链接与服务文件

# 软链 Keepalived 命令到系统路径
ln -s /opt/keepalived/sbin/keepalived /sbin/keepalived
​
# 创建配置目录并拷贝默认配置
mkdir -p /etc/keepalived
cp -rf /opt/keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
​
# 拷贝 sysconfig 配置
cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
​
# 创建 systemd 服务文件
cat > /usr/lib/systemd/system/keepalived.service <<EOF
[Unit]
Description=Keepalive Daemon (LVS and VRRP)
After=syslog.target network-online.target
Wants=network-online.target
ConditionFileNotEmpty=/etc/keepalived/keepalived.conf
​
[Service]
Type=forking
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target
EOF
​
# 重新加载 systemd 配置
systemctl daemon-reload

4. 创建 Keepalived 故障切换脚本

# 创建脚本文件
vi /opt/keepalived/down.sh

粘贴以下脚本内容:

#!/bin/bash
pkill keepalived

赋予脚本执行权限:

chmod +x /opt/keepalived/down.sh

五、编辑 Keepalived 配置文件

1. Nginx01(主节点)专属配置

# 清空原有配置
> /etc/keepalived/keepalived.conf
# 编辑配置文件
vi /etc/keepalived/keepalived.conf

粘贴以下配置:

! Configuration File for keepalived
​
global_defs {
   router_id NG_HA_MASTER  # 主节点标识,与备节点区分
}
​
vrrp_instance VI_1 {
    state MASTER            # 角色为主节点
    interface ens33         # 绑定VIP的网卡名称
    virtual_router_id 66    # 虚拟路由ID,两台节点需一致(1-255)
    priority 100            # 优先级,主节点高于备节点
    advert_int 1            # 心跳检测间隔(秒)
    
    # 单播配置(避免广播冲突)
    unicast_src_ip 192.168.200.10  # 本机IP
    unicast_peer {
        192.168.200.20              # 对端(备节点)IP
    }
​
    # 认证配置
    authentication {
        auth_type PASS      # 认证类型
        auth_pass 1111      # 认证密码,两台节点需一致
    }
​
    # 虚拟IP配置
    virtual_ipaddress {
        192.168.200.12/32    # VIP地址(/32 避免子网冲突)
    }
}
​
# 真实服务器健康检查(监控Nginx 80端口)
virtual_server 192.168.200.12 80 {
    delay_loop 2            # 检查间隔(秒)
    persistence_timeout 50  # 会话保持超时(秒)
    protocol TCP            # 协议类型
​
    real_server 192.168.200.10 80 {
        weight 3            # 权重
        notify_down /opt/keepalived/down.sh  # 节点故障时执行的脚本
        # TCP端口检查
        TCP_CHECK {
            connect_timeout 3       # 连接超时(秒)
            retry 3          # 重试次数
            delay_before_retry 3    # 重试间隔(秒)
        }
    }
}

2. Nginx02(备节点)专属配置

# 清空原有配置
> /etc/keepalived/keepalived.conf
# 编辑配置文件
vi /etc/keepalived/keepalived.conf

粘贴以下配置:

! Configuration File for keepalived
​
global_defs {
   router_id NG_HA_BACKUP   # 备节点标识,与主节点区分
}
​
vrrp_instance VI_1 {
    state BACKUP            # 角色为备节点
    interface ens33         # 绑定VIP的网卡名称
    virtual_router_id 66    # 虚拟路由ID,与主节点一致
    priority 50             # 优先级,低于主节点
    advert_int 1            # 心跳检测间隔(秒)
    
    # 单播配置
    unicast_src_ip 192.168.200.20  # 本机IP
    unicast_peer {
        192.168.200.10              # 对端(主节点)IP
    }
​
    # 认证配置(与主节点一致)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
​
    # 虚拟IP配置(与主节点一致)
    virtual_ipaddress {
        192.168.200.12/32
    }
}
​
# 真实服务器健康检查
virtual_server 192.168.200.12 80 {
    delay_loop 2
    persistence_timeout 50
    protocol TCP
​
    real_server 192.168.200.20 80 {
        weight 3
        notify_down /opt/keepalived/down.sh
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

六、启动服务并设置开机自启(两台节点均执行)

# 启动 Nginx
systemctl start nginx
systemctl enable nginx
​
# 启动 Keepalived
systemctl start keepalived
systemctl enable keepalived
​
# 验证服务状态
systemctl status keepalived
systemctl status nginx

七、验证 VIP 绑定(两台节点均执行)

ip a

预期输出(Nginx01 主节点)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
    link/ether 00:0c:29:61:29:f3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.10/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.12/32 scope global ens33  # VIP 绑定在主节点
       valid_lft forever preferred_lft forever

预期输出(Nginx02 备节点)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
    link/ether 00:0c:29:25:4e:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.21/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
# 备节点初始无 VIP

八、验证 VIP 漂移功能

1. 停止 Nginx01 主节点的 Nginx 服务

# 在 Nginx01 执行
pkill nginx
# 或 systemctl stop nginx

2. 查看 VIP 漂移结果

在 Nginx02 备节点执行 ip a,预期输出:

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
    link/ether 00:0c:29:25:4e:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.21/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.12/32 scope global ens33  # VIP 漂移到备节点
       valid_lft forever preferred_lft forever

3. 恢复主节点 Nginx 服务(可选)

# 在 Nginx01 执行
systemctl start nginx
systemctl restart keepalived

执行后 VIP 会重新漂移回 Nginx01 主节点。

九、关键配置说明

配置项作用说明
router_id节点唯一标识,主备节点需不同,仅用于日志区分
state MASTER/BACKUP节点角色标识,实际优先级(priority)决定 VIP 归属
virtual_router_id虚拟路由组 ID,主备节点必须一致,否则无法组成高可用组
priority节点优先级,数值越高优先级越高,主节点需高于备节点
unicast_peer单播心跳配置,替代广播模式,避免防火墙拦截 VRRP 报文
notify_down节点故障时执行的脚本,触发 VIP 漂移
TCP_CHECK端口健康检查,确保 Nginx 服务正常运行才会持有 VIP

十、常见问题排查

1. VIP 无法绑定

  • 检查网卡名称:执行 ip link show 确认网卡为 ens33

  • 关闭防火墙/SELinux:

    systemctl stop firewalld && systemctl disable firewalld
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
  • 检查 virtual_router_id 是否冲突:更换未被使用的 ID(如 67)。

2. VIP 漂移不生效

  • 检查脚本权限:确保 /opt/keepalived/down.sh 有执行权限(chmod +x);

  • 查看 Keepalived 日志:

    journalctl -u keepalived -f
    
  • 验证 Nginx 端口:执行 telnet 192.168.200.10 80 确认端口可通。

3. Keepalived 启动失败

  • 检查配置文件语法:

    keepalived -t -f /etc/keepalived/keepalived.conf
    
  • 检查依赖是否安装完整:重新执行 yum -y install gcc libssl-devel popt-devel