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概念

概念名 概念
VS Virtual Server 虚拟服务器 负责调度
RS Real Server 真实服务器 负责真正提供服务
Client Client 客户端 客户大大
VIP Virtual server IP VS外网的IP \
RIP Real server IP RS的IP \
DIP Director IP VS内网的IP \
CIP Client 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 设置持久连接超时
-t tcp服务
-u udp服务

备份与还原

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

参数和对应模式

参数
-g DR模式(直连路由模式)
-m NAT模式
-i TUN模式(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 网络模式
Client 172.25.254.111---eth0 CIP NAT
LVS 172.25.254.100---eth0 192.168.0.100---eth0 VIP 仅主机
RS1 192.168.0.10---eth0 RIP 仅主机
RS2 192.168.0.20---eth0 RIP 仅主机

!NOTE

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

在LVS上配置
bash 复制代码
[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
在客户端上初尝试
bash 复制代码
[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的问题

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

修改网关配置
bash 复制代码
#在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转发功能
bash 复制代码
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 网络模式
Client 172.25.254.111---eth0 CIP NAT
Router 172.25.254.100---eth0 192.168.0.100---eth1 NAT 仅主机
LVS 192.168.0.200---eth0 192.168.0.220---eth0 DIP VIP 仅主机
RS1 192.168.0.220---lo 192.168.0.10---eth0 VIP RIP 仅主机
RS2 192.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
bash 复制代码
[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/24

route -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".
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
#查看当前系统中所有与 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
bash 复制代码
[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调度算法

静态算法

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

动态算法

动态算法 描述 调度方法
LC least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
WLC Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SED Shortest Expection Delay 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
NQ Never Queue 第一轮均匀分配,后续SED
LBLC Locality-Based LC 动态的DH算法
LBLCR LBLC 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上

火墙标记

bash 复制代码
在RS1和RS2中安装mod_ssl
yum install mod_ssl -y

标记前

bash 复制代码
[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

bash 复制代码
[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

bash 复制代码
[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               destination
    0     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 设定标记值

bash 复制代码
[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
相关推荐
小哈里41 分钟前
【管理】持续交付2.0:业务引领的DevOps-精要增订本,读书笔记(理论模型,技术架构,业务价值)
运维·架构·devops·管理·交付
kfepiza41 分钟前
`/etc/samba/smb.conf`笔记250721
linux·网络协议
beyoundout1 小时前
LVS(Linux virtual server)-实现四层负载均衡
linux·服务器·lvs
Spike()1 小时前
LVS工作模式和算法的总结
linux·服务器·lvs
禁默1 小时前
《命令行参数与环境变量:从使用到原理的全方位解析》
linux
沙老师1 小时前
删除debian xdm自启动ibus的配置项
运维·服务器·debian
老马啸西风2 小时前
windows wsl ubuntu 如何安装 maven
linux·运维·windows·ubuntu·docker·k8s·maven
东木君_2 小时前
【Linux驱动-快速回顾】简单了解一下PinCtrl子系统:设备树如何被接解析与匹配
linux·运维·服务器
CZIDC2 小时前
博客摘录「 华为云平台-FusionSphere OpenStack 8.2.1 系统加固」2025年7月15日
linux·服务器·笔记·华为云·openstack
Linux运维技术栈3 小时前
企业运维实战:Jenkins 依赖 JDK21 与应用需 JDK1.8 共存方案(含流水线配置)
java·linux·服务器