第99章:负载均衡LVS
广义上的负载均衡器大概可以分为 3 类,包括:DNS 方式实现负载均衡、硬件负载均衡、软件负载均衡。

LVS 相关组件 ---------------------------------- IPVS LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。那么用户是如何配置 VIP 等相关信息并传递到 IPVS 呢,就需要用到了 ipvsadm 工具。 ipvsadm 工具 ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能。它是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那么 ipvsadm 就是类似 iptables 工具的地位。 keepalived ipvsadm 是一个命令行工具,如果 LVS 需要配置的业务非常复杂,ipvadm 就很不方便了。keepalived 最早就是为了 LVS 而生的,非官方开发的,它提供了配置文件的形式配置管理(持久化),服务的增删改查,操作非常方便。另外,keepalived 支持配置虚拟的 VIP,能够实现 LVS 的高可用,实际生产环境中一般离不开它。

LVS基本原理 ------------------------------------ LVS 是基于 netfilter 框架,主要工作于 INPUT 链上,在 INPUT 上注册 ip_vs_in HOOK 函数,进行 IPVS 主流程,大概原理如图所示: 当用户访问 www.sina.com.cn 时,用户数据通过层层网络,最后通过交换机进入 LVS 服务器网卡,并进入内核网络层。 进入 PREROUTING 后经过路由查找,确定访问的目的 VIP 是本机 IP 地址,所以数据包进入到 INPUT 链上 IPVS 是工作在 INPUT 链上,会根据访问的 vip+port 判断请求是否 IPVS 服务,如果是则调用注册的 IPVS HOOK 函数,进行 IPVS 相关主流程,强行修改数据包的相关数据,并将数据包发往 POSTROUTING 链上。(此处有疑问,在lvs的3种模式的示意图中,ipvs都是把数据包发往output链的!) POSTROUTING 上收到数据包后,根据目标 IP 地址(后端服务器),通过路由选路,将数据包最终发往后端的服务器上。 开源 LVS 版本有 3 种工作模式:DR 模式、NAT 模式、Tunnel 模式 另外还有一种FullNAT模式不存在于开源LVS中

开源LVS的优缺点及使用场景(DR模式/NAT模式/Tunnel模式) =============================================== DR模式的优点 a. 响应数据不经过 lvs,性能高 b. 对数据包修改小,信息保存完整(携带客户端源 IP) DR模式的缺点 a. lvs 与 rs 必须在同一个物理网络(不支持跨机房) b. rs 上必须配置 lo 和其它内核参数 c. 不支持端口映射 DR模式的使用场景 如果对性能要求非常高,可以首选 DR 模式,而且可以透传客户端源 IP 地址。 ------------------------------------------- NAT模式优点 a. 能够支持 windows 操作系统 b. 支持端口映射。如果 rs 端口与 vport 不一致,lvs 除了修改目的 IP,也会修改 dport 以支持端口映射。 NAT模式缺点 a. 后端 RS 需要配置网关 b. 双向流量对 lvs 负载压力比较大 NAT模式的使用场景 如果你是 windows 系统,使用 lvs 的话,则必须选择 NAT 模式了。 ------------------------------------------ Tunnel模式的优点 a. 单臂模式,对 lvs 负载压力小 b. 对数据包修改较小,信息保存完整 c. 可跨机房(不过在国内实现有难度) Tunnel模式的缺点 a. 需要在后端服务器安装配置 ipip 模块 b. 需要在后端服务器 tunl0 配置 vip c. 隧道头部的加入可能导致分片,影响服务器性能 d. 隧道头部 IP 地址固定,后端服务器网卡 hash 可能不均 e. 不支持端口映射 Tunnel模式的使用场景 理论上,如果对转发性能要求较高,且有跨机房需求,Tunnel 可能是较好的选择。

LVS概念术语
CIP:Client IP,表示的是客户端 IP 地址。
VIP:Virtual IP,表示负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
RIP:RealServer IP,表示负载均衡后端的真实服务器 IP 地址。
DIP:Director IP,表示负载均衡与后端服务器通信的 IP 地址。
CMAC:客户端的 MAC 地址,准确的应该是 LVS 连接的路由器的 MAC 地址。
VMAC:负载均衡 LVS 的 VIP 对应的 MAC 地址。
DMAC:负载均衡 LVS 的 DIP 对应的 MAC 地址。
RMAC:后端真实服务器的 RIP 地址对应的 MAC 地址。
grep -i -C10 ipvs /boot/config-3.10.0-1160.el7.x86_64

ipvsadm工具常用参数;ipvsadm工具常用命令 ============================================= ipvsadm工具常用的参数选项有: -A --add-service 添加一条新的虚拟服务 -E --edit-service 编辑虚拟服务 -D --delete-service 删除虚拟服务 -C --clear 清除所有的虚拟服务规则 -R --restore 恢复虚拟服务规则 -a --add-server 在一个虚拟服务中添加一个新的真实服务器 -e --edit-server 编辑某个真实服务器 -d --delete-server 删除某个真实服务器 -L | -l --list 显示内核中的虚拟服务规则 -n --numeric 以数字形式显示IP端口 -c --connection 显示ipvs中目前存在的连接,也可以用于分析调度情况 -Z --zero 将转发消息的统计清零 -p --persistent 配置持久化时间 --set tcp tcpfin udp 配置三个超时时间(tcp/tcpfin/udp) -t | -u TCP/UDP协议的虚拟服务 -g | -m | -i LVS模式为:DR | NAT | TUN -w 配置真实服务器的权重 -s 配置负载均衡算法,如:rr, wrr, lc等 --timeout 显示配置的tcp/tcpfin/udp超时时间 --stats 显示历史转发消息统计(累加值) --rate 显示转发速率信息(瞬时值) ================================================= ipvsadm工具常用命令 1. 管理虚拟服务 ipvsadm -A -t 192.168.1.100:80 -s rr #添加一个虚拟服务192.168.1.100:80,使用轮询算法 ipvsadm -E -t 192.168.1.100:80 -s wrr #修改虚拟服务的算法为加权轮询 ipvsadm -D -t 192.168.1.100:80 #删除虚拟服务 2. 管理真实服务 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2 #添加一个真实服务器192.168.1.123,使用DR模式,权重2 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5 #修改真实服务器的权重 ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.123 #删除真实服务器 3. 查看统计 ipvsadm -Ln #查看当前配置的虚拟服务和各个RS的权重 ipvsadm -lnc #查看当前ipvs模块中记录的连接(可用于观察转发情况) ipvsadm -Ln --stats | --rate #查看ipvs模块的转发情况统计 另外,--stats和--rate统计在分析问题时经常用到,输出各项的含义: --stat选项是统计自该条转发规则生效以来的包 1. Conns (connections scheduled) 已经转发过的连接数 2. InPkts (incoming packets) 入包个数 3. OutPkts (outgoing packets) 出包个数 4. InBytes (incoming bytes) 入流量(字节) 5. OutBytes (outgoing bytes) 出流量(字节) ------------------------------------------------------------------- --rate选项是显示速率信息 1. CPS (current connection rate) 每秒连接数 2. InPPS (current in packet rate) 每秒的入包个数 3. OutPPS (current out packet rate) 每秒的出包个数 4. InBPS (current in byte rate) 每秒入流量(字节) 5. OutBPS (current out byte rate) 每秒入流量(字节) ====================================================== ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up DR模式,RS需要配置VIP,所以需要开启arp_ignore、arp_announce echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce #恢复lvs配置 /bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" [root@lvs ~]# cat /usr/lib/systemd/system/ipvsadm.service [Unit] Description=Initialise the Linux Virtual Server After=syslog.target network.target [Service] Type=oneshot ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" #恢复lvs配置 ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" #固化lvs配置 ExecStop=/sbin/ipvsadm -C RemainAfterExit=yes [Install] WantedBy=multi-user.target [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 192.168.1.8:80 wrr -> 10.0.0.7:80 Masq 1 0 0 -> 10.0.0.17:80 Masq 1 0 0 Masq即NAT模式 -g | -m | -i LVS模式为:DR | NAT | TUN

ipvsadm 参数-f (多服务的绑定);参数-p 长连接 -f:firewall-mark,通常用于将两个或以上的服务绑定为一个服务进行处理时使用,integer类型 该功能需要借助于netfilter的mangle链打标记实现,lvs不再以端口区分服务,而是以标记来进行轮询 使用一个整数值来防火墙标识集群服务,而不是地址、 端口和协议使用它,我们可以通过结合IPtables将多个以调度器为目标的端口定义成一个防火墙标识,由 ipvsdam通过此项关联标识,则可以实现对一个IP多端口调度,即实现后端服务器可以开放多个服务 [root@yefeng ~]# iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10 [root@yefeng ~]# ipvsadm -C [root@yefeng ~]# ipvsadm -A -f 10 -s rr [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.7 -g [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.17 -g [root@yefeng ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 10 rr -> 10.0.0.7:0 Route 1 0 0 -> 10.0.0.17:0 Route 1 0 0 -p:timout:persistent connection,持久连接(client短时间内发起的多次请求将会不进行轮询,转发到同一台RS上) [root@yefeng ~]# ipvsadm -C [root@yefeng ~]# ipvsadm -A -f 10 -s rr -p #-p开启长连接功能,默认保持360秒 [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.7 -g [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.17 -g [root@yefeng ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 10 rr persistent 360 #长链接默认保持360秒 -> 10.0.0.7:0 Route 1 0 0 -> 10.0.0.17:0 Route 1 0 0

实验1:NAT模式 1.配置网卡IP如图所示,无需配置网关 [csda325@yefeng ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=192.168.0.6 NETMASK=255.255.255.0 route add default gw 10.0.0.8 #RS需要配置网关 2.RS开启httpd服务 [root@yefeng ~]# yum -y intall httpd [root@yefeng ~]# echo `hostname -I` RS1 > /var/www/html/index.html [root@yefeng ~]# systemctl start httpd 3.LVS配置映射规则 [root@yefeng ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #LVS开启转发 [root@yefeng ~]# ipvsadm -A -t 192.168.0.8:80 -s wrr #创建VIP TCP服务 [root@yefeng ~]# ipvsadm -a -t 192.168.0.8:80 -r 10.0.0.7:80 -m #添加RS1服务器 [root@yefeng ~]# ipvsadm -a -t 192.168.0.8:80 -r 10.0.0.17:80 -m #添加RS2服务器 [root@yefeng ~]# 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.0.8:80 wrr -> 10.0.0.7:80 Masq 1 0 0 -> 10.0.0.17:80 Masq 1 0 0

实验2:DR模式(VIP处于DIP、RIP的网段内) 1.配置网卡IP如图所示,无需配置网关 [csda325@yefeng ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=192.168.0.6 NETMASK=255.255.255.0 #host需要配置路由;LVS、RS需要配置网关 route add default gw 10.0.0.200 LVS配置VIP ifconfig lo:0 10.0.0.100 netmask 255.255.255.255 up RS配置VIP,并开启arp_ignore,关闭arp_announce ifconfig lo:0 10.0.0.100 netmask 255.255.255.255 up echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 2.RS开启httpd服务 [root@yefeng ~]# yum -y intall httpd [root@yefeng ~]# echo `hostname -I` RS1 > /var/www/html/index.html [root@yefeng ~]# systemctl start httpd 3.路由器开启转发 [root@yefeng ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 4.LVS配置映射规则 [root@yefeng ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@yefeng ~]# ipvsadm -A -t 10.0.0.100:80 -s wrr #创建VIP TCP服务 [root@yefeng ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7 #添加RS1服务器,DR模式不能映射端口,所以可以不指定端口 [root@yefeng ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17:80 #添加RS2服务器 [root@yefeng ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.100:80 wrr -> 10.0.0.7:80 Route 1 0 0 -> 10.0.0.17:80 Route 1 0 0 5.host设备进行测试 curl 10.0.0.100
以下为DR模式下的抓包,观察LVS改写源目MAC
参考资料:
负载均衡 LVS 总结 - 基本介绍 https://blog.csdn.net/liwei0526vip/article/details/103104393
负载均衡 LVS 总结 - 基础原理 https://blog.csdn.net/liwei0526vip/article/details/103104483
负载均衡 LVS 总结 - 操作实践 https://blog.csdn.net/liwei0526vip/article/details/103104496
使用LVS实现负载均衡原理及安装配置详解 https://www.cnblogs.com/liwei0526vip/p/6370103.html
马哥教育2021-8小时拿下LVS企业级实战 https://www.bilibili.com/video/BV1jV411Y76g?from=search&seid=4962698419664974163
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!