LVS工作模式和算法的总结

发布于:2025-07-24 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、工作模式

1.名词解释

LVS的工作模式有四种:NAT、DR、TUN、FNAT。

NAT:LVS改写目标IP/端口,所有流量必经LVS,性能由LVS决定

DR:LVS只改MAC,响应流量直接回客户端,性能高,要求LVS与RS同二层。

Full-NAT:LVS同时改源/目标IP,彻底解除同网段束缚,牺牲性能换灵活。

常用的为前两种,在解释这四种工作模式之前进行名词解释:RS:后端的真实存在的服务器(Real Server)、CIP:客户端请求IP、VIP:虚拟的IP、DIP:后端和LVS调度器相连的VIP上的IP、RIP:RS的IP。

2.LVS-NAT模式

这种工作模式很简单,主要涉及到三层报文的修改:

阶段客户端→LVS:源IP(CIP),目的IP(VIP)

阶段LVS→RS:源IP(CIP),目的IP(RIP)----进行DNAT将目的IP修改为RS的IP

阶段RS→LVS:源IP(RIP),目的IP(CIP)----RS原样发回

阶段LVS-客户端:源IP(VIP),目的IP(CIP)----LVS进行SNAT将IP改为自己的VIP

经过上面观察可以知道ipvsadm对于经过配置ipvsadm规则匹配上的流量进行了DNAT和SNAT转换。但是这不意味着会对RS自发上网的流量进行转换。LVS-NAT 模式下,LVS 只处理“连接追踪表中有记录”的流量。这个“记录”是通过首次命中 VIP 的入站报文建立的,所以后续RS回来的报文进行匹配连接追踪表中的记录,才会SNAT。

配置命令

#RS上面不用做什么配置,只需要一个用来测试的网页即可
yum install nginx -y
echo "$(hostname -I):test messages" > /usr/share/nginx/html/index.html
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
#将自己的物理网卡网关指向DIP
nmcli con mod ens160 ipv4.method manual ipv4.address "$RIP"/24 ipv4.gateway $DIP connection.autoconnect yes

#LVS
dnf install ipvsadm -y
nmcli con add type dummy ifname lvstest ipv4.method manual ipv4.address ${VIP}/24
connection.autoconnect yes
nmcli con up dummy-lvstest
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf
sysctl -p
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
cat > ipvsadmConfig << EOF #算法这里wrr为加权轮询,自己可以选择
-A -t 192.168.118.150:http -s wrr
-a -t 192.168.118.150:http -r 192.168.118.100:http -m -w 1
-a -t 192.168.118.150:http -r 192.168.118.200:http -m -w 1
EOF
ipvsadm-restore -n < ipvsadmConfig

3.LVS-DR模式

相较于NAT模式,响应流量不再经过 LVS,直接由 Real Server 回给客户端,因此 LVS 只处理“进流量”,带宽和负载压力骤减,整体吞吐量比 NAT 高一个量级。但是它只在二层上面做手脚:

客户端→LVS:目的MAC是LVS的接口MAC

LVS→RS:保留三层,将二层的MAC目的改为RS的MAC,并将源MAC改为自己LVS接口MAC

RS→客户端:RS直接将MAC换为自己MAC,下一跳的MAC改为网关MAC;不再经过LVS

通过对上面观察,有两个值得注意的地方:

1.现实操作中,肯定应该是网关将客户端的请求给到LVS上,那么网关上应该做一个DNAT,将访问这个IP的流量打到内网的VIP上面,将RS回来的包做一个SNAT。

2.RS应该也有VIP,因为它可以直接将处理完的数据重新封装,回给客户端。那么它和LVS都有VIP,那么它应该做arp_ignore,忽略掉网关的找VIP的arp包。

3.由2推理,如果RS→客户端会携带自己RS接口MAC和VIP(RS也有VIP)给到网关,那么这个网关的arp表必然会被污染,因为后续RS的数据包给到网关后那么VIP对应的MAC就会被刷新,那么下一次流量就会绕过LVS,知道mac缓存时间到期

要处理上面的问题3,要么将网关的VIP对应的MAC写死,写为LVS的MAC,要么在RS上将VIP对应虚拟网卡做arp_announce设置,不对VIP的MAC携带给网关

配置命令

这里参考我的这一篇文章:LVS-DR的ARP污染问题-CSDN博客

4.常用算法

静态

RR:轮询算法,顾名思义将访问的流量均匀的打到后端的每一台服务器上,并不关心后端死活

WRR:可以事先的对后端服务器的性能按照一定比例将流量给到

SH:为了将同一IP访问的服务,后续能持续访问这个服务器,将源地址进行hash运算,然后对结果取后端服务器数量的模

DH:对访问的目标IP进行固定的RS绑定,也是对目标目标IP进行hash运算,然后取后端数量的模

动态

LC:最少连接数,将流量打给后端服务器上访问连接最少的服务器

WLC:加权的最少连接数

SED:初始连接高权重优先,min((active+1)/weight)

NQ:先均匀分配,后续采用SED方式分配

LBLC:动态的DH算法,比较适用于CDN/缓存集群

LBLCR:当后端RS挂掉后,会将挂掉的资源复制到负载较轻的RS上

FO:常用作灰度发布,将需要更新或者维护的服务器进行标记,可以动态控制是否访问指定RS

OVF:按权重给每个 RS 指定配额,新连接优先塞给权重最高且当前连接数还没用完配额的 RS;配额一满就换下一个权重最高的,直到全部溢出才回头再从头轮询。

LVS防火墙标记

防火墙标记是为了解决客户端访问的同一目标IP但端口不同又有需要将流量给到LVS处理,让其调度到同一台服务器上这种情况。比如将443端口和80端口不按照端口进行区分,变为一条同一条路由进行匹配;

配置示例:

#在网关上配置即可
iptables -t mangle -A PREROUTING \
  -d 192.168.0.100 -p tcp \
  -m multiport --dports 80,443 \
  -j MARK --set-mark 10
#LVS上(DR模式)
ipvsadm -A -f 10 -s wrr
ipvsadm -a -f 10 -r 192.168.0.11 -g -w 3
ipvsadm -a -f 10 -r 192.168.0.12 -g -w 3

上面的工作模式我这里只给了常用的,TUN模式的简单提一下:这里RS的网关一般不能指向DIP且不支持端口映射


网站公告

今日签到

点亮在社区的每一天
去签到