keepalived
1. HA集群的适用性与局限性
- HA集群能解决的问题:适用于本身不具备故障转移或负载均衡能力的服务(如Nginx、RabbitMQ、Galera),通过集群可显著提升可用性。
- HA集群无法解决的问题 :
- 应用程序自身bug导致的崩溃(故障转移后仍可能崩溃)。
- 网络架构单点故障(如交换机、路由器故障)导致集群不可达。
- 不适合HA集群的服务:DNS、LDAP等自带多节点冗余和客户端自动切换能力的服务,放入HA集群收益不大。
2. Keepalived 简介
- 定位 :高可用(HA)软件,本身不提供完整负载均衡;常和 LVS 搭配实现「负载均衡 + 高可用」,为Linux系统提供负载均衡 和高可用 能力。高可用通过VRRP协议实现,而负载均衡一般是由LVS实现。
- 核心功能 :
- 服务状态检测:基于TCP/IP第3、4、5层机制检测后端服务器节点状态,自动剔除异常节点。
- 高可用(HA) :通过集成 VRRP协议,实现虚拟IP(VIP)在主备节点间漂移,解决网关单点故障。
3. VRRP(虚拟路由冗余协议)原理
- 解决的问题:静态网关单点故障导致网络中断。
- 核心机制 :
- 将多台物理路由器组成一个 VRRP组 ,共享一个 VRID ,对外呈现为一台虚拟路由器。
- 虚拟路由器拥有一个虚拟IP(VIP) ,同一时刻仅由一台 Master路由器 持有并响应请求。
- 其他节点为 Backup,监控Master状态,Master故障时自动接替VIP。
- 关键术语 :
- VRRP路由器:运行VRRP协议的设备(如R1、R2)。
- VRID:VRRP组标识符,同一组内所有节点必须一致。
4. 脑裂(Split-Brain)问题
- 定义:主备节点因通信中断,各自认为对方故障,同时争抢VIP,导致集群状态混乱。
- 产生原因 :核心是节点之间的心跳检测失败,导致节点虽然正常运行但开始争抢资源。
- 心跳网络故障(网线、交换机、延迟过高)。
- 防火墙阻断VRRP协议(UDP 112端口)。
- 节点资源耗尽(CPU/内存满载)无法响应心跳。
- 配置参数不一致(如
state、priority、authentication)。
- 危害 :
- 双节点同时持有VIP,客户端请求混乱。
- 数据库、存储等资源可能发生双写冲突,引发数据不一致。
- 集群失去高可用意义,甚至服务崩溃。
5. 脑裂预防与应对策略
| 策略 | 具体措施 |
|---|---|
| 增加心跳检测线路 | 配置多个网络接口(如eth0、eth1)作为心跳链路,避免单线路故障。 |
| VRRP认证 | 配置auth_type PASS和auth_pass,确保节点间通信合法可靠。 |
| 防火墙放行 | 开放UDP 112端口:firewall-cmd --add-protocol=vrrp --permanent |
| 第三方隔离(Fence) | 通过notify_master脚本检测到脑裂时,强制关闭或重启异常节点。 |
| 业务层设计 | 数据库采用主从复制+读写分离,存储使用分布式锁(如Redis)避免双写。 |
| 监控告警 | 使用Zabbix、Prometheus监控Keepalived状态,检测到双主时立即告警。 |
6. 部署实践(Nginx + Keepalived)
环境拓扑(示例)
| 主机名 | IP地址 | 角色 |
|---|---|---|
| web1.hgq.cloud | 10.1.8.11 | 主节点(MASTER) |
| web2.hgq.cloud | 10.1.8.12 | 备节点(BACKUP) |
| client1.hgq.cloud | 10.1.8.21 | 客户端 |
后端Nginx部署(web1/web2)
bash
yum install -y nginx
echo "welcome to $(hostname)" > /usr/share/nginx/html/index.html
systemctl enable nginx --now
Keepalived 配置(关键参数说明)
router_id:节点唯一标识(如web1/web2)。state:节点角色(MASTER/BACKUP)。interface:VIP绑定网卡(如ens33)。virtual_router_id:VRRP组ID(同一组必须一致)。priority:优先级(MASTER需高于BACKUP)。authentication:认证密码(不超过8位)。virtual_ipaddress:VIP地址(如10.1.8.100/24)。
高可用验证
- 启动主节点Keepalived,VIP自动绑定至web1。
- 客户端通过VIP(10.1.8.100)访问,返回web1页面。
- 停止web1的Keepalived服务,VIP漂移至web2,客户端访问自动切换至web2。
- 重新启动web1的Keepalived,VIP重新回到web1(抢占模式)。
7. Keepalived配置文件结构与日志
配置文件(/etc/keepalived/keepalived.conf)三大部分
- 全局配置(global_defs):邮件通知、router_id、VRRP协议参数。
- VRRP实例配置(vrrp_instance):状态、接口、优先级、认证、VIP。
- LVS配置(若与LVS结合使用时配置)。
日志配置(便于排错)
- 修改
/etc/sysconfig/keepalived中的启动参数为-d -S 0。 - 在
/etc/rsyslog.d/下创建keepalived.conf,将local0.*日志写入/var/log/keepalived.log。 - 重启rsyslog和keepalived,使用
tail -f实时监控日志。
8. 高级参数:心跳源IP指定
- 使用
mcast_src_ip参数可指定发送VRRP心跳包的源IP地址,用于多网卡环境或跨网段心跳。
9. 总结
- Keepalived基于VRRP协议,通过VIP漂移实现高可用。
- 支持主从 和双主两种模式。
- 优先级决定主节点,故障时自动切换,配合健康检查脚本可增强服务监控。
- 常与LVS、Nginx等配合,解决单点故障,适用于Web、数据库等场景。
- 脑裂预防核心:多重检测 + 自动隔离 + 监控告警。
LVS(Linux Virtual Server)负载均衡
1. LVS概述
LVS(Linux Virtual Server)是章文嵩博士于1998年创建的一款开源负载均衡软件,工作在内核空间,通过修改数据包的目标IP和端口,将请求调度转发至后端服务器集群。
LVS由两个核心组件构成:
- ipvsadm:用户空间命令行工具,用于定义集群服务和添加RealServer
- ipvs:内核空间模块,真正负责流量转发
⚠️ LVS没有独立的配置文件,所有配置通过
ipvsadm命令管理。
2. 核心术语
| 术语 | 全称 | 说明 |
|---|---|---|
| VS | Virtual Server | 负载均衡器(入口),配置VIP和DIP |
| VIP | Virtual IP | 对外提供服务的虚拟IP,用户访问的目标地址 |
| DIP | Director IP | VS与后端RS通信使用的IP地址 |
| RS | Real Server | 真实后端服务器(如Nginx/Tomcat) |
| RIP | Real Server IP | 后端服务器的真实IP |
| CIP | Client IP | 客户端IP地址 |
3. 工作原理
IPVS利用内核Netfilter子系统处理数据包,核心流程如下:
- 客户端请求到达Director Server,进入内核PREROUTING链
- 判断目标IP为本机VIP,数据包送至INPUT链
- IPVS(工作在INPUT链)比对请求是否匹配定义的集群服务
- 若匹配,修改数据包目标地址,发往POSTROUTING链
- 数据包最终转发给后端Real Server
4. 工作模式
4.1 NAT模式(网络地址转换)
工作方式:修改请求报文的目标IP和端口为RS的IP和端口。
流程:
- CIP → VIP(请求到达Director(Director是负载均衡调度器))
- Director修改目标IP为RIP,转发给RS
- RS处理后将响应返回给Director
- Director修改源IP为VIP,响应给客户端
特点:
- 请求和响应均经过Director
- RS需使用私网地址,网关指向DIP
- 支持端口映射
- 配置简单,但Director容易成为性能瓶颈
- 适合小并发场景
缺陷:Director压力大,不适合极高负载场景。
4.2 DR模式(Direct Routing)★★★★★
生产环境99% 使用此模式
工作方式:通过修改请求报文的MAC地址进行转发,IP首部不变(源IP为CIP,目标IP始终为VIP)。
流程:
- CIP → VIP(请求到达Director)
- Director修改源MAC为DIP的MAC,目标MAC为RS的MAC
- 通过二层网络将数据包发往RS
- RS处理完成后,直接用VIP作为源IP响应客户端
特点:
- 请求走LVS,响应直接回客户端(性能最强)
- LVS和RS必须在同一网段(二层转发)
- 不支持端口映射
- RS需在lo网卡配置VIP,并关闭ARP响应
- RS网关不能指向DIP
RS配置要点:
bash
# 配置lo网卡VIP(子网掩码32位)
# 关闭ARP响应
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
缺陷 :RS和DS(Director Server)必须在同一机房,跨网段配置复杂。
4.3 TUN模式(隧道模式)
工作方式:在原始IP报文外再封装一层IP首部(源IP=DIP,目标IP=RIP),通过隧道传输。
特点:
- RIP、DIP、VIP均需公网地址
- 支持跨网段、跨机房
- 请求走Director,响应直接回客户端
- 不支持端口映射
- RS需支持IP隧道功能
缺陷:配置复杂,一般公司不用。
5. 调度算法
5.1 静态算法(不考虑后端实际负载)
| 算法 | 说明 |
|---|---|
| RR(轮询) | 按顺序轮流分配请求 |
| WRR(加权轮询) | 根据权重分配,权重越高处理的请求越多 |
| DH(目标地址哈希) | 根据目标IP哈希分配 |
| SH(源地址哈希) | 根据源IP哈希分配 |
5.2 动态算法(根据后端实际负载调度)
| 算法 | 说明 |
|---|---|
| LC(最少连接) | 分配给连接数最少的RS |
| WLC(加权最少连接) | 默认算法,结合权重和连接数 |
| SED(最短延迟) | 在WLC基础上改进,计算公式:Overhead = (ACTIVE+1)×256/权重 |
| NQ(永不排队) | 若有RS连接数为0则直接分配,避免空闲RS |
| LBLC(基于局部性最少连接) | 针对目标IP,主要用于Cache集群 |
| LBLCR(带复制的LBLC) | 维护目标IP到一组服务器的映射 |
6. ipvsadm命令速查
bash
ipvsadm -A|E -t|u|f <service-address> [-s <scheduler>] [-p [timeout]] [-M <netmask>] # 定义/编辑集群服务
ipvsadm -D -t|u|f <service-address> # 删除集群服务
ipvsadm -a|e -t|u|f <service-address> -r <server-address> [-g|i|m] [-w <weight>] # 添加/编辑真实服务器
ipvsadm -d -t|u|f <service-address> -r <server-address> # 删除真实服务器
ipvsadm -L|l [options] # 查看规则
ipvsadm -C # 清空所有规则
ipvsadm -R # 重新载入规则
ipvsadm -S [-n] # 保存规则(输出到标准输出)
ipvsadm -Z [-t|u|f <service-address>] # 清空计数器
管理集群服务(虚拟服务)
| 选项 | 说明 |
|---|---|
-A |
添加一个新的集群服务(虚拟服务) |
-E |
编辑一个已有的集群服务 |
-D |
删除指定的集群服务 |
-t |
指定 TCP 协议,格式为 VIP:PORT(如 10.1.1.10:80) |
-u |
指定 UDP 协议,格式为 VIP:PORT |
-f |
防火墙标记(Firewall Mark),用于绑定多个端口或协议,后面跟标记值 |
-s <scheduler> |
指定调度算法,如 rr(轮询)、wrr(加权轮询)、lc、wlc(默认)等 |
-p [timeout] |
设置持久连接超时时间(秒),不指定则使用默认值 |
-M <netmask> |
定义掩码(用于源地址哈希等) |
管理真实服务器(RealServer)
| 选项 | 说明 |
|---|---|
-a |
向指定的集群服务中添加一个真实服务器 |
-e |
编辑一个已存在的真实服务器 |
-d |
从集群服务中删除指定的真实服务器 |
-r <server-address> |
指定真实服务器的 IP 地址和端口,格式为 RIP:PORT |
-g |
指定工作模式为 DR(直接路由),这是生产环境最常用模式(默认) |
-i |
指定工作模式为 TUN(隧道) |
-m |
指定工作模式为 NAT(网络地址转换) |
-w <weight> |
设置权重(用于加权调度算法),数值越大,分配流量越多 |
查看与维护
| 选项 | 说明 |
|---|---|
-L / -l |
查看当前定义的规则列表 |
-n |
以数字形式显示 IP 和端口,不进行 DNS 解析(常与 -L 搭配) |
-c |
查看当前连接状态(持久连接信息),常与 -L 搭配 |
-Z |
清空所有或指定服务的连接计数器(ActiveConn/InActConn) |
-C |
清空所有集群服务规则 |
-R |
从标准输入重新载入规则(用于恢复) |
-S [-n] |
将当前规则保存到标准输出(可重定向到文件),-n 使输出不含 IP 解析 |
常用示例
1. 创建 TCP 集群服务,调度算法为轮询(RR)
bash
ipvsadm -A -t 10.1.1.10:80 -s rr
2. 添加 NAT 模式的后端服务器
bash
ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.11 -m
3. 添加 DR 模式的后端服务器(默认 -g 可省略)
bash
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.11 -g -w 1
4. 修改调度算法为加权轮询
bash
ipvsadm -E -t 10.1.1.10:80 -s wrr
5. 修改某 RS 的权重
bash
ipvsadm -e -t 10.1.1.10:80 -r 10.1.8.12 -m -w 2
6. 查看当前规则(数字显示)
bash
ipvsadm -L -n
7. 保存规则到文件
bash
ipvsadm -S -n > /etc/sysconfig/ipvsadm
7. 实践配置示例
7.1 NAT模式配置要点

在NAT模式下,LVS调度器(Director)是客户端和所有后端服务器(Real Server)的"唯一出入口" 。整个过程中,调度器就像一个路由器,必须在不同网络接口间转发 数据包。因此,必须开启IP转发功能,即开启路由转发。
网络拓扑:
- LVS:双网卡(DIP: 10.1.8.10,VIP: 10.1.1.10)
- RS:单网卡(10.1.8.11/12/13),网关指向DIP(10.1.8.10)
LVS配置:
bash
# 开启路由转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
# 配置防火墙
firewall-cmd --set-default-zone=trusted
firewall-cmd --add-masquerade --permanent
# 创建集群服务(轮询)
ipvsadm -A -t 10.1.1.10:80 -s rr
# 添加RS(NAT模式)
ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.11 -m
ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.12 -m
ipvsadm -a -t 10.1.1.10:80 -r 10.1.8.13 -m
7.2 DR模式配置要点

因为调度器和后端服务器必须在同一个二层网络(广播域)内 ,数据包不需要跨网络路由转发,所以通常无需开启IP转发。
网络拓扑:
- LVS:单网卡(DIP: 10.1.8.10,VIP: 10.1.8.100)
- RS:单网卡(10.1.8.11/12/13),VIP配置在lo网卡
RS配置(所有RS执行):
在 DR 模式下,LVS 调度器收到这个包后,只修改了数据链路层的 MAC 地址 ,完全没有改动目标 IP 。所以,无论调度器把这个请求转发给 3 台中的哪一台 RS,RS 收到的数据包上写着的目标 IP 依然是 10.1.8.100。
bash
# 创建dummy网卡配置VIP(32位掩码)
nmcli connection add type dummy ifname dummy con-name dummy \
ipv4.method manual ipv4.addresses 10.1.8.100/32
# 关闭ARP响应
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/dummy/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/dummy/arp_announce
LVS配置:
bash
# 配置VIP
nmcli connection add type dummy ifname dummy con-name dummy \
ipv4.method manual ipv4.addresses 10.1.8.100/32
# 创建集群服务(加权轮询)
ipvsadm -A -t 10.1.8.100:80 -s wrr
# 添加RS(DR模式,-g参数)
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.11 -g -w 1
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.12 -g -w 2
ipvsadm -a -t 10.1.8.100:80 -r 10.1.8.13 -g -w 3
8. 总结对比
| 特性 | NAT模式 | DR模式 | TUN模式 |
|---|---|---|---|
| 响应路径 | 经过Director | 直接回客户端 | 直接回客户端 |
| 性能 | 一般(瓶颈) | 最强 | 较好 |
| 跨网段 | 支持 | 不支持 | 支持 |
| 端口映射 | 支持 | 不支持 | 不支持 |
| 配置复杂度 | 简单 | 中等 | 复杂 |
| 生产使用率 | 低 | 高(99%) | 极低 |
| RS网关要求 | 指向DIP | 不能指向DIP | 无特殊要求 |
| VIP配置位置 | Director | Director+RS | Director+RS |
| 模式 | RS 是否需要配置 VIP(虚拟网卡) | 原因 |
|---|---|---|
| LVS-NAT | 不要(完全不配) | 调度器改了目标 IP(VIP→RIP),RS 收的是自己的真实 IP |
| LVS-DR | 必须(绑在 dummy/lo 上) | 调度器没改目标 IP,RS 必须拥有 VIP 才能接收该包(同时必须关闭ARP响应,让调度器director独享VIP的"代言全") |
| 对比维度 | NAT 模式 | DR 模式(你的实验) |
|---|---|---|
| Director 网卡数量 | 必须 2 张(一张对外收请求,一张对内改网关做 SNAT) | 只需 1 张(只负责接请求并转发,响应直接回客户端) |
| 后端 RS 配置 VIP | 不需要(RS 只认自己的内网 IP) | 必须要 (在 lo 口配 /32,因为转发过来的包目标 IP 仍是 VIP) |
| 响应流量走向 | 必须经过 LVS(做 SNAT 改源 IP) | 不经过 LVS(RS 直接回复客户端) |
9. 注意事项
- 生产环境:Director不要使用虚拟机,因为负载压力大
- DR模式:RS必须配置ARP抑制,防止RS响应VIP的ARP请求
- NAT模式:需开启路由转发并配置防火墙Masquerade
- 持久连接 :使用
-p参数可保持会话粘性
卡数量** | 必须 2 张 (一张对外收请求,一张对内改网关做 SNAT) | 只需 1 张 (只负责接请求并转发,响应直接回客户端) |
| 后端 RS 配置 VIP | 不需要 (RS 只认自己的内网 IP) | 必须要 (在 lo 口配/32,因为转发过来的包目标 IP 仍是 VIP) |
| 响应流量走向 | 必须经过 LVS (做 SNAT 改源 IP) | 不经过 LVS(RS 直接回复客户端) |
9. 注意事项
- 生产环境:Director不要使用虚拟机,因为负载压力大
- DR模式:RS必须配置ARP抑制,防止RS响应VIP的ARP请求
- NAT模式:需开启路由转发并配置防火墙Masquerade
- 持久连接 :使用
-p参数可保持会话粘性 - 保存配置:规则修改后务必保存到配置文件