Keepalived 高可用VRRP笔记

笔记说明:本文档旨在系统性地梳理Keepalived的核心概念、底层VRRP协议、安装配置方法,并提供从基础虚拟路由到LVS集成的多阶段实验步骤,作为学习和配置Keepalived实现高可用的参考手册。

一、理论基础与概述

1.1 高可用核心目标

Keepalived的核心目标是解决单点故障(SPoF) 问题,通过冗余机制保障服务持续可用。

  • 可用性指标(SLA)

    • 公式可用性 A = MTBF / (MTBF + MTTR)

      • MTBF (平均无故障时间):追求更长。

      • MTTR (平均故障恢复时间):追求更短,是高可用设计的核心。

    • 常见标准

      可用性级别 月停机时间 年停机时间
      99.9% 43.2 分钟 8.76 小时
      99.99% 4.32 分钟 52.56 分钟
      99.999% 25.92 秒 5.26 分钟
1.2 VRRP(虚拟路由冗余协议)

VRRP是Keepalived的底层核心协议,用于将多台路由器(或服务器)虚拟成一个,避免网关单点故障。

  • 关键术语

    • VRID:虚拟路由器ID,同一组高可用节点中的VRID必须一致。

    • VIP(虚拟IP):对外提供服务的IP,是故障时在节点间漂移的核心对象。

    • Master/Backup:主/备节点,角色由优先级决定。

    • Priority(优先级):范围1-254,值越高越可能成为Master。

  • 工作模式

    • 抢占式(默认):优先级更高的Master恢复后,会重新抢占VIP。

    • 非抢占式:即使原Master恢复,也不主动抢占,由当前Master继续服务。

1.3 Keepalived核心架构
  • 是什么:VRRP协议的开源实现,原生为LVS(IPVS)设计,现已扩展支持Nginx、HAProxy等任意服务的高可用。

  • 核心功能

    1. VIP管理:基于VRRP实现VIP的自动漂移。

    2. LVS集成:自动为IPVS集群生成规则并做健康检查。

    3. 服务监测:通过外部脚本监测任意第三方服务。

    4. 故障通知:触发邮件或自定义脚本。

1.4 安装与配置概览
  • 安装dnf install keepalived -y

  • 主配置文件/etc/keepalived/keepalived.conf

  • 核心配置段

    • global_defs:全局设置(如邮件通知、router_id)。

    • vrrp_instance:VRRP实例定义,是配置VIP、角色、认证的核心。

    • virtual_server:LVS配置段(可选)。

  • 关键参数说明

    • vrrp_strict:严格遵守VRRP协议,生产环境通常注释掉,否则可能导致无法ping通VIP或单播模式失败。

    • vrrp_mcast_group4:VRRP组播地址,默认224.0.0.18

二、基础环境搭建

2.1 实验环境规划
  • Web服务器

    • rs1 (172.25.254.10): 提供Web服务,首页标识 "RS1 - 172.25.254.10"

    • rs2 (172.25.254.20): 提供Web服务,首页标识 "RS2 - 172.25.254.20"

  • Keepalived节点

    • KA1 (172.25.254.50)

    • KA2 (172.25.254.60)

  • 虚拟IP(VIP)

    • 172.25.254.100(用于Web服务)

    • 172.25.254.200(用于后续DB实验)

2.2 基础配置步骤
  1. 配置主机名与IP(所有节点)

    复制代码
    # 示例:在 rs1 上
    vmset.sh eth0 172.25.254.10 rs1
    dnf install httpd -y
    echo "RS1 - 172.25.254.10" > /var/www/html/index.html
    systemctl enable --now httpd
  2. 配置本地解析(在KA1操作,并同步)

    复制代码
    vim /etc/hosts
    # 添加以下内容
    172.25.254.50 KA1
    172.25.254.60 KA2
    172.25.254.10 rs1
    172.25.254.20 rs2
    # 同步到其他节点
    for i in 60 10 20; do scp /etc/hosts 172.25.254.$i:/etc/hosts; done
  3. 配置时间同步(以KA1为服务器)

    • KA1上配置Chrony允许同步并重启服务。

    • KA2 上配置指向KA1 (pool 172.25.254.50 iburst),并用chronyc sources -v验证。

三、基础虚拟路由配置

3.1 安装与主节点(KA1)配置
  1. 安装Keepalived(KA1和KA2)

    复制代码
    dnf install keepalived.x86_64 -y
  2. 配置KA1为Master

    复制代码
    vim /etc/keepalived/keepalived.conf

    keepalived

    复制代码
    global_defs {
        notification_email {
            yunlei713@qq.com
        }
        notification_email_from yunlei713@qq.com
        smtp_server 127.0.0.1
        smtp_connect_timeout 30
        router_id KA1
        vrrp_skip_check_adv_addr
        # vrrp_strict  # 生产环境通常注释掉
        vrrp_garp_interval 1
        vrrp_gna_interval 1
        vrrp_mcast_group4 224.0.0.44
    }
    
    vrrp_instance WEB_VIP {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.100/24 dev eth0 label eth0:0
        }
    }

    bash

    复制代码
    systemctl enable --now keepalived
3.2 配置备节点(KA2)与验证
  1. 配置KA2为Backup

    keepalived

    复制代码
    global_defs {
        ... # 类似KA1,router_id建议改为KA2
    }
    vrrp_instance WEB_VIP {
        state BACKUP      # 角色为BACKUP
        interface eth0
        virtual_router_id 51
        priority 80       # 优先级低于Master
        ...               # 其他认证、IP等配置与Master一致
    }
    复制代码
    systemctl enable --now keepalived
  2. 验证高可用

    • 查看VIP :在KA1上执行 ifconfig eth0:0 应看到VIP;在KA2上应看不到。

    • 抓包观察tcpdump -i eth0 -nn host 224.0.0.44 可看到Master定期发送的VRRP通告。

    • 模拟故障 :停止KA1的Keepalived服务 (systemctl stop keepalived),稍后在KA2上执行 ifconfig eth0:0,应看到VIP已漂移至KA2。

3.3 日志分离配置

将Keepalived日志从系统日志中独立出来,便于排查。

  1. 修改启动参数

    复制代码
    vim /etc/sysconfig/keepalived
    KEEPALIVED_OPTIONS="-D -S 6"   # 指定日志设备为 local6
  2. 配置rsyslog

    复制代码
    vim /etc/rsyslog.conf
    # 添加一行
    local6.*    /var/log/keepalived.log
    systemctl restart rsyslog keepalived
  3. 验证

    复制代码
    tail -f /var/log/keepalived.log   # 实时查看独立日志

四、核心功能进阶实验

4.1 抢占模式配置
  • 非抢占模式 (nopreempt):避免因主节点恢复导致不必要的VIP切换。

    • 要求 :实例中的 state 必须设置为 BACKUP

    • 配置 :在KA1和KA2的 vrrp_instance 中添加 nopreempt

    • 效果:原Master(KA1)恢复后,VIP不会自动从当前Master(KA2)漂移回来。

  • 延迟抢占 (preempt_delay):设置Master恢复后延迟多久才抢占VIP。

    • 配置 :在实例中添加 preempt_delay 10(单位:秒),通常与 state BACKUP 配合使用。
4.2 子配置文件拆分

将不同的 vrrp_instance 拆分到独立的配置文件中,便于管理。

  1. 创建子目录和配置文件

    复制代码
    mkdir /etc/keepalived/conf.d
    vim /etc/keepalived/conf.d/webvip.conf
    # 将 WEB_VIP 实例的完整配置移入此文件
  2. 修改主配置文件

    keepalived

    复制代码
    global_defs { ... }  # 全局定义保留在主文件
    include /etc/keepalived/conf.d/*.conf  # 引入子配置
4.3 单播模式配置

当网络环境不支持组播,或需要跨网段通信时,可使用单播。

  • 配置 :在 vrrp_instance 中指定 unicast_src_ip(本机IP)和 unicast_peer(对端IP列表),并注释掉组播地址配置。

    keepalived

    复制代码
    vrrp_instance WEB_VIP {
        ...
        unicast_src_ip 172.25.254.50  # KA1的本机IP
        unicast_peer {
            172.25.254.60              # 对端KA2的IP
        }
        # vrrp_mcast_group4 224.0.0.44 # 注释掉组播
    }
  • 验证 :重启服务后,可用 tcpdump -i eth0 -nn host 172.25.254.50 抓包,查看单播VRRP通信。

4.4 业务VIP迁移告警(邮件通知)

当角色发生切换时,通过邮件发送告警。

  1. 配置邮件客户端 (以s-nail和163邮箱为例)

    复制代码
    dnf install s-nail postfix -y
    vim /etc/mail.rc
    # 添加以下配置
    set from=yourname@163.com smtp=smtp.163.com
    set smtp-auth-user=yourname@163.com smtp-auth-password=your-password smtp-auth=login
  2. 编写告警脚本 (/etc/keepalived/warning.sh)

    复制代码
    #!/bin/bash
    VIP="172.25.254.100"
    EMAIL="admin@example.com"
    case $1 in
        master)
            echo "`date`: I am master, VIP $VIP" | mail -s "Keepalived Master" $EMAIL
            ;;
        backup)
            echo "`date`: I am backup, VIP $VIP" | mail -s "Keepalived Backup" $EMAIL
            ;;
        fault)
            echo "`date`: Keepalived fault!" | mail -s "Keepalived Fault" $EMAIL
            ;;
    esac
    chmod +x /etc/keepalived/warning.sh
  3. 集成到Keepalived配置

    keepalived

    复制代码
    vrrp_instance WEB_VIP {
        ...
        notify_master "/etc/keepalived/warning.sh master"
        notify_backup "/etc/keepalived/warning.sh backup"
        notify_fault "/etc/keepalived/warning.sh fault"
    }

五、高可用架构实验

5.1 双主模式

两台节点互为主备,各自承担一个VIP,提高资源利用率。

  • KA1配置WEB_VIPMASTER(优先级100),DB_VIPBACKUP(优先级80)。

  • KA2配置WEB_VIPBACKUP(优先级80),DB_VIPMASTER(优先级100)。

  • 验证

    • 正常情况下,KA1持有172.25.254.100,KA2持有172.25.254.200

    • 停止任一节点,另一节点将同时接管两个VIP。

5.2 LVS+Keepalived 实现IPVS高可用

这是Keepalived最经典的应用场景,它不仅能管理VIP,还能根据RS的健康状态动态调整LVS规则。

  1. 配置真实服务器(RS)

    • 在RS1和RS2的lo接口绑定VIP172.25.254.100/32),用于接收DR模式的请求。

    • 配置ARP抑制,避免RS直接响应客户端的ARP请求。

      bash

      复制代码
      echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
      echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  2. 配置Keepalived集成LVS(在KA1/KA2上)

    • keepalived.conf 中定义 virtual_server 段,Keepalived会自动生成对应的IPVS规则,并对RS进行健康检查。

    • 核心配置示例

      keepalived

      复制代码
      virtual_server 172.25.254.100 80 {
          delay_loop 3
          lb_algo rr
          lb_kind DR
          protocol TCP
          real_server 172.25.254.10 80 {
              weight 1
              TCP_CHECK {
                  connect_port 80
                  connect_timeout 3
              }
          }
          real_server 172.25.254.20 80 {
              weight 1
              TCP_CHECK {
                  connect_port 80
                  connect_timeout 3
              }
          }
      }

总结

Keepalived通过实现VRRP协议,为关键业务提供了强大的高可用保障。其核心在于管理VIP的漂移 ,并可与LVS深度集成,实现对负载均衡器本身及其后端服务器的健康检查。掌握其抢占模式、单播通信、通知脚本以及双主架构,是构建稳健高可用方案的基础。

相关推荐
21号 12 小时前
Http粘包问题回顾
网络·网络协议·http
茶乡浪子2 小时前
实战H3C单环RRPP应用配置
运维·服务器·网络
吧啦蹦吧2 小时前
http-SNI
网络·网络协议·http
上海云盾-高防顾问2 小时前
企业如何构建全面的高防IP防护体系?
网络·网络协议·tcp/ip
屎到临头想搅便2 小时前
LVS负载均衡
网络·lvs
智能修复8 小时前
无法访问共享文件夹/打印机?深度解析“0x80070035”错误代码:网络凭证、防火墙与工作组设置的终极修复指南
网络·错误代码
zl_dfq12 小时前
Linux 之 【网络套接字编程】(固定宽度整数类型、socket常见API、netstat)
linux·网络
国科安芯15 小时前
医疗成像设备系统电源芯片国产替代可行性研究
网络·单片机·嵌入式硬件·fpga开发·硬件架构
枷锁—sha15 小时前
【CTFshow-pwn系列】03_栈溢出【pwn 053】详解:逐字节爆破!手写 Canary 的终极破解
网络·笔记·安全·网络安全