Nginx 实战系列(九)—— LVS负载均衡集群与DR模式部署指南
文章目录
- 前言
- 注:负载均衡技术分类一览
- 一、集群概述
- 1.1 集群含义
- 1.2 集群分类
- 二、LVS概述与工作模式
- 2.1 LVS简介
- 2.2 LVS的三种工作模式(重点)
- 2.2.1 NAT模式(LVS-NAT)
- 2.2.2 TUN模式(LVS-TUN)[IP隧道]
- 2.2.3 DR模式(LVS-DR)[直接路由]
- 2.2.4 LVS三种工作模式总结
- 三、LVS调度算法
- 3.1 固定调度算法
- 3.2 动态调度算法
- 四、LVS-DR模式详解
- 4.1 LVS-DR 数据包流向分析
- 4.2 ARP 问题的产生与解决
- 五、LVS-DR模式部署指南
- 5.1 环境准备
- 5.2 部署步骤
- 5.2.1 配置负载调度器(192.168.10.110)
- 5.2.1.1 加载IP虚拟服务器内核模块
- 5.2.1.2 配置VIP(虚拟 IP 地址)
- 5.2.1.3 调整内核参数
- 5.2.1.4 配置负载策略
- 5.2.2 配置Web节点服务器(192.168.10.120、192.168.10.123)
- 5.2.2.1 配置VIP
- 5.2.2.2 添加路由记录、设置开机自启
- 5.2.2.3 调整内核ARP响应参数
- 5.2.2.4 为web节点服务器准备网页文档
- 5.2.3 测试验证
- 总结
前言
在当今高并发的网络环境中,单台服务器往往难以承受大量用户的访问请求。为了提高服务的可用性、扩展性和稳定性,负载均衡技术应运而生。LVS(Linux Virtual Server)是Linux内核自带的负载均衡解决方案,能够将请求高效地分发到多台后端服务器上,实现流量的均衡分配。
本文将详细介绍LVS的三种工作模式、调度算法、部署过程,并提供DR模式完整的配置步骤。无论你是运维工程师、架构师,还是对负载均衡技术感兴趣的开发者,都能从中获得实用的知识和操作指南。
注:负载均衡技术分类一览
分类 | 代表产品/厂商 | 关键特性/性能指标 | 适用场景 |
---|---|---|---|
① 软负载均衡 | Nginx, Haproxy, LVS | 高性能、成本低 - Nginx: 5万 ~ 20万并发 - Haproxy/LVS: 千万级并发 | 追求极致性能与成本控制的业务,如大型互联网公司自建集群。 |
② 硬负载均衡 | F5, 深信服, 华三, 绿盟 | 效果最好、性能稳定 基于专用硬件设备,提供高可靠性和安全性。 | 对稳定性、安全性和性能有极高要求的企业级核心业务,预算充足。 |
③ 云负载均衡 | SLB (阿里云), LB (通用) | 便捷弹性、开箱即用 无缝集成云生态,按需付费,轻松扩展。 | 业务部署在公有云上的所有应用,是云上服务的首选流量入口。 |
一、集群概述
1.1 集群含义
- Cluster,集群、群集
- 由多台主机组成,但在外部表现为单一整体,仅提供一个访问入口(如域名或IP地址),功能上等同于一台大型计算机。
1.2 集群分类
- 负载均衡集群:减少响应延迟,提高并发处理能力
- 高可用集群 :强调系统的稳定性,减少服务之间中断时间 ,减少损失
- 高性能运算集群:提高系统运算性能,高性能依赖于分布式运算、并行计算
二、LVS概述与工作模式
2.1 LVS简介
LVS(Linux Virtual Server)是一个基于Linux内核的负载均衡器,支持多种调度算法和工作模式,能够将客户端请求转发到多台真实服务器上,提高系统的吞吐量和可用性。
2.2 LVS的三种工作模式(重点)
2.2.1 NAT模式(LVS-NAT)
原理:
- 客户端请求到达负载调度器(Director),负载调度器作为所有服务器节点的网关,Director修改请求包的目标IP和端口为后端某台真实服务器(RS)的RIP和端口。
- RS处理完请求后,将响应包返回给Director,Director再将源IP改为VIP后返回给客户端。
- 服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式
优点:
- 支持任何支持TCP/IP的操作系统。
- 隐藏了后端服务器的真实IP,安全。
缺点:
- 所有请求和响应都要经过Director,容易成为性能瓶颈。
不支持大规模集群
。
2.2.2 TUN模式(LVS-TUN)[IP隧道]
原理:
- 采用开放式网络结构
- Director将请求包封装在IP隧道中发送给RS。
- RS解封装后处理请求,并直接响应客户端。
优点:
- RS可以分布在不同的地理位置。支持跨网段部署,但需要服务器支持隧道协议。
- 响应数据不经过Director。
缺点:
- 需要RS支持IP隧道协议。
- 配置复杂。
2.2.3 DR模式(LVS-DR)[直接路由]
原理:
- 采用半开放式网络结构
- Director接收到请求后,只修改目标MAC地址为某台RS的MAC地址,IP层不变。
- RS直接响应客户端,不经过Director。
优点:
- 响应数据不经过Director,性能高。
- 支持更大规模的集群。
缺点:
- RS必须与Director在同一局域网。
RS需要配置VIP在lo接口上,并调整ARP参数
。
2.2.4 LVS三种工作模式总结
类型 | 适用场景 | 网络要求 | 性能特点 |
---|---|---|---|
nat | 小型规模、网络带宽要求不高的内网环境 | 无特殊带宽要求 | 中等性能,依赖NAT转换 |
tun | 跨区域 大规模集群,公网负载均衡(如CN2线路) | 依赖公网带宽 | 高灵活性,适合地理分布式场景 |
DR | 高性能、低延迟的大规模集群 | LVS与后端服务器需同二层网络 | 最高性能,数据直接返回客户端 |
关键差异说明:
- nat:通过地址转换实现,配置简单但存在单点瓶颈。
- tun:基于IP隧道封装,跨越复杂网络但需额外开销。
- DR:直接路由模式,性能最优但依赖二层互通。
三、LVS调度算法
3.1 固定调度算法
- rr(轮询):依次将请求分配给各RS。
- wrr(加权轮询):根据权重分配请求,权重越高分配越多。
- dh(目的地址哈希):根据目的IP分配请求到固定的RS。
- sh(源地址哈希):根据源IP分配请求到固定的RS。
3.2 动态调度算法
- wlc(加权最小连接数):优先分配给连接数最少且权重最高的RS。
- lc(最小连接数):优先分配给连接数最少的RS。
- lblc(基于地址的最小连接数):结合源IP和连接数进行调度。
四、LVS-DR模式详解
LVS-DR(Direct Routing)模式是 LVS 集群中性能最高的一种工作模式。其核心思想是通过修改数据包的 MAC 地址
,将请求转发到后端的真实服务器(Real Server),而真实服务器处理完请求后,直接响应客户端
,不再经过调度器(Director)。这样可以极大减轻调度器的网络负载,提高系统吞吐量。
4.1 LVS-DR 数据包流向分析
1、请求过程(Client → Director → Real Server
)
- 客户端发送请求包(目标IP为VIP,源IP为CIP)。
- 请求包通过路由器到达调度器(Director)。
- 调度器根据负载均衡算法选择一台真实服务器(Real Server),并修改请求帧的目标MAC地址为该服务器的MAC地址。
- 数据包被转发到选中的真实服务器。
2、响应过程(Real Server → Client
)
- 真实服务器接收到数据包后,发现目标IP是VIP(通常绑定在
lo:0
回环接口上),于是处理该请求。 - 处理完成后,直接构造响应包(源IP为VIP,目标IP为CIP)。
- 响应包通过真实服务器的默认路由(通常为网关)直接返回给客户端,不经过调度器。
4.2 ARP 问题的产生与解决
由于调度器(Director)和所有真实服务器(RS)都配置了相同的VIP,会引发以下两种ARP问题:
1、ARP请求冲突:当网关通过ARP广播查询VIP所对应的MAC地址时,配置了该VIP的调度器和所有真实服务器都可能收到请求并进行响应。网关会收到多个ARP回复,导致其ARP缓存被不可预测地更新,导致ARP缓存紊乱。
2、ARP缓存污染:当真实服务器处理完请求,并直接向网关返回响应数据包时,数据包的源IP为VIP,而源MAC地址则是真实服务器自身的物理MAC地址。网关收到该数据包后,会动态学习并更新本地的ARP缓存,错误地将VIP与这台真实服务器的MAC地址绑定。
这两种情况都会导致网关的ARP缓存错误地将VIP与某台真实服务器的MAC地址绑定,致使后续请求被直接发送至该服务器,绕过了调度器,从而造成负载均衡失效
解决方案:
- 设置
arp_ignore=1
- 作用:系统仅响应目标IP地址为本地物理网卡IP的ARP请求,忽略目标IP为VIP(非物理网卡IP)的ARP请求。
- 原因:防止真实服务器响应网关发出的ARP广播请求,避免网关将VIP的MAC地址误记为某台真实服务器的MAC地址。
- 设置
arp_announce=2
- 作用:系统在发送ARP请求时,不使用VIP作为源IP,而是使用物理网卡的IP地址。
- 原因:防止真实服务器向外发送ARP请求时使用VIP作为源IP,导致网关更新ARP缓存,误将VIP与真实服务器的MAC地址绑定。
五、LVS-DR模式部署指南
ipvsadm
是Linux Virtual Server (LVS)的用户空间管理工具,用于配置和维护内核中的IPVS(IP Virtual Server)规则,实现负载均衡。
以下是 ipvsadm
工具常用选项:
选项 | 说明 |
---|---|
-A | 添加虚拟服务器 |
-D | 删除整个虚拟服务器 |
-s | 指定负载调度算法(rr :轮询、wrr :加权轮询、lc :最少连接、wlc :加权最少连接) |
-a | 添加真实服务器(节点服务器) |
-d | 删除某一个节点 |
-t | 指定 VIP 地址及 TCP 端口 |
-r | 指定 RIP 地址及 TCP 端口 |
-m | 使用 NAT 群集模式 |
-g | 使用 DR 模式 |
-i | 使用 TUN 模式 |
-w | 设置权重(权重为 0 时表示暂停节点) |
-p 60 | 保持长连接 60 秒 |
-l | 列表查看 LVS 虚拟服务器(默认为查看所有) |
-n | 以数字形式显示地址、端口等信息,常与 -l 组合使用(如 ipvsadm -ln ) |
5.1 环境准备
角色 | IP地址 |
---|---|
DR服务器 | 192.168.10.110 |
Web服务器1 | 192.168.10.120 |
Web服务器2 | 192.168.10.123 |
VIP | 192.168.10.180 |
5.2 部署步骤
5.2.1 配置负载调度器(192.168.10.110)
5.2.1.1 加载IP虚拟服务器内核模块
systemctl stop firewalld
setenforce 0
# # 加载IP虚拟服务器内核模块(LVS核心依赖)
modprobe ip_vs
cat /proc/net/ip_vs# 安装IPVS管理命令行工具
yum install ipvsadm -y
5.2.1.2 配置VIP(虚拟 IP 地址)
# 配置VIP(虚拟 IP 地址)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
# 内容如下:
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255ifup ens33:0
ifconfig ens33:0
5.2.1.3 调整内核参数
# 调整内核参数
#由于 LVS 负载调度器和各节点需要共用 VIP 地址,需要关闭 icmp 的重定向,不充当路由器。
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0 # 禁用 IPv4 数据包转发(路由功能)
net.ipv4.conf.all.send_redirects = 0 # 禁止所有网络接口发送 ICMP 重定向包
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0sysctl -p
5.2.1.4 配置负载策略
# 配置负载策略
ipvsadm-save > /etc/sysconfig/ipvsadm # 将当前内存中的 IPVS 负载均衡规则保存到文件 /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C # 清空所有现有的 IPVS 规则
# 添加一个虚拟服务(VIP),使用轮询
ipvsadm -A -t 192.168.10.180:80 -s rr
#若隧道模式,-g替换为-i
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.120:80 -g
ipvsadm -a -t 192.168.10.180:80 -r 192.168.10.123:80 -g
ipvsadm -ln #查看节点状态,Route代表 DR模式
5.2.2 配置Web节点服务器(192.168.10.120、192.168.10.123)
5.2.2.1 配置VIP
systemctl stop firewalld
setenforce 0# 配置VIP
#此地址仅用作发送 Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。因此使用虚接口 lo∶0 来承载 VIP 地址,并为本机添加一条路由记录,将访问 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.180
NETMASK=255.255.255.255ifup lo:0
5.2.2.2 添加路由记录、设置开机自启
# 添加一条路由记录
route add -host 192.168.10.180 dev lo:0
#route: 这是用来管理系统路由表的命令,可以添加、删除或显示网络路由。
#add: 这是 route 命令的一个子命令,用于添加一个新的路由规则。
#-host 192.168.10.180: 这个选项指定了要添加的路由目标是一个单独的主机(而非整个网络)。192.168.10.180 是目标主机的 IP 地址。
#dev lo:0: 这个选项指定了数据包应该通过哪个网络接口来传输。lo:0 是一个网络接口设备,在这个它是一个虚拟的网络接口(lo 表示回环接口,通常用于本地主机通信)
# 设置开机自启
echo "/sbin/route add -host 192.168.10.180 dev lo:0" >> /etc/rc.local
chmod +x /etc/rc.d/rc.local
5.2.2.3 调整内核ARP响应参数
# 调整内核的ARP响应参数以阻止更新 VIP 的 MAC 地址,避免发生冲突
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
5.2.2.4 为web节点服务器准备网页文档
echo "<h1>192.168.10.120</h1>" > /usr/local/nginx/html//index.html
echo "<h1>192.168.10.123</h1>" > /usr/local/nginx/html//index.html
5.2.3 测试验证
在客户端访问 http://192.168.10.180/
,观察负载均衡效果。
总结
LVS作为Linux平台下的高性能负载均衡解决方案,通过NAT、DR、TUN三种模式满足了不同场景下的需求。NAT模式配置简单,适合小规模集群;DR模式性能更高,适合对吞吐量要求较高的环境;TUN模式则适用于跨机房部署。
在实际部署中,需根据网络环境和业务需求选择合适的模式和调度算法。本文提供了NAT和DR模式的详细部署步骤,希望能为你在构建高可用集群时提供参考。如果你对LVS还有其他疑问或想要深入了解,欢迎在评论区留言讨论。
注意:本文所有配置均在CentOS 7环境下测试通过,其他发行版可能需适当调整命令。生产环境中请务必提前做好备份和测试