当前位置: 首页 > ds >正文

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且不支持端口映射

http://www.xdnf.cn/news/15888.html

相关文章:

  • 【RK3576】【Android14】SDK源码编译
  • 前端 SSE 实战应用:用最简单的方式实现实时推送
  • Android CountDownTimer
  • 深入理解Linux文件I/O:系统调用与标志位应用
  • 机器学习17-Mamba
  • c++继承详解
  • 【Leecode 随笔】
  • 使用python的读取xml文件,简单的处理成元组数组
  • 【时时三省】(C语言基础)通过指针引用字符串
  • PyCharm 高效入门指南(核心模块详解二)
  • stm32f4 dma的一些问题
  • API和SDK有何区别??
  • 跨平台猫咪键盘桌宠BongoCat v0.6.2 绿色版(附带多款皮肤包)
  • SDIO协商,枚举,CMD等概念
  • [特殊字符] Spring Boot 常用注解全解析:20 个高频注解 + 使用场景实例
  • 前端篇——番外篇 Bootstrap框架
  • (笔记+作业)第五期书生大模型实战营---L2G2000 GraphGen:训练数据合成实践
  • 前端之CSS
  • LP-MSPM0G3507学习--04GPIO控制
  • 磁悬浮转子不平衡质量的高精度控制:从原理到实战
  • 一文讲清楚React的render优化,包括shouldComponentUpdate、PureComponent和memo
  • Android音视频探索之旅 | Webrtc 1对1音视频通话核心流程分析
  • 借助AI学习开源代码git0.7之三git-init-db
  • YOLO演变史(一)
  • CSS样式中的布局、字体、响应式布局
  • CMakeLists.txt 配置文件
  • 非线性优化相关库笔记
  • 【面试题】大厂高压面经实录丨第二期
  • @Qualifier(“beanName“) 详解
  • 一个逻辑问题