一、简介
Keepalived 是C语言编写的一个开源软件项目,其本质是一个路由软件。核心是基于VRRP协议进行二次整合实现高可用性功能,基于ipvs功能进行二次整合实现负载均衡功能。借助于大量的功能脚本实现高质量的状态检查功能。通过故障检测、自动切换保障服务不中断,同时支持多播 / 单播通信和故障告警,需通过合理配置规避脑裂风险。
简单说就是用来检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后 Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
整体来说,Keepalived 适用于那些轻量级无需数据同步需求的高可用业务场景。需要数据同步的高可用场景,一般都有自己独有的解决方案。
二、工作流程
Keepalived 部署在多台主机上(一般是两台),Keepalived 服务启动后,会加载专用的配置文件,调用内核的 LVS 服务以创建虚拟服务器,并根据配置启用对外的统一访问接口,并且基于相关插件脚本对服务进行监控。
为了保证服务对外的统一接口的高可用,VRRP 协议将物理 Router 进行统一管理,并创建一个虚拟路由地址,作为外网的统一出口,物理 Router 内部通过 VRRP 机制进行内部通信,保证虚拟路由地址永远可用。
三、VRRP(虚拟路由冗余协议)核心机制
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由 IETF 提出的解决局域网中配置静态网关出现单点故障现象的路由协议,其本质上是一种路由容错协议。
-
核心角色:同一 VRRP 组内有两个角色,主节点(Master)负责处理业务流量,备节点(Backup)处于监听状态。
-
虚拟 IP(VIP):组内所有节点共享一个虚拟 IP,作为对外提供服务的访问地址,主节点会绑定 VIP 并响应 ARP 请求。
-
选举机制:通过优先级(0-255,默认 100)选举主节点,优先级最高的节点成为 Master;若优先级相同,比较接口 IP 地址(数值大的胜出)。
-
心跳维护:Master 会周期性发送 VRRP 通告报文(默认 1 秒一次),告知备节点自身状态;备节点若超时未收到通告(默认 3 秒),则触发主备切换。
-
优先级与抢占:支持抢占模式(默认开启),当有更高优先级节点恢复时,会强制抢占 Master 角色;关闭抢占可避免频繁切换。
四、keepalived 的通信方式
1、VRRP 报文通信(核心)
-
默认通信方式:多播(用户此前关注的重点),VRRP 通告报文通过多播地址 224.0.0.18 发送(属于 IPv4 多播地址范围),目标端口 112,协议类型为 UDP。
-
报文内容:包含 VRRP 版本、组号、优先级、虚拟 IP、Master 节点真实 IP、通告间隔等信息,用于主备节点状态同步。
-
单播配置:若网络环境不支持多播(如跨网段),可配置单播通信,指定备节点的真实 IP,Master 仅向指定 IP 发送通告。
2、健康检查通信
- 检测后端 RS 时,可通过 ICMP(ping)、TCP 端口连接(如检测 80 端口)、HTTP 接口请求等方式,通信直接发生在 LVS 控制节点与 RS 之间。
五、邮件通知功能的配置原理
keepalived 支持在主备切换、节点故障时发送邮件告警,核心依赖 SMTP 协议和邮件服务器。
1、依赖组件
需系统安装 sendmail 或 postfix 邮件服务,且能访问外部 SMTP 服务器(如阿里云邮箱、QQ 邮箱)。
2、核心配置逻辑
在 keepalived 配置文件中,指定邮件发送脚本。脚本里包含 SMTP 服务器地址、端口、发件人账号 / 密码(或授权码)、收件人邮箱等信息,通过 sendemail 命令发送邮件。
配置触发条件:主备切换(state MASTER 与 state BACKUP 切换)、节点故障(健康检查失败)。
3、执行流程
当触发条件满足时,keepalived 调用系统邮件命令,通过 SMTP 服务器发送告警邮件,告知故障节点、切换状态、时间等信息。
六、脑裂现象产生原因与解决方法
脑裂是 keepalived 最常见的问题,指主备节点同时认为自己是 Master,都绑定 VIP 导致业务冲突。
1、产生原因
-
网络分区:主备节点之间的通信链路中断(如交换机故障、网线断开),备节点未收到 Master 通告,误判其故障并抢占 Master。
-
配置错误:主备节点 VRRP 组号、认证密码不一致,或优先级配置不合理(如备节点优先级高于主节点且开启抢占)。
-
资源耗尽:Master 节点 CPU、内存耗尽,无法发送 VRRP 通告,备节点触发切换。
-
防火墙拦截:主备节点之间的 VRRP 报文(多播 / 单播端口)被防火墙拦截。
2、解决方法
-
优化网络配置:确保节点之间的网络连接稳定可靠,使用高质量的网络设备和线路,减少网络故障的发生概率。如增加冗余通信链路,主备节点之间部署两条物理链路(如双网卡、双交换机),避免单链路故障导致心跳丢失。
-
合理配置 Keepalived:主节点优先级高于备节点(如主 150、备 100),恢复后自动抢占,避免双主。延长通告间隔(如 advert_int 3)和超时时间(如 vrrp_garp_interval 2),减少网络抖动导致的误切换。
-
启用脑裂保护机制:如 STONITH 机制,定期检测是否存在 "双 VIP"(通过 ping 对方节点的 VIP 或执行跨节点命令),若检测到脑裂,强制关闭或隔离部分节点,来保证集群中只有一个节点能够正常提供服务。也可以使用 fencing 设备,在检测到脑裂时对节点进行隔离或重启等操作。
-
加强监控和管理:建立完善的监控体系,对 Keepalived 集群的状态、网络连接、节点健康状况等进行实时监控。及时发现并处理可能导致脑裂的问题,例如在网络出现故障或节点状态异常时及时发出警报,以便管理员能够快速采取措施。
六、应用示例 - keepalived 在 LVS 集群中的高可用实现
LVS 负责负载均衡流量分发,keepalived 为 LVS 控制节点(Director)提供高可用,确保 LVS 不成为单点故障。
1、故障检测(健康检查)
-
节点健康检查:keepalived 定期检测本地 LVS 服务状态(如 ipvsadm 进程、端口监听),同时通过 ICMP、TCP 端口或自定义脚本,检测后端真实服务器(RS)的可用性。
-
故障判定:若本地 LVS 服务异常,或后端 RS 全部不可用,keepalived 会主动降低自身 VRRP 优先级(默认降低 20),触发主备切换;若仅部分 RS 故障,仅更新 LVS 路由表,不切换主备。
2.、自动切换流程
-
正常状态:Master 节点绑定 VIP,接收客户端请求并通过 LVS 分发至后端 RS;Backup 节点监听 VRRP 通告。
-
故障触发:Master 节点故障(如断电、网络中断、LVS 服务停止),Backup 节点超时未收到通告。
-
切换执行:Backup 节点提升为新 Master,绑定 VIP 并接管 LVS 流量分发;原 Master 恢复后,若开启抢占模式,会重新夺回 Master 角色(需优先级更高)。