LVS(Linux virual server)

LVS(Linux virual server)

系统性能扩展方式

Scale UP:增强单台服务器性能,适合单体应用,但有硬件限制。

Scale Out:增加服务器数量,适合分布式和集群系统,可灵活扩展。

集群(Cluster)

定义:多台计算机组合成一个系统,解决特定问题。

类型

  • LB(负载均衡):多主机分担访问请求,提高并发处理能力。
  • HA(高可用):避免单点故障,用MTBF(平均无故障时间)和MTTR(平均恢复时间)衡量可用性,目标是达到高可用性(如99.9%)。
  • HPC(高性能计算):用于大规模计算任务,是国家战略资源。

分布式

定义:将业务拆分成多个子业务,部署在多台服务器上。

应用

  • 分布式存储:如Ceph、GlusterFs、FastDFS等。
  • 分布式计算:如Hadoop、Spark。
  • 分布式应用:服务拆分、静态资源分布、分布式数据存储等。

集群和分布式对比

集群:多台服务器运行相同业务,功能和数据一致,通过负载均衡和冗余提高并发和可靠性。

分布式:多台服务器运行不同子业务,功能和数据不同,通过并行处理缩短任务执行时间,提升效率。

总结

集群:适合高并发、高可用场景,通过增加服务器数量提升性能。

分布式:适合大规模数据处理和复杂业务,通过任务拆分和并行处理提升效率。

LVS概念

概念名概念
VSVirtual Server 虚拟服务器负责调度
RSReal Server 真实服务器负责真正提供服务
ClientClient 客户端客户大大
VIPVirtual server IP VS外网的IP\
RIPReal server IP RS的IP\
DIPDirector IP VS内网的IP\
CIPClient IP 客户端的IP\

访问流程:CIP <–> VIP == DIP <–> RIP

工作原理: VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS

ipvsadm命令

参数描述
-A添加一个新的虚拟服务器
-E编辑现有的虚拟服务器
-D删除一个虚拟服务器
-C清除所有虚拟服务器配置
-L显示虚拟服务器的详细信息
-a向虚拟服务器添加一个真实服务器
-d从虚拟服务器中删除一个真实服务器
-n以数字形式显示 IP 地址和服务端口,不进行解析
-s指定调度算法,默认WLC
-f指定防火墙标签
-w指定权重
-p设置持久连接超时
-ttcp服务
-uudp服务

备份与还原

命令描述
ipvsadm-save > /你的规则文件要保存去哪备份
ipvsadm-restore < /你的规则文件还原

参数和对应模式

参数
-gDR模式(直连路由模式)
-mNAT模式
-iTUN模式(ipip隧道模式)

集群的类型

类型解释参数
lvs-nat修改请求报文的目标IP,多目标IP的DNAT-m
lvs-dr操纵封装新的MAC地址-g
lvs-tun在原请求IP报文之外新加一个IP首部-i
lvs-fullnat修改请求报文的源和目标IP/

NAT

原理

IVS-NAT 原理:修改请求数据包的目标地址(RIP)和端口(PORT)到选定的真实服务器(RS)的地址和端口。

  • 网络要求:RIP和DIP(Director IP)应在同一个网络,使用私有地址;RS的网关应指向DIP。
  • 转发要求:请求和响应数据包都必须通过Director(负载均衡器)转发,这可能导致Director成为瓶颈。
  • 端口映射:支持修改请求数据包的目标端口。
  • 系统兼容性:Director必须是Linux系统,RS可以是任何操作系统。

[!CAUTION]

注意:这里我们就省略了路由器

在这里插入图片描述

实验
主机IP—Port网络模式
Client172.25.254.111—eth0CIPNAT
LVS172.25.254.100—eth0
192.168.0.100—eth0
VIP仅主机
RS1192.168.0.10—eth0RIP仅主机
RS2192.168.0.20—eth0RIP仅主机

[!NOTE]

网络配置方面省略,直接开始LVS的配置

在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.0.10:80 -m
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

当我们配置完上面这三条命令后,我们可以用以下命令进行查看是否配置正确

ipvsadm -Ln

在这里插入图片描述

在客户端上初尝试
[root@client ~]# curl 192.168.0.10
RS1 - 192.168.0.10
[root@client ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done;

我们可以看到客户端卡住了访问不了,可以看到上面的LVS显示20的RS服务器收到了数据包,ActiveConn为1了

所以是RS那边出了问题,而不是LVS的问题

在这里插入图片描述

我们可以看到我们之前用脚本配置的网关是错误的,所以我们需要重新修改网关的配置

在这里插入图片描述

修改网关配置
#在RS1中
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.10/24,192.168.0.100				#改这里
dns=8.8.8.8[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0#在RS2中
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.20/24,192.168.0.100				#改这里
dns=8.8.8.8[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0

在这里插入图片描述

重新加载网络配置

在这里插入图片描述

lvs上需要开启内核的IP转发功能
vim  /etc/sysctl.conf 
net.ipv4.ip_forward=1
测试访问

我们可以看到流量已经可以正常由lvs通过rr算法进行轮询分发

在这里插入图片描述

DR

原理
  1. 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
  2. VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
  3. RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC

在这里插入图片描述

特点
  1. Director和各RS都配置有VIP
  2. 确保前端路由器将目标IP为VIP的请求报文发往Director
  3. 在前端网关做静态绑定VIP和Director的MAC地址
实验
主机IP—Port网络模式
Client172.25.254.111—eth0CIPNAT
Router172.25.254.100—eth0
192.168.0.100—eth1
NAT
仅主机
LVS192.168.0.200—eth0
192.168.0.220—eth0
DIP
VIP
仅主机
RS1192.168.0.220—lo
192.168.0.10—eth0
VIP
RIP
仅主机
RS2192.168.0.220—lo
192.168.0.20—eth0
VIP
RIP
仅主机
Client

在这里插入图片描述

[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
Router

在这里插入图片描述

#开机启动
[root@Router ~]# systemctl enable --now firewalld.service
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.#启用火墙的伪装(NAT,网络地址转换)功能
[root@Router ~]# firewall-cmd --add-masquerade
success
[root@Router ~]# firewall-cmd --reload
success
DRlvs
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.100
address2=192.168.0.220/24route -n
#DRlvs的网关可以写可以不写 都可以

在这里插入图片描述

在这里插入图片描述

[root@DRlvs ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@DRlvs ~]# dnf install ipvsadm-1.31-6.el9.x86_64 -y
#开机启动
[root@DRlvs ~]# systemctl enable --now ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.[root@DRlvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10:80 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20:80 -g
[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.0.220:80 rr-> 192.168.0.10:80              Route   1      0          0-> 192.168.0.20:80              Route   1      0          0
RS1
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32				#添加RS1的VIP[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo

在这里插入图片描述

#查看当前系统中所有与 ARP相关的内核参数配置
[root@RS1 ~]# sysctl -a | grep arp#设置rs主机lo接口不对外响应
#注意需要先设置全局内核参数配置再设置对应接口的内核参数配置
[root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf#刷新刚刚配置的内核参数,同时检查是否更改成功
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
RS2
[root@RS2 ~]# cd /etc/NetworkManager/system-connections/
[root@RS2 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS2 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32				#添加VIP[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up lo

在这里插入图片描述

[root@RS2 ~]# echo net.ipv4.conf.all.arp_ignore=1 >> /etc/sysctl.conf
[root@RS2 ~]# echo net.ipv4.conf.all.arp_announce=2 >> /etc/sysctl.conf
[root@RS2 ~]# echo net.ipv4.conf.lo.arp_ignore=1 >> /etc/sysctl.conf
[root@RS2 ~]# echo net.ipv4.conf.lo.arp_announce=2 >> /etc/sysctl.conf
[root@RS2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
检验

主机上的网卡MAC地址

主机与网卡设备
router:
eth0: 00:0c:29:ca:24:99
eth1: 00:0c:29:ca:24:a3
lvs:
eth0: 00:0c:29:b1:18:8c
RS1:
eth0: 00:0c:29:6c:51:af
RS2:
eth0: 00:0c:29:1c:94:31

我们可以通过抓包来查看整个流程

WireShark抓包

在这里插入图片描述

1.客户端发送出请求来到路由器给到lvs的Director

①
客户端发送访问来到路由器111
对应端口eth1的MAC地址24:a3然后路由器给到lvs的Director
对应端口eth0的MAC地址18:8c

在这里插入图片描述

2.Director收到请求后分发给RS1

②
Director收到请求后分发给RS1,这里显示的还是VIP220
但是我们仔细看MAC地址可以看出是RS1
现在包里携带的是
CIP			VIP(RS)
CMAC		RIPMAC

在这里插入图片描述

3.RS1回包跳过lvs发给路由器

③
RS1回包跳过Director直接来到路由器
所以现在包里携带的是
VIP		CIP
RMAC	CMAC

在这里插入图片描述

4.还原了MAC地址

最后这里
可以理解为
回包到这一步时,显示源MAC是router的MAC,目标MAC是lvs的Director的MAC
但是还有后面一步是变成了
源MAC是lvs的Director的MAC,目标的MAC是router的MAC
注意:这一步防止RS服务器的MAC的泄露,所以有RMAC转换为DMAC
再下一步就是
路由器发往客户端

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

思考
1.为什么lvs上要有DIP?只在Director上配置一个VIP不可以吗?
MAC地址转换:在DR模式下,LVS通过修改请求数据包的MAC地址来实现转发,而不是修改IP地址。Director将请求数据包的源MAC地址改为自己的DIP对应的MAC地址,目标MAC地址改为选定的Real Server(RS)的MAC地址。这样,数据包会被发送到正确的RS。网络隔离:DIP用于在Director内部网络中标识负载均衡器,确保内部网络通信不会与外部网络混淆。DIP通常配置在Director的内部网络接口上,用于与RS通信。ARP响应:Director需要能够响应ARP请求,以便在网络中正确地解析VIP到MAC地址。如果只配置VIP,Director可能无法正确地参与ARP过程,从而影响数据包的转发。安全性:通过配置DIP,可以限制Director的网络暴露,增强系统的安全性。
2.在RS上配置的arp_ignore=1和arp_arp_announce=2有什么作用?
arp_ignore=1:
防止RS响应那些目标硬件地址不是自己的ARP请求。这样可以避免RS的IP地址被其他设备错误地解析到错误的MAC地址,从而防止ARP欺骗攻击。
通俗的说,我的理解是
防止了RS暴露自己的MAC地址,只会响应lvs发来的请求,防止客户端直接访问RS。arp_announce=2:
防止RS发送可能引起网络混乱的ARP响应。当RS接收到一个ARP请求,请求的源IP和目标IP都在RS的IP列表中时,RS不会发送ARP响应。这可以避免RS在DR模式下发送不必要的ARP响应,从而减少网络中的ARP流量和潜在的ARP冲突。
通俗的说,我的理解是
只响应本机所有网络接口的沟通(e.g. lo与eth0就可以沟通),不会响应外面的网络接口和沟通

TUN

转发方式

不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)

在这里插入图片描述

  1. 客户端发送请求数据包,包内有源IP+vip+dport
  2. 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
  3. RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client
特点
  1. DIP, VIP, RIP都应该是公网地址
  2. RS的网关一般不能指向DIP
  3. 请求报文要经由Director,但响应不能经由Director
  4. 不支持端口映射 5.RS的OS须支持隧道功能

fullnat

fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发

CIP --> DIP VIP --> RIP

  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
  2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  3. 请求和响应报文都经由Director
  4. 支持端口映射

[!WARNING]

注意:此类型kernel默认不支持

LVS工作模式总结

NAT模式TUN模式DR模式
RS操作系统不限支持隧道禁用ARP
调度器和服务器网络可跨网络可跨网络不可跨网络
调度服务器数量服务器数量
RS服务器网关指向到调度器DIP指向到路由指向到路由
  • Ivs-nat与lvs-fullnat:请求和响应报文都经由Director
  • Ivs-nat:RIP的网关要指向DIP
  • Ivs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
  • Ivs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
  • Ivs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • Ivs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

LVS调度算法

静态算法

静态算法描述
RRroundrobin轮询RS分别被调度,当RS配置有差别时不推荐
WRRWeightedRR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SHSource Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
DHDestination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

动态算法

动态算法描述调度方法
LCleast connections(最少链接发)适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
WLCWeighted LC(权重最少链接)默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SEDShortest Expection Delay初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
NQNever Queue第一轮均匀分配,后续SED
LBLCLocality-Based LC动态的DH算法
LBLCRLBLC with Replication带复制功能的LBLC

[!NOTE]

SED:当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接,注意服务器权重设置的合理性

LBLC:使用场景:根据负载状态实现正向代理

LBLCR:解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS

在4.15版本内核以后新增调度算法

1.FO(WeightedFaiOver)调度算法

常用作灰度发布

在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_FOVERLOAD标志)的且权重最高的真实服务器,进行调度
当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_FOVERLOAD),那么Vs调度器就不会把链接调度到有过载标记的主机中。

2.OVF(Overflow-connection)调度算法

基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动
连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关
联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:

  • 未过载(未设置IP_VS_DEST_FOVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

防火墙标签解决轮询错误

轮询规则中可能会遇到的错误

以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题 当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上

火墙标记

在RS1和RS2中安装mod_ssl
yum install mod_ssl -y

标记前

[root@DRlvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10:80 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20:80 -g
[root@DRlvs ~]# ipvsadm -A -t 192.168.0.220:443 -s rr
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.10:443 -g
[root@DRlvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.20:443 -g
[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.0.220:80 rr-> 192.168.0.10:80              Route   1      0          0-> 192.168.0.20:80              Route   1      0          0
TCP  192.168.0.220:443 rr-> 192.168.0.10:443             Route   1      0          0-> 192.168.0.20:443             Route   1      0          0

当访问vip时两次调度都到了RS1上,说明80端口和443端口并没有组合到一起被lvs调度器调配

因为我们设置的是rr轮询,那么第一次访问如果是RS1的话,第二次访问将会分配给RS2

[root@Router ~]# curl -k http://192.168.0.10;curl -k https://192.168.0.10
RS1 - 192.168.0.10
RS1 - 192.168.0.10

在这里插入图片描述

这么来看访问调度都不能满足rr,80端口和443端口是独立的,我们需要告诉lvs调度器80端口和443端口要一起调度,所以我们需要火墙标记。

标记后

[!CAUTION]

在此之前务必清除ipvsadm

[root@DRlvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666[root@DRlvs ~]# iptables -t mangle -L -n -v
Chain PREROUTING (policy ACCEPT 6 packets, 432 bytes)pkts bytes target     prot opt in     out     source               destination0     0 MARK       6    --  *      *       0.0.0.0/0            192.168.0.220        multiport dports 80,443 MARK set 0x29a
......[root@DRlvs ~]# ipvsadm -A -f 666 -s rr
[root@DRlvs ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g
[root@DRlvs ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  666 rr-> 192.168.0.10:0               Route   1      0          0-> 192.168.0.20:0               Route   1      0          0

为什么是mangle表,是因为数据包既不是进也不是出,也不是进入调度器本机,而是对于数据包进行附加的说明
-A添加,PREROUTING在路由之前,进来之前马上打标记,-d目的地地址VIP -p协议 tcp协议 -m 指定我们标记的是接口(多端口) --dports 目标端口 -j 指定动作做标记 --set-mark 设定标记值

[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@Router ~]# curl -k http://192.168.0.220;curl -k https://192.168.0.220
RS2 - 192.168.0.20
RS1 - 192.168.0.10[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  666 rr-> 192.168.0.10:0               Route   1      8          0-> 192.168.0.20:0               Route   1      8          0

可以正常轮询,80端口和443端口也可以组合调配了

在这里插入图片描述

在这里插入图片描述

lvs持久链接

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单 粗暴,可能会导致调度失衡

**解决方案 **

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上。

[root@DRlvs ~]# ipvsadm -E -f 666 -s rr -p 300
[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  666 rr persistent 300-> 192.168.0.10:0               Route   1      0          0-> 192.168.0.20:0               Route   1      0          0

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上。

[root@DRlvs ~]# ipvsadm -E -f 666 -s rr -p 300
[root@DRlvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  666 rr persistent 300-> 192.168.0.10:0               Route   1      0          0-> 192.168.0.20:0               Route   1      0          0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89732.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 ASP.NET Core 和 JavaScript 中配置 WebSocket

在本文中&#xff0c;我们将了解 WebSocket&#xff0c;并逐步讲解如何在客户端配置 WebSocket 并与服务器通信。首先&#xff0c;让我们先来了解一下“ WebSocket ”。什么是 WebSocketWebSocket 是一种协议&#xff0c;它提供了一种通过持久连接在客户端和服务器之间交换数据…

车载刷写框架 --- 关于私有节点刷写失败未报引起的反思

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

ABP VNext + GitHub Actions:CI/CD 全流程自动化

&#x1f31f; ABP VNext GitHub Actions&#xff1a;CI/CD 全流程自动化 &#x1f4da; 目录&#x1f31f; ABP VNext GitHub Actions&#xff1a;CI/CD 全流程自动化&#x1f929; TL;DR&#x1f504; 全局流程概览1️⃣ 准备工作与项目结构1.1 &#x1f6e0;️ 工具链与 S…

Elasticsearch 重命名索引

作者&#xff1a;来自 Elastic Alex Salgado 学习如何使用四种实用方法在 Elasticsearch 中重命名索引。 想获得 Elastic 认证&#xff1f;看看下一期 Elasticsearch Engineer 培训什么时候开始&#xff01; Elasticsearch 拥有丰富的新功能&#xff0c;帮助你根据使用场景构建…

高通8255 Android Virtio Virtio-SPI 配置方法

目录 一&#xff1a;VirtIO和Passthrough的区别 二&#xff1a;配置逻辑 三&#xff1a;配置方法 步骤一&#xff1a;QNX SPI资源配置 & 测试 配置 测试 步骤二&#xff1a;BE配置 &测试 配置 测试 步骤三&#xff1a;Hypervisor配置 配置 测试 步骤四&…

从零手写红黑树(C++实现详解)

目录 一、红黑树概述 二、红黑树节点设计 (1)枚举红黑 &#xff08;2&#xff09;红黑树的节点设计 三、红黑树核心实现:Insert 1.首先将节点遍历到对应位置创建对应节点并插入到二叉搜索树对应的位置 2.本文重点的重点 &#xff08;1&#xff09;parent为黑时直接插入即…

【黄山派-SF32LB52】—硬件原理图学习笔记

目录 一、硬件介绍 二、芯片主控 1.模组介绍 2.原理图介绍 3.模组供电电路 三、电源转换部分 1.OVP过压保护电路 2.CHG充电电路 3.系统电源桥接电路 4.LDO电路 四、Debug电路 1.一键下载电路 五、QSPI屏幕 六、SD卡 七、AUDIO音频 八、GPIO电路 1.按键部分…

从五次方程到计算机:数学抽象如何塑造现代计算

引言 数学的发展往往始于一个具体的问题&#xff0c;而后在寻求解答的过程中&#xff0c;催生出深刻的抽象理论。从五次方程的求解到抽象代数&#xff0c;再到范畴论和λ演算&#xff0c;最终影响图灵机和现代计算机的设计&#xff0c;这一历程展现了数学如何从实际问题演变为通…

剧本杀小程序开发:科技赋能,重塑推理娱乐新形态

在科技飞速发展的今天&#xff0c;各个行业都在积极探索与科技的融合&#xff0c;以实现创新发展。剧本杀行业也不例外&#xff0c;剧本杀小程序的开发&#xff0c;正是科技赋能传统娱乐的生动体现&#xff0c;它重塑了推理娱乐的新形态&#xff0c;为玩家带来了前所未有的游戏…

机器学习sklearn入门:归一化和标准化

bg&#xff1a;归一化&#xff08;Normalization&#xff09;通常指将数据按比例缩放至某个特定范围&#xff0c;但具体范围并不一定是固定的 0到1。标准化是将数据转换成均值为0&#xff0c;标准差为1的分布。使用场景&#xff1a;用归一化&#xff1a;需要严格限定范围&#…

【Project】kafka+flume+davinci广告点击实时分析系统

一、项目需求分析 某电商平台需实现广告实时点击分析系统&#xff0c;核心需求为实时统计以下内容的Top10&#xff1a; 各个广告的点击量各个省份的广告点击量各个城市的广告点击量 通过实时掌握广告投放效果&#xff0c;为广告投放策略调整和大规模投入提供依据&#xff0c;以…

JAVA后端开发——success(data) vs toAjax(rows): 何时用

toAjax(int rows)用途&#xff1a;用于不返回任何数据的 “写” 操作&#xff08;增、删、改&#xff09;。工作原理&#xff1a;它只接收一个 int 类型的参数&#xff08;通常是数据库操作影响的行数&#xff09;。它只关心这个数字是不是大于0&#xff0c;然后返回一个通用的…

pdf格式怎么提取其中一部分张页?

想从PDF里提取几个页面&#xff0c;办法还挺多的&#xff0c;下面给你唠唠常见的几种&#xff0c;保准你一看就懂。一、用专业PDF编辑软件提取 像Adobe Acrobat&#xff0c;这可是PDF编辑界的“老手”了。你先把要处理的PDF文件在Adobe Acrobat里打开&#xff0c;接着找到菜单栏…

Spring监听器

1、监听器的原理 ApplicationListener<T>是Spring框架中基于观察者模式实现的事件监听接口&#xff0c;用于监听应用程序中特定类型的事件。该接口是一个函数式接口&#xff0c;从Spring 4.2开始支持Lambda表达式实现。 接口定义如下&#xff1a; FunctionalInterface …

基于Rust游戏引擎实践(Game)

Rust游戏引擎推荐 以下是一些流行的Rust游戏引擎,适用于不同开发需求: Bevy 特点:数据驱动、模块化设计,支持ECS架构,适合初学者和复杂项目。 适用场景:2D/3D游戏、原型开发。 Amethyst 特点:成熟的ECS框架,支持多线程,社区活跃。 适用场景:大型游戏或高性能应用。…

PyTorch 数据加载实战:从 CSV 到图像的全流程解析

目录 一、PyTorch 数据加载的核心组件 1.1 Dataset 类的核心方法 1.2 DataLoader 的作用 二、加载 CSV 数据实战 2.1 自定义 CSV 数据集 2.2 使用 TensorDataset 快速加载 三、加载图像数据实战 3.1 自定义图像数据集 3.2 使用 ImageFolder 快速加载 四、加载官方数据…

程序人生,开启2025下半年

时光匆匆&#xff0c;2025年已然过去一半。转眼来到了7月份。 回望过去上半年&#xff0c;可能你也经历了职场的浮沉、生活的跌宕、家庭的变故。 而下半年&#xff0c;生活依旧充满了各种变数。 大环境的起起伏伏、生活节奏的加快&#xff0c;都让未来的不确定性愈发凸显。 在这…

在 .NET Core 中创建 Web Socket API

要在 ASP.NET Core 中创建 WebSocket API&#xff0c;您可以按照以下步骤操作&#xff1a;设置新的 ASP.NET Core 项目打开 Visual Studio 或您喜欢的 IDE。 创建一个新的 ASP.NET Core Web 应用程序项目。 选择API模板&#xff0c;因为这将成为您的 WebSocket API 的基础。在启…

Python 之地址编码识别

根据输入地址&#xff0c;利用已有的地址编码文件&#xff0c;构造处理规则策略识别地址的编码。 lib/address.json 地址编码文件&#xff08;这个文件太大&#xff0c;博客里放不下&#xff0c;需要的话可以到 gitcode 仓库获取&#xff1a;https://gitcode.com/TomorrowAndT…

kafka的部署

目录 一、kafka简介 1.1、概述 1.2、消息系统介绍 1.3、点对点消息传递模式 1.4、发布-订阅消息传递模式 二、kafka术语解释 2.1、结构概述 2.2、broker 2.3、topic 2.4、producer 2.5、consumer 2.6、consumer group 2.7、leader 2.8、follower 2.9、partition…