Keepalived高可用与负载均衡

一、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 故障接管逻辑(核心流程)

  1. 正常状态:主节点每秒发送 VRRP 通告报文,备节点持续接收,确认主节点存活,保持"待命状态";

  2. 故障触发:备节点在超时时间(默认 3 秒,即 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 高可用工作流程(主备模式)

  1. 初始化:主节点(高优先级)和备节点(低优先级)启动 Keepalived 服务,主节点竞选成功,绑定 VIP 并对外提供服务,备节点处于待命状态;

  2. 心跳检测:主节点定期发送 VRRP 通告报文(默认 1 秒/次),备节点持续监听;

  3. 故障检测:健康检查子进程实时监控主节点服务状态(如 Nginx、MySQL),若服务故障,自动降低主节点优先级;同时备节点若超时未收到主节点心跳,判定主节点故障;

  4. 主备切换:备节点竞选成为新主节点,绑定 VIP,接管服务;

  5. 故障恢复:原主节点故障修复后,若配置了抢占模式,会重新竞选主节点并夺回 VIP;若配置非抢占模式,将作为备节点待命,避免频繁切换影响服务稳定性。

3.3 负载均衡工作流程(与 LVS 集成)

  1. 配置虚拟服务器(VS):在 Keepalived 配置中定义虚拟服务器,指定 VIP 和端口,关联后端真实服务器池(RS);

  2. 请求转发:客户端请求访问 VIP,主节点(负载均衡器)通过 IPVS 内核模块,根据预设调度算法,将请求转发至后端健康的真实服务器;

  3. 健康检查:健康检查子进程定期检查后端真实服务器状态,若某节点故障,自动将其从服务器池剔除,避免请求转发至故障节点;

  4. 动态调整:故障节点恢复后,自动重新加入服务器池,负载均衡器继续将请求转发至该节点,确保负载均匀分布。

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 小时稳定运行,同时做好监控告警和配置管理,降低故障风险。

相关推荐
Fanfanaas2 小时前
Linux 系统编程 进程篇(一)
linux·运维·服务器·c语言·开发语言·网络·学习
念恒123062 小时前
ROS2入门
linux·运维·服务器
东北甜妹2 小时前
REdis Sentinel 哨兵集群
运维
小糖学代码2 小时前
LLM系列:1.python入门:6.元组型对象(tuple)
linux·运维·服务器·python
晴天¥2 小时前
使用Openfiler为达梦数据库集群搭建共享存储
运维·服务器·存储
小宋0013 小时前
ROS2 安装指南(Ubuntu 22.04+Humble)
linux·运维·ubuntu
爱学习的小囧3 小时前
VMFS与NFS性能对比(含场景适配+实操建议)
运维·数据库·自动化·esxi·虚拟化
Agent产品评测局3 小时前
企业邮件处理自动化落地,分类回复全流程实现方法 —— 2026企业级智能体选型与落地全景指南丨Agent产品测评局
运维·人工智能·ai·chatgpt·自动化
升职佳兴3 小时前
重启 Docker 导致 VMware 虚拟机断网:一次完整的故障排查记录
运维·docker·容器