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

相关推荐
用户03284722207013 小时前
如何搭建本地yum源(上)
运维
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦4 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj4 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes