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上配置
[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
原理
- 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
- VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
- RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
特点
- Director和各RS都配置有VIP
- 确保前端路由器将目标IP为VIP的请求报文发往Director
- 在前端网关做静态绑定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
[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)
- 客户端发送请求数据包,包内有源IP+vip+dport
- 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
- RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client
特点
- DIP, VIP, RIP都应该是公网地址
- RS的网关一般不能指向DIP
- 请求报文要经由Director,但响应不能经由Director
- 不支持端口映射 5.RS的OS须支持隧道功能
fullnat
fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP VIP --> RIP
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
- RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
- 请求和响应报文都经由Director
- 支持端口映射
[!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上
火墙标记
在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