LVS工作模式和算法的总结
一、工作模式
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且不支持端口映射