一、Keepalived 核心概述
1.1 什么是 Keepalived
Keepalived 是一款基于 C 语言开发的 Linux 路由软件,核心目标是为 Linux 系统及基于 Linux 的基础设施提供简单可靠的负载均衡与高可用能力,同时支持对后端服务的动态状态管理与快速故障检测,是构建弹性 IT 架构的重要工具。
其起源是为 LVS(Linux Virtual Server,Linux 虚拟服务器)负载均衡软件设计,用于管理和监控 LVS 集群节点状态,后续功能不断扩展,现已可作为 Nginx、HAProxy、MySQL 等各类主流服务的高可用解决方案,不再局限于 LVS 生态。
开源属性:遵循 GPLv2 协议,官方仅提供源码包,多数 Linux 发行版已将其收录为主线包,由各发行版维护者负责版本适配与更新。
1.2 核心功能(三大模块)
-
高可用(核心):基于 VRRP(虚拟路由冗余协议)实现,解决静态路由单点故障,通过主备节点切换确保服务不中断,核心是 VIP(虚拟 IP)的自动漂移机制。
-
负载均衡:依赖 Linux 内核 IPVS 模块,提供四层(传输层)负载均衡,支持多种调度算法,可动态维护后端服务器池,仅向健康节点转发请求。
-
健康检查:内置动态健康检查器,支持脚本检查、TCP 端口检查、HTTP/HTTPS 请求检查、ICMP ping 检查等多种方式,故障节点自动剔除,恢复后自动重新加入集群。
1.3 适用场景
-
Web 服务器集群:确保网站服务 7×24 小时不间断访问;
-
数据库高可用:配合 MySQL 主从复制,实现数据库节点故障自动切换;
-
负载均衡器高可用:为 LVS、Nginx 等负载均衡器提供故障转移能力;
-
关键业务系统:如支付网关、认证服务等对可用性要求极高的场景。
二、底层核心:VRRP 协议详解
2.1 VRRP 协议定位与核心目标
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是 Keepalived 实现高可用的底层基础,设计目标是解决"静态路由单点故障"------传统静态路由中,若唯一路由/服务节点宕机,会导致整个网络或服务中断;VRRP 将多台物理节点组成"虚拟路由组",对外呈现为统一的 VIP,客户端仅需指向 VIP,无需修改配置即可实现节点故障后的自动切换,确保业务访问的连续性与无感知性。
2.2 VRRP 核心机制
2.2.1 角色竞选机制
VRRP 组内节点通过"优先级竞选"确定角色,确保同一时间仅一个节点对外服务,避免资源冲突:
-
角色划分:组内包含 1 个主节点(Master)和多个备节点(Backup),运维中常用"一对主备"架构;
-
优先级规则:取值范围 0-255,数值越高,竞选优先级越高(默认主节点优先级 100-200,备节点低于主节点);特殊值:0 表示主动放弃主角色,255 为"IP 所有者"(若节点物理网卡配置了 VIP,默认优先级 255,直接成为主节点);
-
竞选流程:节点启动后,先比较优先级,优先级最高者成为主节点;优先级相同时,比较节点 IP 地址,IP 更大者胜出。
2.2.2 通信方式
VRRP 采用 IP 多播(Multicast)实现主备节点通信,默认多播地址为 224.0.0.18(VRRP 专用地址),所有组内节点均监听此地址,接收主节点心跳;主节点周期性发送"VRRP 通告报文",默认发送间隔为 1 秒,备节点仅被动监听,不主动发送报文,仅在主节点故障时触发操作。
2.2.3 故障接管逻辑(核心流程)
-
正常状态:主节点每秒发送 VRRP 通告报文,备节点持续接收,确认主节点存活,保持"待命状态";
-
故障触发:备节点在超时时间(默认 3 秒,即 3 个心跳周期)内未收到主节点报文,判定主节点故障;
-
接管流程:备节点立即切换为临时主节点,绑定 VIP 到自身网卡,对外提供访问,并向组内其他备节点发送通告报文,宣告自身为主节点,完成 VIP 漂移,整个过程耗时通常在 1-3 秒,客户端无感知。
2.2.4 认证方式
VRRP 支持两种认证方式,Keepalived 官方推荐明文认证:
-
明文认证(PASS):配置 1-8 位密码,报文中携带加密后的密码摘要(非明文传输),兼容性好、配置简单,适合内部可信网络;
-
AH 认证(IPsec Authentication Header):基于 IPsec 的强加密,安全性高,但配置复杂且可能影响性能,与 Keepalived"快速故障转移"目标冲突,不推荐常规场景使用。
三、Keepalived 工作原理(整体流程)
3.1 软件架构(三大守护进程)
Keepalived 采用模块化设计,运行时包含三个相互关联的守护进程,父进程负责监控子进程,确保服务稳定:
-
父进程:监控 VRRP 子进程和健康检查子进程,若子进程异常,自动重启子进程;
-
VRRP 子进程:负责 VRRP 协议实现,处理主备节点竞选、状态切换和 VIP 漂移;
-
健康检查子进程:负责对后端真实服务器(或本地服务)进行健康检查,将检查结果反馈给 VRRP 子进程,触发优先级调整或主备切换。
3.2 高可用工作流程(主备模式)
-
初始化:主节点(高优先级)和备节点(低优先级)启动 Keepalived 服务,主节点竞选成功,绑定 VIP 并对外提供服务,备节点处于待命状态;
-
心跳检测:主节点定期发送 VRRP 通告报文(默认 1 秒/次),备节点持续监听;
-
故障检测:健康检查子进程实时监控主节点服务状态(如 Nginx、MySQL),若服务故障,自动降低主节点优先级;同时备节点若超时未收到主节点心跳,判定主节点故障;
-
主备切换:备节点竞选成为新主节点,绑定 VIP,接管服务;
-
故障恢复:原主节点故障修复后,若配置了抢占模式,会重新竞选主节点并夺回 VIP;若配置非抢占模式,将作为备节点待命,避免频繁切换影响服务稳定性。
3.3 负载均衡工作流程(与 LVS 集成)
-
配置虚拟服务器(VS):在 Keepalived 配置中定义虚拟服务器,指定 VIP 和端口,关联后端真实服务器池(RS);
-
请求转发:客户端请求访问 VIP,主节点(负载均衡器)通过 IPVS 内核模块,根据预设调度算法,将请求转发至后端健康的真实服务器;
-
健康检查:健康检查子进程定期检查后端真实服务器状态,若某节点故障,自动将其从服务器池剔除,避免请求转发至故障节点;
-
动态调整:故障节点恢复后,自动重新加入服务器池,负载均衡器继续将请求转发至该节点,确保负载均匀分布。
3.4 常用负载均衡调度算法(基于 IPVS)
-
RR(Round Robin,轮询):将请求依次分配给后端节点,适用于后端节点配置一致、负载均匀的场景;
-
WRR(Weighted Round Robin,加权轮询):根据节点权重分配请求,权重越高,接收请求越多,适用于后端节点配置不一致的场景;
-
LC(Least Connections,最少连接):将请求分配给当前连接数最少的节点,适用于请求处理时间差异较大的场景;
-
WLC(Weighted Least Connections,加权最少连接):结合权重和连接数,权重高且连接数少的节点优先分配请求,兼顾配置差异和负载状态;
-
SH(Source Hashing,源地址哈希):根据客户端 IP 哈希分配节点,确保同一客户端始终访问同一节点,适用于需要会话保持的场景(如登录状态)。
四、Keepalived 安装与基础配置(Linux 环境)
4.1 环境准备
-
服务器要求:2 台或多台 Linux 服务器(建议相同 OS 版本),静态 IP 配置,处于同一网络环境(广播域内),拥有 root 或 sudo 权限;
-
依赖环境:编译安装需安装 gcc、openssl-devel、popt-devel 等依赖,LVS 负载均衡功能需安装 ipvsadm 工具;
-
防火墙配置:开放 VRRP 协议(112 端口)、多播地址 224.0.0.18,以及后端服务端口(如 80、443),避免通信被阻断。
4.2 安装方式(三种常用)
4.2.1 CentOS/RHEL 系统(yum 安装)
通过 yum 包管理器安装,需先确保 EPEL 仓库已安装,按需安装 ipvsadm 工具(负载均衡功能所需),安装后可通过对应命令验证安装结果。
4.2.2 Ubuntu/Debian 系统(apt 安装)
通过 apt 包管理器安装,先更新软件包列表,按需安装 ipvsadm 工具(负载均衡功能所需),安装后可通过对应命令验证安装结果。
4.2.3 源码编译安装(最新版本)
需先安装编译依赖,从 Keepalived 官方下载最新源码包,解压后进行编译配置、编译安装,最后创建系统服务文件,便于服务管理和开机自启。
4.3 核心配置文件详解(/etc/keepalived/keepalived.conf)
配置文件结构分为三大块:全局配置(global_defs)、VRRP 实例配置(vrrp_instance)、虚拟服务器配置(virtual_server),核心参数包括告警配置、VRRP 角色与认证、VIP 绑定、健康检查关联、后端服务器池配置等,需确保主备节点关键配置一致。
4.4 常用健康检查脚本示例
4.4.1 HTTP 服务检查脚本(check_httpd.sh)
脚本核心功能是检查 HTTP 服务健康状态,通过访问健康检查接口判断服务是否正常,若异常可尝试重启服务,再次检查失败则判定服务故障,脚本需授予可执行权限才能正常运行。
4.4.2 状态切换通知脚本(notify.sh)
脚本用于 Keepalived 节点状态切换时触发通知(如发送邮件告警),可获取状态切换类型、节点名称和目标状态,生成告警信息并推送,脚本需授予可执行权限才能正常运行。
4.5 服务管理说明
Keepalived 服务可通过系统服务命令进行启动、停止、重启、重载配置、查看状态和设置开机自启等操作;同时可通过对应命令查看 VIP 绑定情况和 LVS 负载均衡规则(如需)。
五、常见故障排查与最佳实践
5.1 常见故障及解决方案
5.1.1 Keepalived 服务无法启动
问题描述:执行 systemctl start keepalived 后服务立即停止,日志显示启动失败。
解决方案:
-
检查配置文件语法:keepalived -t -f /etc/keepalived/keepalived.conf;
-
查看系统日志:journalctl -u keepalived -f,定位错误原因;
-
确认权限问题:配置文件权限设为 644,确保 keepalived 用户有读取权限;
-
检查健康检查脚本:确保脚本有可执行权限(chmod +x),脚本退出码正确(健康返回 0,故障返回非 0),避免使用路径缺失的命令。
5.1.2 VRRP 实例状态异常(无法进入 MASTER/BACKUP 状态)
问题描述:VRRP 实例一直停留在 INIT 状态,无法完成主备竞选。
解决方案:
-
检查网络接口:ip addr show 确认网卡名与配置文件中 interface 参数一致,且网卡正常启用;
-
验证防火墙设置:确保 VRRP 协议(112 端口)、多播地址 224.0.0.18 未被阻止;
-
检查多播通信:使用 tcpdump -i eth0 proto 112 验证主节点是否发送 VRRP 报文;
-
确认主备节点 virtual_router_id 一致,优先级不同(主节点高于备节点)。
5.1.3 虚拟 IP(VIP)无法正确绑定或漂移
问题描述:Keepalived 服务运行正常,但 VIP 未绑定到指定网卡,或主节点故障后 VIP 不漂移。
解决方案:
-
检查 VIP 配置格式:确保子网掩码、网卡名正确,无 IP 地址冲突;
-
排查内核参数:检查 /proc/sys/net/ipv4/conf/all/arp_ignore 和 arp_announce,若为 1 或 2,临时修改为 0(echo 0 > 对应路径),持久化需写入 /etc/sysctl.conf;
-
云环境特殊处理:云平台(如阿里云、AWS)通常禁用 VRRP 多播,需改用 unicast_peer 模式,并开放安全组 UDP 32768--65535 端口;
-
检查主备节点认证配置:确保 auth_type 和 auth_pass 一致,避免认证失败导致状态切换异常。
5.1.4 脑裂(Split-Brain)现象
问题描述:多个节点同时声称自己是 MASTER,绑定 VIP,导致服务冲突。
解决方案:
-
配置优先级差异:确保主节点优先级明显高于备节点,避免优先级相同导致选举失败;
-
启用非抢占模式:在主节点配置 nopreempt 参数,避免主节点恢复后频繁抢占,引发脑裂;
-
优化健康检查脚本:确保脚本检测准确,避免误判主节点故障;
-
增加冗余检测:配置双网卡、多路径通信,避免单一网络故障导致主备节点无法通信。
5.1.5 健康检查脚本执行失败
问题描述:自定义健康检查脚本无法正常执行,或返回错误状态,导致节点优先级异常。
解决方案:
-
检查脚本权限:确保脚本有可执行权限(chmod +x);
-
验证脚本返回值:脚本必须显式返回 0(健康)或非 0(故障),避免依赖命令自然退出;
-
设置脚本超时时间:在 vrrp_script 配置中添加 timeout 参数,避免脚本执行时间过长阻塞服务;
-
使用绝对路径:脚本中所有命令(如 systemctl、curl)需使用绝对路径(如 /usr/bin/systemctl),避免 Keepalived 子进程 PATH 环境变量缺失导致命令无法执行。
5.2 故障排查工具与技巧
-
日志查看:journalctl -u keepalived -f(实时查看服务日志)、/var/log/messages(系统日志,包含 VRRP 相关信息);
-
调试模式:启动 Keepalived 时添加 -d 参数(ExecStart=/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf -d),打印详细调试信息;
-
网络检测:tcpdump -i any vrrp(查看 VRRP 报文)、ping 多播地址 224.0.0.18(验证多播通信);
-
状态查看:ip addr show(查看 VIP 绑定)、ipvsadm -Ln(查看 LVS 负载均衡规则)、systemctl status keepalived(查看服务状态);
-
配置验证:keepalived -t -f /etc/keepalived/keepalived.conf(验证配置文件语法)。
5.3 最佳实践
-
主备节点配置一致性:除 state(主备状态)、priority(优先级)外,其他配置(virtual_router_id、auth_pass、VIP 等)必须完全一致;
-
优先级设置:主节点优先级建议比备节点高 20 以上,避免因健康检查导致优先级交叉,引发频繁切换;
-
非抢占模式:生产环境建议启用 nopreempt 参数,尤其是后端服务会话保持要求高的场景,避免主节点恢复后频繁切换影响服务;
-
健康检查优化:检查间隔不宜过短(建议 2-5 秒),避免网络抖动导致误判;脚本需包含重试逻辑,减少临时故障导致的主备切换;
-
配置备份与版本管理:定期备份 keepalived.conf 配置文件,使用版本控制工具管理配置变更,便于故障回滚;
-
安全配置:仅开放必要端口和多播地址,健康检查脚本和配置文件权限设置为 644(配置文件)、755(脚本),避免权限泄露;
-
监控告警:结合 Prometheus、Grafana 等工具,监控 Keepalived 服务状态、VIP 绑定情况、后端节点健康状态,设置故障告警,及时发现问题。
六、总结
Keepalived 的核心价值是通过 VRRP 协议实现高可用(VIP 漂移),结合 IPVS 模块实现四层负载均衡,同时通过健康检查机制确保服务稳定性,是 Linux 环境下构建高可用集群的核心工具。
学习重点:掌握 VRRP 协议的核心机制(主备竞选、心跳检测、故障接管),理解 Keepalived 三大模块的协同工作流程,熟练配置主备高可用和负载均衡,掌握常见故障的排查方法。
实际应用中,需结合业务场景选择合适的架构(主备模式、双主模式),优化配置参数和健康检查脚本,确保服务 7×24 小时稳定运行,同时做好监控告警和配置管理,降低故障风险。