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 依靠三大核心模块协同运作,共同完成高可用功能:
- VRRP 协议栈:负责主备选举、心跳通信以及 VIP 的绑定与迁移,是实现 IP 冗余的基础模块。
- 健康检查模块(Checkers):不仅检测主机是否存活,还能深入探测后端实际服务(如 Nginx、MySQL 等)的运行状态。一旦发现服务异常,可动态降低当前节点优先级,促使主备切换。
- 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_defsvrrp_instancevirtual_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 # 重试前等待的时间间隔(秒)
}
}


雷达卡


京公网安备 11010802022788号







