LVS 是 Linux Virtual Server 的缩写,中文通常称为 Linux 虚拟服务器。它是一个开源的、高性能的、基于 四层(传输层,TCP/UDP) 的 服务器负载均衡 解决方案。
简单来说,LVS 的核心功能就是:将客户端的请求流量智能地、高效地分发到后端的多个真实服务器上,对外表现为一个单一的、高性能、高可用的虚拟服务器。
负载均衡器 / 调度器 / 前端服务器:
通常被称为 Director
。这是 LVS 的核心,运行着 LVS 软件(主要是 ipvs
内核模块和用户空间的管理工具 ipvsadm
)。它配置有一个或多个 虚拟 IP 地址,这些 VIP 是对外提供服务的地址,客户端直接访问这些 VIP。Director
接收所有到达 VIP 的客户端请求。根据配置的 负载均衡算法 和 工作模式,Director
决定将请求转发给后端哪一台真实服务器。
真实服务器池 / 后端服务器:
通常被称为 Real Server
。这是实际处理用户请求、运行业务应用(如 Web 服务器、应用服务器、数据库服务器等)的一组物理或虚拟机。每台 Real Server
都有自己的 真实 IP 地址。它们处理 Director
转发过来的请求,并将响应返回给客户端(具体返回路径取决于工作模式)。
共享存储 (可选但推荐):
为了保证所有 Real Server
提供一致的服务内容(尤其是动态内容或需要会话保持的应用),通常需要一个共享存储系统(如 NFS, iSCSI, 分布式文件系统等)。这样,无论请求被分配到哪台 Real Server
,用户看到的数据都是一致的。
LVS 的强大之处在于它支持不同的工作模式,以适应不同的网络环境和性能需求:
NAT 模式:
(1)原理: Director
修改请求和响应的 IP 地址。
(2)Real Server
处理请求,响应目标 IP 是 Director
的 DIP -> Director
修改响应源 IP 为 VIP,目标 IP 为客户端 CIP,发送回客户端。
(3)客户端请求到达 VIP -> Director
修改目标 IP 为选中的 Real Server
的 RIP,源 IP 改 为 Director
的 DIP。
(4)优点: 配置相对简单,Real Server
可以是任何操作系统,只需要设置默认网关 为 Director
的 DIP。
(5)缺点: 请求和响应都要经过 Director
,Director
容易成为性能瓶颈(尤其是响应流量大 的场景)。Real Server
的 RIP 通常是私有地址。
(6)适用场景: 网络结构简单,Real Server
数量不多,且响应流量不大的内部应用。
DR 模式:
(1)原理: Director
和 Real Server
都配置相同的 VIP,但只有 Director
的 VIP 对外响应 ARP 请求(通过 ARP 抑制实现)。Director
通过修改请求的 目标 MAC 地址 为选中的 Real Server
的 MAC 地址,将请求转发到二层。Real Server
处理请求后,直接 将响应发送回客户端(源 IP 是 VIP,不经过 Director
)。
(2)优点: 性能极高!响应流量不经过 Director
,大大减轻了 Director
的负担,能处理海量并发。是 最常用、推荐 的模式。
(3)缺点: 配置相对复杂(需要在 Real Server 上配置 VIP 并做 ARP 抑制要求 Director 和所有 Real Server 在同一个物理二层网络(或 VLAN)中,不能跨路由器。
(4)适用场景: 高性能要求、大流量、同网段部署的场景(如数据中心内部)。
TUN 模式:
原理: Director
将收到的客户端请求包封装在一个新的 IP 包中(IP隧道/IPIP),目标 IP 是选中的 Real Server
的 RIP。Real Server
收到后解封装,处理原始请求,然后 直接 将响应发送回客户端(源 IP 是 VIP)。
优点: Real Server
可以分布在不同的地理位置(跨网段、跨机房),响应流量不经过 Director
。
缺点: 配置最复杂,需要 Real Server
支持隧道协议并进行配置,封装/解封装带来额外的 CPU 开销。隧道封装可能导致 MTU 问题。
适用场景: Real Server
需要跨地域部署且性能要求不是极端苛刻的场景。
Director
根据配置的算法决定将新请求分配给哪台 Real Server
。常见算法有:
轮询: 依次将请求分配给每台服务器。
加权轮询: 根据服务器权重(处理能力)按比例分配请求。
最少连接: 将新请求分配给当前活动连接数最少的服务器。
加权最少连接: 在最少连接基础上考虑服务器权重。
基于局部性的最少连接: 主要用于缓存集群,将相同目标 IP 的请求尽量发给同一台服务器 (提高缓存命中率)。
目标地址散列: 根据目标 IP 地址散列值分配服务器,使相同目标 IP 的请求发给同一台服务 器。
源地址散列: 根据源 IP 地址散列值分配服务器,使同一客户端的请求尽量发给同一台服务 器(用于需要会话保持但应用层不支持的情况)。
高性能与可扩展性: 核心工作在 Linux 内核空间(ipvs
),转发效率极高,能轻松处理每秒数十万甚至百万级别的并发连接。通过简单地增加 Real Server
就能线性扩展服务能力。
高可用性: 结合 Keepalived
等工具,可以实现 Director
的主备(或主主)热备。当主 Director
故障时,备用 Director
能自动接管 VIP 和服务,实现故障转移。也可以监控 Real Server
的健康状态,自动剔除故障节点。
透明性: 对客户端和后端应用服务器都是透明的。客户端只看到一个 VIP。应用服务器不需要做特殊修改(在 DR/TUN 模式下响应直接回客户端)。
灵活性: 支持多种工作模式(NAT/DR/TUN)和丰富的负载均衡算法,适应不同的网络环境和业务需求。
开源与低成本: 基于 Linux,完全免费开源,利用通用硬件即可构建高性能负载均衡集群。
配置复杂性: 相比应用层负载均衡器(如 Nginx, HAProxy),LVS(尤其是 DR/TUN 模式)的配置相对复杂,需要一定的网络知识。
四层负载均衡: 只能基于 IP 地址、端口和协议(TCP/UDP)进行转发,无法理解应用层内容(如 HTTP URL, Header, Cookie)。对于需要七层智能路由的场景(如根据 URL 分发),需要结合 Nginx/HAProxy 使用(LVS 作为前端四层负载,Nginx/HAProxy 做七层负载)。
会话保持: 默认情况下,LVS 本身不提供应用层会话保持(Session Persistence)。在需要会话保持的场景:可以使用 源地址散列
调度算法(效果有限,同一 NAT 后的用户会被视为同一客户端)。最好在应用层解决(如 Session 共享到 Redis)。或者使用能感知应用层的负载均衡器(如 Nginx)。
单点故障: 虽然 Director
可以通过 Keepalived 实现高可用,但在 NAT 模式下,Director
本身仍是性能瓶颈和潜在单点(需确保备机性能足够)。DR/TUN 模式避免了响应流量的瓶颈。
高流量网站/Web 服务: 负载均衡 Web 服务器集群。
应用服务器集群: 负载均衡应用服务器(如 Tomcat, Java 应用)。
数据库读负载均衡: 负载均衡数据库的只读从库(需要应用支持或通过中间件)。
缓存服务器集群: 负载均衡 Memcached, Redis 等缓存服务器。
邮件服务集群: 负载均衡 SMTP, POP3, IMAP 服务器。
媒体/视频流服务: 负载均衡大流量媒体服务器。
防火墙负载均衡: 扩展防火墙的处理能力。
ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空
ipvsadm –R 重载
ipvsadm -S [-n] 保存
ipvsadm -Z [-t|u|f service-address] 清楚计数器
1.管理集群服务中的增删改 -A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为 WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一 Realserver
-f #firewall mask 火墙标记,是一个数字
2. 管理集群中 RealServer 的增删改
-a #添加 realserver
-e #更改 realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ipip隧道模式
-m #nat模式
-w #设定权重
-Z #清空计数器
-C #清空 lvs 策略
-L #查看 lvs 策略
-n #不做解析
--rate :输出速率信息
2.配置环境
node1 ip NAT :172.25.254.100/24 VIP 仅主机:192.168.10.100
node2 ip 仅主机:192.168.10.11/24
node3 ip 仅主机:192.168.10.22/24
node4 ip NAT:172.25.254.111/24
###关闭火墙(所有主机)
systemctl stop firewalld.service
###安装ipvsadm(仅在lvs主机)
dnf install ipvsadm -y
###安装并应用httpd用于验证实验(仅在RS1和RS2)
dnf install httpd -y
#RS1
echo RS1 - 192.168.10.11 > /var/www/html/index.html
systemctl enable --now httpd #开启httpd服务
#RS2
echo RS2 - 192.168.10.22 > /var/www/html/index.html
systemctl enable --now httpd
###使不同网段可通过lvs通讯
#lvs启用内核路由功能
echo net.ipv4.ip_forward=1 > /etc/sysctl.conf
3.配置
#lvs
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.10.22:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.10.11:80 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr
-> 192.168.10.11:80 Masq 1 0 0
-> 192.168.10.22:80 Masq 1 0 0
4.测试
在client中
[root@client ~]# for i in {1..6}; do curl 172.25.254.100; done
RS1 -192.168.10.11
RS2 -192.168.10.22
RS1 -192.168.10.11
RS2 -192.168.10.22
RS1 -192.168.10.11
RS2 -192.168.10.22
1.配置环境
client IP:172.25.254.10 #NAT模式
router IP:eth0 192.168.10.100/24,192.168.10.2 eth1 172.25.254.100/24,172.25.254.2
lvs IP:-192.168.10.200/24 -192.168.10.220/24 VIP:192.168.10.100
RS1 IP:eth0 192.168.10.11/24,192.168.10.100 VIP:-127.0.0.1/8 -192.168.10.220/32
RS2 IP:eth0 192.168.10.22/24,192.168.10.100 VIP:-127.0.0.1/8 -192.168.10.220/32
###关闭防火墙(除了route)
systemctl disable --now firewalld.service
###在DR_lvs上安装ipvsadm
dnf install ipvsadm -y
###使不同网段能通过路由通讯
###route内核路由功能
echo net.ipv4.ip_forward=1 > /etc/sysctl.conf
###打开防火墙
systemctl enable --now firewalld.service
###开启地址伪装
firewall-cmd --permanent --add-masquerade
###重启防火墙
firewall-cmd --reload
3.配置
重启服务
#####每次修改网卡都需要
[root@node1 chen]# nmcli connection reload
[root@node1 chen]# nmcli connection up eth0 #将修改的网卡名称放上去
#在客户端主机中为nat模式网卡
[root@client ~]# vim/etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=172.25.254.10/24,172.25.254.100
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.254.100 0.0.0.0 UG 100 0 0 eth0
172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
###route
#在路由主机中设定双网卡,eth0为nat网卡,eth1为仅主机网卡
#对于eth0的设定
[root@DR-server ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=172.25.254.100/24
#对于eth1的设定
[root@DR-server ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=172.25.10.100/24
##对于DR调度器设定网卡为仅主机模式
[root@dr-server ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.10.200/24,192.168.10.100
[root@dr-server ~]# route -n #查看是否完成对于网卡的修改
#对于RS1的设定网卡为仅主机模式(RS2同理可得)
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.10.11/24,192.168.10.100 (RS2需要修改IP)
[root@webserver1 ~]# route -n #查看是否完成修改
4.实验测试
###使servera和serverb的vip不对外作用
#servera和serverb
echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_ignore=1 >> /etc/sysctl.conf
#DR_lvs
[root@DRlvs ~]# ipvsadm -A -t 192.168.10.220:80 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.10.220:80 -r 192.168.10.11:80 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.10.220:80 -r 192.168.10.22:80 -g
[root@DRlvs ~]# ipvsadm -Ln
[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.220:80 rr
-> 192.168.10.11:80 Route 1 0 0
-> 192.168.10.22:80 Route 1 0 0
[root@client ~]# for i in {1..6}; do curl 192.168.10.220; done
RS2 -192.168.10.22
RS1 -192.168.10.11
RS2 -192.168.10.22
RS1 -192.168.10.11
RS2 -192.168.10.22
RS1 -192.168.10.11
1.网络规划
IP地址分配:确保NAT和DR使用的IP地址不会产生冲突,合理规划IP地址段。
子网划分:正确划分子网,以支持不同的网络需求和设备。
2. 设备配置
路由器/防火墙配置:正确配置路由器或防火墙设备,以支持NAT和DR的规则。
交换机配置:确保交换机配置正确,能够处理来自不同源的流量。
3. 安全性
访问控制:设置访问控制列表(ACLs)来限制不必要的访问,增强网络安全。
火墙规则:配置防火墙规则以防止未授权访问和潜在的攻击。
4. 测试和验证
连通性测试:使用 ping、traceroute 等工具测试网络连通性。
服务测试:确保通过NAT和DR可以访问目标服务,如HTTP、HTTPS等。
5. 日志和监控
日志记录:启用设备和服务器的日志记录功能,以便于问题追踪和分析。
网络监控:使用网络监控工具来监控流量和性能,及时发现并解决问题。
6. 故障排除
错误分析:当出现问题时,分析错误日志和配置,找出问题根源。
逐步排查:从网络的最外层开始,逐步排查到内层,找到问题所在。
7. 文档记录
配置记录:记录所有配置的详细信息,包括IP地址、子网掩码、路由规则等。
操作记录:记录实验过程中的关键操作和更改,便于回溯和复现问题。
8. 实验环境
隔离实验环境:在隔离的实验环境中进行NAT和DR配置,避免影响生产环境。
备份配置:在进行任何更改之前,备份当前的配置文件。
9. 性能考虑
负载均衡:在需要时配置负载均衡,以优化资源使用和提高性能。
QoS配置:根据需要配置服务质量(QoS),确保关键业务的流量优先级。
10. 法规遵从
数据保护:确保实验过程中遵守相关的数据保护法规和政策。
合规性检查:定期检查配置和操作是否符合行业标准和法规要求。