全部版块 我的主页
论坛 数据科学与人工智能 IT基础 Linux操作系统
152 0
2025-11-24

Keepalived 工作原理详解

Keepalived 是构建服务器高可用(HA)架构的核心组件,基于 VRRP 协议实现故障自动切换,并通过健康检查机制确保服务持续可用。其设计初衷是解决传统静态路由存在的单点故障问题,能够在个别节点发生宕机时,保障整个网络服务不中断运行。

一、核心工作原理

Keepalived 的高可用能力依赖于两大关键技术:

  • VRRP 协议:负责虚拟 IP(VIP)的漂移,实现主备节点间的无缝切换;
  • 健康检查机制:实时监控后端服务状态,确保只有健康节点对外提供服务。

这两者协同工作,构成了完整的高可用解决方案。

VRRP 协议工作机制

VRRP(Virtual Router Redundancy Protocol)是 Keepalived 实现 IP 冗余的核心协议。它将多台物理服务器虚拟成一个逻辑上的“虚拟路由器”,对外暴露统一的虚拟 IP 地址(VIP),从而避免因单一节点故障导致服务中断。

角色与优先级机制

在 VRRP 架构中,节点分为两类:Master(主节点)Backup(备节点)。正常情况下由 Master 节点承载业务流量,Backup 节点处于监听状态。节点之间的主备关系通过优先级(取值范围 0–255)决定,优先级最高者成为 Master。当主节点失效时,优先级次高的 Backup 节点立即接管 VIP,实现服务恢复。

心跳检测与故障切换

Master 节点会周期性地发送组播心跳报文(默认每秒一次)。Backup 节点若连续 3 秒未收到心跳,则判定 Master 故障,随即触发 VIP 绑定到本地网卡的操作——即“IP 漂移”。该过程对客户端透明,无需重新配置网络连接。

KP 核心组件架构

Keepalived 依靠三大核心模块协同运作,共同完成高可用功能:

  1. VRRP 协议栈:负责主备选举、心跳通信以及 VIP 的绑定与迁移,是实现 IP 冗余的基础模块。
  2. 健康检查模块(Checkers):不仅检测主机是否存活,还能深入探测后端实际服务(如 Nginx、MySQL 等)的运行状态。一旦发现服务异常,可动态降低当前节点优先级,促使主备切换。
  3. IPVS 封装模块:集成 Linux 内核的 IPVS 功能,用于管理负载均衡规则和请求分发策略,结合 VRRP 可实现负载均衡器自身的高可用。
工作机制补充说明
  • 起源与目标:VRRP 最初用于解决网关单点故障,Keepalived 将其扩展至服务器层面,实现服务 IP 的冗余与高可用。
  • 主备竞选机制:所有节点根据预设优先级参与竞选,优先级最高者当选 Master;故障发生时,Backup 自动升级为主节点。
  • 通信方式:使用组播地址 224.0.0.18:112 发送 VRRP 报文,在保证同步效率的同时控制资源消耗。
  • 节点配置建议:虽然协议支持多个 Backup 节点,但生产环境中通常采用“一主一备”模式,以减少选举复杂度和潜在冲突。
  • 认证机制选择:VRRP 支持加密认证,但 Keepalived 官方推荐使用明文 PASS 认证方式,兼顾性能与运维便利性。

二、安装与配置参数详解

安装步骤

在两台待部署的节点上执行以下命令进行安装:

# 安装 Keepalived 及相关依赖
yum -y install keepalived libnl3-devel ipset-devel -v

# 启动服务并设置开机自启
systemctl enable --now keepalived

# 查看服务运行状态
systemctl status keepalived
/etc/keepalived/keepalived.conf

2.1 配置文件结构解析

Keepalived 的主要配置文件包含三个关键区块:

  • global_defs:全局配置
  • vrrp_instance:VRRP 实例配置
  • virtual_server:虚拟服务配置
global_defs

vrrp_instance

virtual_server
2.3.1 global_defs 全局配置说明

该部分定义了 Keepalived 的全局性参数,包括通知机制、节点标识、VRRP 默认行为等。

global_defs {
    # 邮件告警接收列表
    notification_email {
        acassen@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from admin@example.com  # 告警发送邮箱
    smtp_server 192.168.200.1                # SMTP 服务器地址
    smtp_connect_timeout 30                  # 连接超时时间(秒)

    # 节点及 VRRP 基础设置
    router_id LVS_DEVEL                      # 当前节点唯一标识(集群内应不同)
    vrrp_skip_check_adv_addr                 # 跳过 VRRP 通告地址检查,提升效率
    vrrp_strict                              # 启用严格模式,遵循标准协议规范
    vrrp_garp_interval 0                     # ARP 报文发送间隔(0 表示默认)
    vrrp_gna_interval 0                      # 免费 ARP 发送间隔(支持毫秒级)
}

# 全局生效的组播地址设置
vrrp_mcast_group4 224.0.0.18               # IPv4 组播地址(需集群一致)
vrrp_mcast_group6 ff02::12                 # IPv6 组播地址

# 进程调度优化
vrrp_priority 10                           # 设置 VRRP 进程调度优先级(-20~19)

以上配置项可根据实际环境调整,例如关闭邮件通知或修改组播地址以适应特定网络策略。

2.3.2 VRRPD核心子模块配置

VRRP守护进程(VRRPD)的配置主要涵盖两个关键部分:健康检查脚本实例同步组,分别用于实现服务状态监测和多个VRRP实例之间的联动控制。

vrrp_script

vrrp_script 健康检查脚本配置说明

vrrp_script <SCRIPT_NAME> {  
    script "/path/to/script.sh"  
    interval 1                   
    timeout 3                    
    weight -20                   
    rise 2                       
    fall 3                       
    user root root               
    init_fail                    
}
  • script:指定健康检查脚本的绝对路径。
  • interval:脚本执行频率,单位为秒,默认值为1秒。
  • timeout:脚本运行超时时间,若超过该时间则判定为失败。
  • weight:优先级调整权重。当脚本成功执行(返回码为0)且weight > 0时,节点优先级上升;若执行失败(非0返回码)且weight < 0,则优先级下降;其余情况优先级保持不变。
  • rise / fall:连续成功或失败次数阈值,达到后触发状态变更。
  • user:定义脚本运行所使用的用户和组权限。
  • init_fail:设置初始状态为“失败”,需手动干预恢复。
vrrp_sync_group

vrrp_sync_group 实例同步组配置

通过同步组可将多个VRRP实例绑定为一个逻辑单元,确保主备切换时所有关联实例同步动作。

vrrp_sync_group VG_1 {
    group {
        VI_1  
        VI_2  
    }
}
  • VG_1:自定义的同步组名称。
  • group块中列出需要同步管理的VRRP实例名,必须与vrrp_instance中定义的名称完全一致。

2.3.3 vrrp_instance VRRP实例配置详解

此部分定义单个VRRP集群的基本参数,是实现IP地址漂移功能的核心配置项,包含角色设定、虚拟IP、认证机制等。

vrrp_instance VI_1 {
    state MASTER              
    interface eth0            
    virtual_router_id 51      
    priority 150              
    advert_int 1              

    authentication {
        auth_type PASS        
        auth_pass 1111        
    }

    virtual_ipaddress {
        192.168.1.200/24      
        192.168.1.201/24      
    }

    nopreempt                 
    preempt_delay 5           

    track_script {
        check_nginx           
    }

    notify_master /opt/to_master.sh  
    notify_backup /opt/to_backup.sh  
    smtp_alert                
}
  • state:节点初始角色,MASTER表示为主节点,BACKUP为备用节点。
  • interface:绑定虚拟IP的网络接口,可通过ip addr命令查看可用网卡。
  • virtual_router_id:标识同一个VRRP组的唯一ID,范围0~255,组内所有节点必须一致。
  • priority:节点优先级,决定主备选举结果,MASTER应高于BACKUP(0~255)。
  • advert_int:心跳报文发送间隔,单位为秒,默认为1秒。
  • authentication:认证配置,推荐使用PASS明文方式,密码最长8位。
  • virtual_ipaddress:配置一个或多个虚拟IP地址,作为对外提供服务的统一入口。
  • nopreempt:启用非抢占模式,仅在BACKUP状态下有效。
  • preempt_delay:抢占延迟时间,避免频繁切换。
  • track_script:关联之前定义的健康检查脚本,实现服务状态联动。
  • notify_master / notify_backup:状态切换时执行的外部脚本,可用于通知或配置更新。
  • smtp_alert:开启邮件告警功能,状态变化时发送提醒。

2.3.4 virtual_server 虚拟服务配置

该模块集成LVS负载均衡能力,用于定义虚拟服务的IP地址、端口以及后端真实服务器(RS)的相关设置。

virtual_server 192.168.1.200 80 {
    delay_loop 6              
    lb_algo rr                
  • virtual_server:指定虚拟服务的VIP及端口号。
  • delay_loop:健康检查周期,单位为秒。
  • lb_algo:负载均衡调度算法,常见选项包括rr(轮询)、wrr(加权轮询)、lc(最小连接)、wlc(加权最小连接)等。

lb_kind DR # 转发模式(推荐使用DR模式,也可选NAT或TUN)

persistence_timeout 50 # 设置会话保持时长,单位为秒,HTTP服务通常设为50秒

protocol TCP # 指定协议类型,支持TCP、UDP和SCTP,此处使用TCP

# 配置后端真实服务器信息

real_server 192.168.1.100 80 {

weight 1 # 定义权重值,数值越大转发优先级越高,缺省为1

inhibit_on_failure # 当服务器检测失败时,将其权重置为0,而不是从集群中移除

notify_up /opt/rs_up.sh # 在服务器恢复正常后执行指定脚本

notify_down /opt/rs_down.sh # 当服务器故障时触发的脚本执行

# 健康检查策略配置(三选一:HTTP_GET、SSL_GET 或 TCP_CHECK)

HTTP_GET {

url {

path /index.html # 设定健康检查请求的URL路径

digest e93e7f6c # 页面内容摘要值,可通过genhash工具生成

status_code 200 # 期望返回的状态码,如200表示服务正常

}

connect_timeout 3 # 连接超时时间,单位为秒

nb_get_retry 3 # 请求失败后的重试次数

delay_before_retry 3 # 每次重试之间的间隔时间(秒)

}

}

# 备用服务器配置:当所有真实服务器均不可用时启用

sorry_server 192.168.1.250 80

sorry_server_inhibit # 启用备用服务器的故障抑制机制,避免其被误判为失效

/etc/keepalived/keepalived.conf

real_server 健康检查方式说明

HTTP_GET / SSL_GET
适用于Web类服务,通过发送HTTP/HTTPS请求并验证响应来判断服务状态。其中SSL_GET用于加密的HTTPS服务检测,需确保能正确获取指定页面的内容与状态码。

TCP_CHECK
适用于任意基于TCP的服务,仅检测目标IP和端口是否可连接,不涉及应用层内容。其参数结构与HTTP_GET相似,但不包含URL、digest等应用层相关配置。

# 示例:TCP_CHECK 的实际配置

real_server 192.168.1.101 80 {

weight 1

TCP_CHECK {

connect_ip 192.168.1.101 # 指定进行连通性检测的IP地址,默认为RS自身IP

connect_port 80 # 检测的目标端口,默认与RS端口一致

connect_timeout 3 # 连接超时时间(秒)

retry 3 # 最大重试次数

delay_before_retry 3 # 重试前等待的时间间隔(秒)

}

}

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群