keepalived及lvs

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/内存满载)无法响应心跳。
    • 配置参数不一致(如statepriorityauthentication)。
  • 危害
    • 双节点同时持有VIP,客户端请求混乱。
    • 数据库、存储等资源可能发生双写冲突,引发数据不一致。
    • 集群失去高可用意义,甚至服务崩溃。

5. 脑裂预防与应对策略

策略 具体措施
增加心跳检测线路 配置多个网络接口(如eth0eth1)作为心跳链路,避免单线路故障。
VRRP认证 配置auth_type PASSauth_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子系统处理数据包,核心流程如下:

  1. 客户端请求到达Director Server,进入内核PREROUTING链
  2. 判断目标IP为本机VIP,数据包送至INPUT链
  3. IPVS(工作在INPUT链)比对请求是否匹配定义的集群服务
  4. 若匹配,修改数据包目标地址,发往POSTROUTING链
  5. 数据包最终转发给后端Real Server

4. 工作模式

4.1 NAT模式(网络地址转换)

工作方式:修改请求报文的目标IP和端口为RS的IP和端口。

流程

  1. CIP → VIP(请求到达Director(Director是负载均衡调度器))
  2. Director修改目标IP为RIP,转发给RS
  3. RS处理后将响应返回给Director
  4. Director修改源IP为VIP,响应给客户端

特点

  • 请求和响应均经过Director
  • RS需使用私网地址,网关指向DIP
  • 支持端口映射
  • 配置简单,但Director容易成为性能瓶颈
  • 适合小并发场景

缺陷:Director压力大,不适合极高负载场景。


4.2 DR模式(Direct Routing)★★★★★

生产环境99% 使用此模式

工作方式:通过修改请求报文的MAC地址进行转发,IP首部不变(源IP为CIP,目标IP始终为VIP)。

流程

  1. CIP → VIP(请求到达Director)
  2. Director修改源MAC为DIP的MAC,目标MAC为RS的MAC
  3. 通过二层网络将数据包发往RS
  4. 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(加权轮询)、lcwlc(默认)等
-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. 注意事项

  1. 生产环境:Director不要使用虚拟机,因为负载压力大
  2. DR模式:RS必须配置ARP抑制,防止RS响应VIP的ARP请求
  3. NAT模式:需开启路由转发并配置防火墙Masquerade
  4. 持久连接 :使用-p参数可保持会话粘性
    卡数量** | 必须 2 张 (一张对外收请求,一张对内改网关做 SNAT) | 只需 1 张 (只负责接请求并转发,响应直接回客户端) |
    | 后端 RS 配置 VIP | 不需要 (RS 只认自己的内网 IP) | 必须要 (在 lo 口配 /32,因为转发过来的包目标 IP 仍是 VIP) |
    | 响应流量走向 | 必须经过 LVS (做 SNAT 改源 IP) | 不经过 LVS(RS 直接回复客户端) |

9. 注意事项

  1. 生产环境:Director不要使用虚拟机,因为负载压力大
  2. DR模式:RS必须配置ARP抑制,防止RS响应VIP的ARP请求
  3. NAT模式:需开启路由转发并配置防火墙Masquerade
  4. 持久连接 :使用-p参数可保持会话粘性
  5. 保存配置:规则修改后务必保存到配置文件
相关推荐
MartinYeung51 小时前
[论文学习]AgentDojo:用于评估LLM智能体提示注入攻击与防御的动态环境
网络·学习
白狐_7982 小时前
【408计算机网络|第03章·上|408-CN-03A】数据链路层(上):组帧、差错控制与可靠传输
网络·网络协议·计算机网络
老赵的博客3 小时前
工控机之udp远程控制
网络·网络协议·udp
努力努力再努力wz3 小时前
【分布式系统与 RPC 框架系列】从单机瓶颈到远程调用:一文理解分布式架构与 RPC 原理
linux·网络·c++·分布式·网络协议·rpc·架构
GIS数据转换器3 小时前
智慧灌区管理平台
大数据·服务器·网络·数据库·人工智能·生活
其实防守也摸鱼5 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·运维·网络·人工智能·学习·安全·macos
treesforest14 小时前
平时上网留下的IP地址,到底能被查到什么?
网络·网络协议·tcp/ip·ip地址·ip查询·定位服务
多巴胺梦想家14 小时前
06 代数系统:运算背后的结构之美
网络·拓扑学
小锋学长生活大爆炸15 小时前
【福利】最新免费领取云服务器和虚拟主机攻略
网络·github