linux_中级_keepalived高可用

TJCcc 发布于 2025-12-28 32 次阅读


1. 高可用 (High Availability) 概述

1.1 什么是高可用

高可用(HA)是指通过设计减少系统不能提供服务的时间。在服务器架构中,通常指两台或多台机器运行相同的业务系统,当主节点(Master)出现故障时,备节点(Backup)能快速接管服务,使用户对故障“无感知”。

1.2 常见解决方案

  • 硬件方案:F5 Big-IP(性能强,价格贵)。
  • 软件方案:Keepalived(基于 VRRP,轻量级,常用)、Heartbeat(较老)、Pacemaker(复杂)。

2. Keepalived 核心原理

2.1 VRRP 协议 (虚拟路由冗余协议)

Keepalived 的核心是 VRRP。

  • 背景:传统网络中,网关故障会导致内网断网。客户端通常无法自动切换网关 IP。
  • 机制:VRRP 将多台路由器虚拟成一个虚拟路由器,对外提供一个虚拟 IP (VIP)虚拟 MAC (VMAC)
  • 工作方式
  1. 客户端只连接 VIP。
  2. Master 节点通过组播(Multicast)定期发送心跳包(VRRP Advertisement)。
  3. Backup 节点监听心跳。如果在规定时间内(通常是 3 * advert_int + skew_time)没收到心跳,则认为 Master 挂了,并根据优先级选举出新的 Master 接管 VIP。
  4. ARP 欺骗/更新:VIP 漂移后,新 Master 会发送免费 ARP (Gratuitous ARP) 更新局域网内设备的 ARP 缓存,将 VIP 映射到自己的 MAC 地址。

2.2 【拓展】Keepalived 架构组件

Keepalived 不仅仅是 VRRP,它主要由三个模块组成:

  1. Core:负责进程启动、维护和全局配置文件的加载。
  2. VRRP Stack:实现 VRRP 协议,处理 VIP 漂移和故障切换。
  3. Checkers:负责后端真实服务器(Real Server)的健康检查(如 LVS 场景下)。在 Nginx 高可用场景中,我们通常使用 vrrp_script 自定义脚本进行应用层检查。

3. Keepalived 安装与配置

3.1 环境准备

  • Master: 10.0.0.5
  • Backup: 10.0.0.6
  • VIP: 10.0.0.3

3.2 安装

yum install -y keepalived

3.3 配置文件详解 (/etc/keepalived/keepalived.conf)

Master 配置示例:

global_defs {
    router_id lb01          # 唯一标识,通常用主机名
}

vrrp_instance VI_1 {        # 实例名称,主备必须一致
    state MASTER            # 初始角色:MASTER 或 BACKUP
    interface eth0          # 绑定 VIP 的网卡
    virtual_router_id 50    # VRID,主备必须一致 (0-255)
    priority 150            # 优先级,数值越大优先级越高
    advert_int 1            # 心跳间隔 (秒)
    authentication {        # 认证信息,主备必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {     # 虚拟 IP 列表
        10.0.0.3
    }
}

Backup 配置区别:

  • router_id: 设置为不同 ID (如 lb02)。
  • state: 设置为 BACKUP
  • priority: 设置较低的值 (如 100)。

4. 抢占模式 vs 非抢占模式

4.1 抢占模式 (Preempt) - 默认

  • 行为:当 Master 挂掉,Backup 接管 VIP。一旦 Master 恢复,由于优先级高,会立即抢回 VIP。
  • 缺点:如果 Master 网络不稳定导致频繁启停,VIP 会在两台机器间频繁漂移(Flapping),影响业务稳定性。

4.2 非抢占模式 (No-Preempt)

  • 行为:Master 挂掉,Backup 接管。即使 Master 恢复,只要 Backup 没挂,VIP 就不会漂移回去。
  • 配置要点
  1. 两台机器的 state 都必须配置为 BACKUP
  2. 两台机器都添加 nopreempt 指令。
  3. 通过 priority 区分谁是主(高优先级者优先启动获得 VIP)。

配置示例:

vrrp_instance VI_1 {
    state BACKUP
    priority 150
    nopreempt       # 开启非抢占
    ...
}

5. 脑裂 (Split Brain)

5.1 现象与原因

  • 现象:Master 和 Backup 互不相通,都认为自己是 Master,导致两台机器同时拥有 VIP。这会引起 IP 冲突,导致服务不可用。
  • 常见原因
  1. 心跳链路故障(网线松动、交换机故障)。
  2. 防火墙(iptables/firewalld)拦截了 VRRP 组播报文。
  3. 配置错误(virtual_router_id 不一致等)。

5.2 解决方案

  1. 防火墙放行:确保 VRRP 协议(IP 协议号 112)允许通过。
    bash firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
  2. 脚本检测:编写脚本,当检测到无法 ping 通对方但自己拥有 VIP 时,强制关闭自身的 Keepalived 服务(自杀机制)。

6. Nginx + Keepalived 高可用集成

6.1 为什么需要集成?

Keepalived 默认只监控网络层和系统层。如果 Nginx 进程挂了(应用层故障),但机器还在,Keepalived 不会切换 VIP,导致请求发送到死掉的 Nginx 上。

6.2 实现方案:VRRP Script

通过 vrrp_script 定义检测脚本,通过 track_script 调用。

检测脚本 (check_web.sh):

#!/bin/bash
# 检查 nginx 进程数量
nginxpid=$(ps -C nginx --no-header | wc -l)

if [ $nginxpid -eq 0 ]; then
    # 尝试重启 Nginx
    systemctl start nginx
    sleep 3
    # 再次检查
    nginxpid=$(ps -C nginx --no-header | wc -l)
    if [ $nginxpid -eq 0 ]; then
        # 重启失败,停止 keepalived,触发 VIP 转移
        systemctl stop keepalived
    fi
fi

注意:脚本需要执行权限 chmod +x check_web.sh

Keepalived 配置调用:

global_defs { ... }

# 定义脚本
vrrp_script check_web {
    script "/root/check_web.sh"
    interval 5          # 每 5 秒检测一次
    weight -20          # (可选) 失败时降低本节点优先级
    fall 2              # (可选) 连续失败 2 次才算失败
    rise 1              # (可选) 成功 1 次算恢复
}

vrrp_instance VI_1 {
    ...
    # 调用脚本
    track_script {
        check_web
    }
}

6.3 【拓展】双主模式 (Active-Active)

为了避免 Backup 资源浪费,可以配置双主模式。

  • 原理:运行两个 VRRP 实例(如 VI_1 和 VI_2)。
  • 配置
  • Node A: VI_1 Master, VI_2 Backup
  • Node B: VI_1 Backup, VI_2 Master
  • 使用两个 VIP(VIP1, VIP2)。
  • DNS 轮询:将域名解析同时指向 VIP1 和 VIP2,实现简单的负载均衡和双活高可用。

7. 常用排错命令

  • 查看日志tail -f /var/log/messages (Keepalived 日志默认在此)
  • 查看 VIPip addr show (不要用 ifconfig,可能看不到 VIP)
  • 抓包分析tcpdump -i eth0 vrrp -n (查看 VRRP 报文发送情况)
唯有极致沉淀,才能造就辉煌。
最后更新于 2025-12-28