LVS负载均衡群集与Keepalived高可用
一文读懂LVS负载均衡群集与Keepalived高可用架构
- 前言
- 一、LVS DR模式工作原理
- 1.1 数据包流向分析
- 1.2 DR模式特点
- 二、DR模式部署步骤
- 2.0 环境规划
- 2.0.1 服务器规划
- 2.1 配置负载调度器(Director Server)
- (1) 系统配置
- (2) 配置虚拟IP
- (3) 调整内核参数
- (4) 配置 LVS 服务及调度
- 2.2 配置节点服务器(Real Server)
- (1) 配置 VIP 到 `lo` 接口
- (2) ARP 参数调整,避免MAC冲突
- (3) 安装 Web 服务
- 2.3 测试 LVS 群集
- 三、LVS 面试知识点整理
- 3.1 LVS三种工作模式
- 3.2 LVS调度算法
- 3.3 Nginx vs LVS vs HAProxy 区别
- 四、LVS+Keepalived群集
- 1、概念与原理
- 1.1 Keepalived
- 1.2 VRRP 工作原理
- 1.3 Keepalived 主要模块
- 2、脑裂问题与防护
- 2.1 脑裂(Split Brain)
- 2.2 脑裂原因
- 2.3 防护策略
- 3、部署步骤
- 3.1 环境准备
- 3.2 安装与配置 LVS + Keepalived
- 3.2.1 DR 服务器操作
- 3.2.2 配置 Keepalived
- VIP 配置
- 重启网络服务
- 启动服务
- 内核参数优化
- 3.3 配置 Web 节点
- 3.4 测试
- 3.5 小结与注意事项
- 结语
前言
在当今的互联网时代,随着业务的快速发展,用户访问量呈现爆炸式增长。为了应对这种高并发的访问需求,确保网站或应用的稳定性、可靠性和高性能,负载均衡技术应运而生。负载均衡(Load Balancing)是一种将网络流量或计算任务分配到多个服务器上的技术,旨在优化资源利用、最大化吞吐量、最小化响应时间,并避免任何单一资源的过载。
在众多负载均衡解决方案中,LVS(Linux Virtual Server)和Keepalived凭借其高性能、高可用性和灵活性,成为了企业级应用中的热门选择。本文将深入探讨LVS的DR(Direct Routing)模式工作原理、部署步骤,以及LVS与Keepalived结合使用的群集架构,帮助读者全面理解和掌握这些关键技术。
一、LVS DR模式工作原理
1.1 数据包流向分析
LVS的DR(Direct Routing)模式,即直接路由模式,是一种高效的四层负载均衡解决方案。其工作流程如下:
- 客户端 → Director(负载均衡器):客户端发送请求到VIP(虚拟IP),数据包首先到达Director Server的内核空间。
- Director → Real Server(真实服务器):Director判断数据包的目标IP为VIP,识别为集群服务请求。随后,Director修改数据包的目标MAC地址为Real Server的MAC地址,源MAC地址为Director Server的MAC地址,而IP地址保持不变。修改后的数据包被发送到Real Server。
- Real Server 处理请求:Real Server接收到目标MAC地址为自己的报文,通过
lo
接口配置的VIP来处理请求。处理完成后,响应报文的源IP为VIP,目标IP为客户端(CIP),并直接发送给客户端,绕过Director Server。 - 客户端接收响应:客户端直接从Real Server接收响应,无需经过Director Server,从而提高了响应速度和系统整体性能。
1.2 DR模式特点
- 同一物理网络:Director Server与Real Server必须位于同一物理网络内,以确保MAC地址的有效传递。
- IP地址灵活性:Real Server可以使用私有或公网地址,根据实际需求进行配置。
- Director角色:Director仅作为请求的入口,不承担网关的角色,减轻了其负担。
- 直接响应:所有请求经过Director进行负载均衡,但响应直接由Real Server发送给客户端,提升了效率。
- 网关限制:Real Server的网关不能指向Director Server,以避免不必要的流量经过Director。
- VIP配置:Real Server的
lo
接口需要配置VIP,以便正确处理目标为VIP的请求。
二、DR模式部署步骤
2.0 环境规划
2.0.1 服务器规划
- DR 服务器(负载均衡器):192.168.10.10
- Web 服务器1(Real Server):192.168.10.50
- Web 服务器2(Real Server):192.168.10.40
- VIP(虚拟IP):192.168.10.220
2.1 配置负载调度器(Director Server)
(1) 系统配置
首先,确保系统防火墙和SELinux处于关闭状态,并加载必要的模块与安装相关软件包:
systemctl stop firewalld.service
systemctl stop iptables.service
setenforce 0
modprobe ip_vs
yum -y install ipvsadm
(2) 配置虚拟IP
为Director Server配置VIP,通过创建虚拟网卡ens33:0
实现:
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
# 内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.220
NETMASK=255.255.255.255ifup ens33:0 # 开启网卡
ifconfig ens33:0 # 查看网卡
(3) 调整内核参数
优化内核参数,确保数据包的正确处理:
vim /etc/sysctl.conf
# 添加
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
(4) 配置 LVS 服务及调度
使用ipvsadm
工具配置LVS服务,设置调度算法为轮询(rr),并添加Real Servers:
# 如果有报错文件不存在,需先添加规则再保存
ipvsadm-save > /etc/sysconfig/ipvsadm # 保存导出
ipvsadm-restore < /etc/sysconfig/ipvsadm # 恢复 systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.10.220:80 -s rr
ipvsadm -a -t 192.168.10.220:80 -r 192.168.10.40:80 -g
ipvsadm -a -t 192.168.10.220:80 -r 192.168.10.50:80 -g
ipvsadm -ln # 查看节点状态,Route代表DR模式
2.2 配置节点服务器(Real Server)
(1) 配置 VIP 到 lo
接口
为每个Real Server配置VIP到lo
接口,确保其能正确处理目标为VIP的请求:
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
# 内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.220
NETMASK=255.255.255.255ifup lo:0
ifconfig lo:0
route add -host 192.168.10.220 dev lo:0
(2) ARP 参数调整,避免MAC冲突
调整ARP参数,防止VIP的MAC地址冲突:
vim /etc/sysctl.conf
# 添加
net.ipv4.conf.lo.arp_ignore = 1 # 禁锢路由
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
(3) 安装 Web 服务
根据需求选择合适的Web服务器软件,以下为三种常见安装方式:
- 编译安装Nginx(适用于安装量较少的情况)
- 使用Yum安装Nginx(需epel-release源)
- 使用Yum安装Apache(httpd)
以简单的echo
方式在Web根目录下创建测试页面:
- 192.168.10.40
echo 'this is 192.168.10.40 web01!' > /var/www/html/index.html
- 192.168.10.50
echo 'this is 192.168.10.50 web02!' > /var/www/html/index.html
2.3 测试 LVS 群集
在客户端浏览器访问VIP地址:http://192.168.10.220/
,应能轮询显示不同节点(Web服务器1和Web服务器2)的页面内容。
注意:LVS-DR模式下,用户访问http://192.168.10.220/
后,下次刷新时可能会有约50秒的延迟,这是由于ARP缓存的原因。
三、LVS 面试知识点整理
3.1 LVS三种工作模式
模式 | 原理 | 优缺点 |
---|---|---|
NAT(VS/NAT) | Director 改变数据包目标IP并转发,RS响应包回到Director再发客户端 | 优点:节点可任意OS;缺点:Director是瓶颈 |
DR(VS/DR) | Director 改变目标MAC地址,RS直接响应客户端 | 优点:Director不处理响应;缺点:节点需与Director同网段 |
TUN(VS/TUN) | Director 封装IP包到隧道,RS解封直接响应客户端 | 优点:Director不处理响应;缺点:节点需支持IP隧道 |
3.2 LVS调度算法
LVS支持多种调度算法,主要分为固定调度和动态调度两类:
-
固定调度:
- rr(Round Robin):轮询,每个RS均摊请求。
- wrr(Weighted Round Robin):加权轮询,权重高的RS分配更多的请求。
- dh(Destination Hashing):目的地址哈希分配。
- sh(Source Hashing):源地址哈希分配。
-
动态调度:
- lc(Least Connections):最少连接数。
- wlc(Weighted Least Connections):加权最少连接。
- lblc(Locality-Based Least Connections):基于地址的最少连接。
3.3 Nginx vs LVS vs HAProxy 区别
特性 | Nginx | LVS (Linux Virtual Server) | HAProxy |
---|---|---|---|
定位 | Web 服务器 + 反向代理 + 负载均衡 | 内核级四层负载均衡 | 专业负载均衡器(四层+七层) |
工作层级 | 四层(TCP)+ 七层(HTTP/HTTPS) | 四层(TCP/UDP,传输层) | 四层 + 七层 |
性能 | 高(软件级,单机可达十万级并发) | 极高(内核态,百万级并发) | 高(接近 Nginx,但更专注负载均衡) |
功能特点 | - 静态资源服务 - 反向代理 - 缓存 - 支持 HTTP/HTTPS 负载均衡 | - 高性能转发 - 调度算法丰富(RR、LC、SH…) - 内核态转发,几乎无性能损耗 | - 专注于负载均衡 - 健康检查更强大 - 支持会话保持、SSL 卸载等 |
健康检查 | 简单(TCP/HTTP) | 依赖 Keepalived 或其他工具 | 强大(多协议、多方式) |
配置复杂度 | 简单 | 较复杂(需 ipvsadm/keepalived 配合) | 中等(配置文件灵活) |
适用场景 | Web 代理、动静分离、中小型集群 | 超大规模集群、核心四层调度 | 高可用集群、对健康检查要求高的业务 |
优缺点 | 优点:功能多,易上手 缺点:七层性能不如 LVS/HAProxy | 优点:性能最强,稳定 缺点:只能四层,配置偏复杂 | 优点:专业负载均衡,健康检查强 缺点:不自带 Web 服务 |
一句话总结:
- Nginx:轻量、全能,适合 Web 服务和中小型负载均衡。
- LVS:极致性能,适合四层超大规模集群,但功能单一。
- HAProxy:专业负载均衡器,四层+七层都行,健康检查能力最强。
四、LVS+Keepalived群集
1、概念与原理
1.1 Keepalived
Keepalived是一个基于**VRRP(Virtual Router Redundancy Protocol)**协议实现高可用性(HA)的软件。其初衷是为LVS负载均衡提供高可用方案,但随着发展,Keepalived也支持其他服务(如Nginx、MySQL等)的高可用性。
主要功能包括:
- LVS 集群管理:管理和配置LVS负载均衡集群。
- 节点健康检查(Health Check):通过配置Keepalived的
keepalived.conf
文件,实现对LVS节点IP和相关参数的管理,自动检测并移除故障节点,同时在节点恢复后重新加入集群,确保用户访问不受影响。 - 故障自动切换(Failover):实现两台主机(如Master和Backup)之间的故障转移和自动切换,确保服务的持续可用性。当Master主机失效时,Backup主机自动接管其所有工作,包括VIP资源及相关服务;当Master恢复后,可根据配置自动或手动接管回原工作。
- 高可用 VIP(虚拟 IP)接管:通过VRRP协议,实现VIP在Master和Backup之间的自动切换与接管,保证服务的连续性。
1.2 VRRP 工作原理
VRRP(Virtual Router Redundancy Protocol)是一种用于实现默认网关冗余的协议,其工作原理如下:
- MASTER 节点:定期发送心跳(通告)给BACKUP节点,表明其存活状态。
- BACKUP 节点:若在一定时间内未收到MASTER节点的心跳,则认为MASTER失效,进而接管VIP,成为新的MASTER。
- MASTER 恢复:当原MASTER节点恢复正常时,可以根据配置选择是否重新接管VIP(抢占模式)或保持BACKUP状态(非抢占模式)。
- 默认多播地址:224.0.0.18
- 优先级决定 MASTER 节点:优先级数值越大,越有可能成为MASTER节点。
1.3 Keepalived 主要模块
模块 | 功能 |
---|---|
core | 核心进程、配置文件加载解析 |
vrrp | VRRP 协议实现,高可用 |
check | 健康检查,支持 TCP/HTTP/脚本检查 |
2、脑裂问题与防护
2.1 脑裂(Split Brain)
脑裂是指在高可用(HA)系统中,两个节点(如Master和Backup)由于失去心跳连接,均认为对方已失效,进而各自独立运行,导致系统分裂为两个独立的个体。这种情况可能引发以下后果:
- 共享资源冲突:两个节点同时尝试控制共享资源,导致资源争夺。
- 数据损坏:如数据库等共享存储被同时读写,导致数据不一致或损坏。
形象比喻:如同“裂脑人”一样,两个节点争抢“共享资源”和“应用服务”,可能导致严重后果,如共享资源被瓜分、服务无法正常运行,或同时读写共享存储导致数据损坏。
2.2 脑裂原因
- 心跳线故障:心跳线(如专用网络线)断开、老化或损坏,导致节点间无法正常通信。
- 网卡/驱动故障:网卡硬件或驱动程序出现问题,导致IP配置冲突或通信异常。
- 心跳网络设备故障:连接心跳线的设备(如交换机、网卡)出现故障。
- 仲裁机器异常:用于仲裁的第三方设备或服务出现问题,无法正确判断节点状态。
- 防火墙阻挡 VRRP:节点上开启的防火墙(如iptables)阻止了VRRP心跳消息的传输。
- 配置不一致:同一VRRP实例的配置参数(如
virtual_router_id
、优先级、实例名)在Master和Backup节点上不一致。 - vrrp实例名字不一致、优先级一致:VRRP实例名称或优先级配置错误,导致选举异常。
2.3 防护策略
为防止脑裂的发生,可以采取以下防护措施:
- 双心跳线冗余:配置多条心跳线,采用双线或多线冗余,减少心跳线单点故障的可能性,降低脑裂发生的概率。
- 磁盘锁(锁定共享资源):由当前服务节点锁定共享磁盘资源,防止脑裂时对方节点抢占资源。然而,若占用资源的一方未主动解锁,后备节点将无法接管资源。为此,可设计“智能”锁机制,如仅在检测到所有心跳线断开时启用磁盘锁,避免误操作。
- 仲裁机制(Ping 参考 IP):设置一个参考IP(如网关IP),当心跳线完全断开时,两个节点分别Ping参考IP。若某一节点无法Ping通参考IP,则认为本端网络链路故障,主动放弃竞争,让能够Ping通参考IP的一端继续提供服务。更为保险的做法是,Ping不通参考IP的一方自动重启,释放可能占用的共享资源。
- 脚本监控报警:通过自定义脚本实时监控节点状态与网络连接,发现异常时及时报警,便于管理员快速响应与处理。
3、部署步骤
3.1 环境准备
- 主 DR(MASTER):192.168.10.10
- 备 DR(BACKUP):192.168.10.30
- VIP:192.168.10.220
- Web 节点:
- 192.168.10.40
- 192.168.10.50
- 客户端:192.168.10.1
3.2 安装与配置 LVS + Keepalived
3.2.1 DR 服务器操作
在主DR(192.168.10.10)和备DR(192.168.10.30)上执行以下操作:
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs # 检查模块是否加载成功
3.2.2 配置 Keepalived
编辑Keepalived的配置文件/etc/keepalived/keepalived.conf
,以下为关键配置示例:
global_defs {router_id LVS_01 # MASTER 为 LVS_01,BACKUP 为 LVS_02smtp_server 127.0.0.1
}vrrp_instance VI_1 {state MASTER # BACKUP 节点写 BACKUPinterface ens33virtual_router_id 10priority 100 # MASTER 高于 BACKUPadvert_int 1authentication {auth_type PASSauth_pass abc123}virtual_ipaddress {192.168.10.220}
}virtual_server 192.168.10.220 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.40 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.10.50 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}
配置说明:
- global_defs:定义全局参数,如
router_id
,MASTER和BACKUP节点应设置为不同的值(如LVS_01和LVS_02)。 - vrrp_instance VI_1:定义VRRP实例,设置节点角色(MASTER或BACKUP)、监听接口、虚拟路由ID、优先级、认证信息和虚拟IP地址。
- virtual_server:定义虚拟服务器,设置负载均衡算法(如rr)、调度类型(如DR)、持久化超时时间、协议类型(如TCP)及后端真实服务器(Real Servers)的健康检查配置。
VIP 配置
在主DR上配置VIP的虚拟网卡ens33:0
:
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
# 内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.220
NETMASK=255.255.255.255
ifup ens33:0 # 开启网卡
# ifconfig ens33:0 # 查看网卡配置
重启网络服务
确保VIP配置生效:
systemctl restart network
ifup ens33:0
启动服务
启动Keepalived和ipvsadm服务,并查看VIP及LVS配置:
systemctl start keepalived
ip addr # 查看 VIP 是否生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln # 查看 LVS 配置
内核参数优化
优化内核参数,确保数据包的正确处理:
vim /etc/sysctl.conf
# 添加
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
3.3 配置 Web 节点
在每个Web节点(192.168.10.40和192.168.10.50)上执行以下配置:
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
# 创建测试页面
echo 'this is kgc web!' > /var/www/html/index.html # 192.168.10.40
echo 'this is benet web!' > /var/www/html/index.html # 192.168.10.50
# 配置 VIP 到 lo:0
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
# 内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.220
NETMASK=255.255.255.255
service network restart
ifup lo:0
route add -host 192.168.10.220 dev lo:0
# 调整 ARP 参数
vim /etc/sysctl.conf
# 添加
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
配置说明:
- 安装并启动Web服务:使用Apache(httpd)作为Web服务器,创建简单的测试页面。
- 配置VIP到lo:0:为每个Web节点配置VIP到
lo
接口的别名lo:0
,并设置相应的路由,确保目标为VIP的请求被正确处理。 - 调整ARP参数:防止VIP的MAC地址冲突,确保只有当前处理请求的节点响应VIP的ARP请求。
3.4 测试
-
客户端访问 VIP
在客户端浏览器访问VIP地址:http://192.168.10.220/,应能轮询显示不同Web节点(192.168.10.40和192.168.10.50)的测试页面内容。
-
模拟故障切换
- 停止 MASTER Keepalived
在主DR(192.168.10.10)上停止Keepalived服务,观察BACKUP节点(192.168.10.30)是否成功接管VIP。
systemctl stop keepalived
- 观察 BACKUP 节点
确认BACKUP节点是否成功接管VIP,并继续提供服务。
- 恢复 MASTER
重新启动主DR上的Keepalived服务,观察VIP是否根据配置的抢占模式(默认是抢占)回归到MASTER节点,或保持在BACKUP节点(如果配置为非抢占模式)。
systemctl start keepalived

3.5 小结与注意事项
项目 | 注意点 |
---|---|
VIP配置 | DR节点配置VIP的虚拟网卡(如ens33:0 ),Web节点配置VIP的lo:0 接口。 |
抢占模式 | 默认情况下,MASTER节点恢复后会抢回VIP。如果希望MASTER恢复后不自动抢回VIP,可以在配置中设置nopreempt 参数,启用非抢占模式。 |
健康检查 | Keepalived支持TCP/HTTP等健康检查方式,能够自动检测并移除故障节点,确保流量只被调度到健康的Real Servers。 |
防火墙 | 确保Firewalld等防火墙服务关闭或正确配置,允许VRRP心跳消息的传输,通常需要允许多播地址224.0.0.18的通信。 |
脑裂防护 | 为防止脑裂的发生,建议采取双心跳线冗余、磁盘锁、仲裁机制及脚本监控等防护策略,确保高可用系统的稳定与可靠。 |
结语
通过本文的详细介绍,相信您对LVS的DR模式工作原理、部署步骤以及LVS与Keepalived结合实现高可用负载均衡群集有了全面的了解。LVS作为一款高性能的四层负载均衡解决方案,结合Keepalived的强大高可用性管理功能,能够为企业级应用提供稳定、高效的服务保障。
在实际部署过程中,需根据具体业务需求与网络环境,合理配置各个组件,确保系统的可靠性与性能。此外,持续监控与优化也是保障系统