LVS(Linux virual server)详解
目录
一、LVS(Linux virual server)是什么?
二、集群和分布式简介
2.1、集群Cluster
2.2、分布式
2.3、集群和分布式
三、LVS运行原理
3.1、LVS基本概念
3.2、LVS集群的类型
3.2.1 nat模式
3.2.2 DR模式
3.2.3、LVS工作模式总结
3.3 LVS的调度算法
3.3.1 静态调度算法
3.3.2、动态调度算法
四、LVS部署命令介绍
4.1 相关软件信息
4.2 ipvsadm命令
4.3 集群中增删改参数
五、LVS部署集群演示
5.1 部署NAT模式集群
5.1.1 实验环境:
5.1.2 lvs配置:
5.1.3 webserver1配置:
5.1.4 webserver2配置:
5.1.5 lvs上面测试:
5.2 部署DR模式集群
5.2.1 实验环境
5.2.1.1 配置要点:
5.2.1.2 解决vip响应问题:
5.2.1.2 router 配置:
5.2.1.3 lvs配置:
5.2.1.4 RS1和RS2配置:
5.2.1.5 client 测试效果:
5.3 防火墙标签解决轮询错误
5.3.1 轮询规则中可能会遇到的错误
5.3.2 防火墙标记解决轮询调度问题
5.3.2.1 在lvs中设定端口标签
5.4 lvs持久链接
5.4.1 解决方法:
一、LVS(Linux virual server)是什么?
LVS(Linux virual server) :是 Linux 下的虚拟服务器集群系统。它主要用于实现服务器集群的负载均衡,可以将多台服务器组合成一个高性能、高可用的服务器集群,将外部请求均衡地分配到集群中的各个服务器上,从而提高系统的处理能力和可靠性。
二、集群Cluster和分布式介绍
2.1 集群Cluster
Cluster:集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统。
cluster常见的三种类型:
- 高可用性集群(High Availability Cluster):旨在确保关键业务系统持续运行,当一个节点出现故障时,其他节点能够迅速接管,以减少停机时间。
- 负载均衡集群(Load Balancing Cluster):将工作负载分布到多个节点上,以提高系统的整体性能和吞吐量,确保资源得到合理利用。
- 高性能计算集群(High Performance Computing Cluster):主要用于大规模科学计算、数据分析等需要强大计算能力的领域,通过将多个计算节点连接在一起,实现高效的并行计算。
例如,在网络服务器中,高可用性集群可以保证服务的不间断;在大型网站中,负载均衡集群可以分担访问压力;在科研领域,高性能计算集群可以加速复杂的计算任务。
2.2 分布式
分布式系统是将多台计算机通过网络连接在一起,共同完成特定任务的系统。在分布式系统中,任务被分解成多个子任务,分布到不同的节点上执行,从而实现资源共享、提高系统的性能、扩展性和容错能力。
它具有以下特点:
- 分布性:系统中的资源和组件分布在不同的物理位置。
- 并发性:多个任务可以同时执行。
- 透明性:系统对用户隐藏了底层的分布式特性。
- 异构性:系统中的节点可能具有不同的硬件和软件配置。
分布式系统在互联网、云计算、大数据等领域都有广泛应用,例如分布式数据库、分布式文件系统等。
2.3、集群和分布式
介绍:
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据
和代码都是一样的。
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。
区别:
分布式:是以缩短单个任务的执行时间来提升效率的。
集群:则是通过提高单位时间内执行的任务数来提升效率,
三、LVS运行的原理
3.1、LVS基本概念
VS:Virtual Server(虚拟服务器):这是整个集群对外提供服务的统一入口,客户端通过访问虚拟服务器的 IP 地址来获取服务。
RS:Real Server(真实服务器):实际处理业务请求的服务器,它们组成了服务器集群,共同承担负载。
CIP:Client IP(客户端 IP):发起请求的客户端的 IP 地址。
VIP:Virtual Server IP(虚拟服务器 IP 地址):通常是一个对外公开的、可被客户端访问到的 IP 地址,代表了整个集群。
DIP:Director IP(调度器 IP 地址):即负载均衡器的 IP 地址,用于接收客户端请求并进行分配调度。
RIP:Real Server IP(真实服务器 IP 地址):集群中各真实服务器的 IP 地址。
例如,在一个网络架构中,客户端通过 VIP 访问服务,负载均衡器(VS)使用 DIP 接收请求,并将其分配到各个 RS 上,RS 使用 RIP 进行实际的业务处理。
LVS工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。
3.2、LVS集群的类型
类型:
类型 | 说明 |
lvs-net | 修改请求报文的目标IP,多目标IP的DNAT |
lvs-dr | 操纵封装新的MAC地址 |
lvs-tun (了解) | 在原请求IP报文之外新加一个IP首部 |
lvs-fullnat(了解) | 修改请求报文的源和目标IP |
3.2.1 LVS - NAT模式
-
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
-
RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
-
请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
-
支持端口映射,可修改请求报文的目标PORT
-
VS必须是Linux系统,RS可以是任意OS系统
3.2.1.1 NAT模式的数据逻辑:
1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口(9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口(9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端
6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发
因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
3.2.2 LVS-DR模式
DR 模式集群(Disaster Recovery Cluster) 是一种用于灾难恢复的集群模式。
在这种模式下,集群中的节点通常处于备用状态,随时准备在主节点发生故障或灾难时接管业务,以确保业务的连续性和数据的安全性。
例如,在金融行业,DR 模式集群可以在主数据中心遭受灾害时,迅速切换到备用数据中心,保障业务的正常运行。
3.2.2.1 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
3.2.2.2 DR模式的特点:
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定VIP和Director的MAC地址在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP在RS上修改内核参数以限制arp通告及应答级别
echo 1 > /proc/sys/net/ipv4/conf/all or (lo)/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all or (lo)/arp_announce4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
8.不支持端口映射(端口不能修败)
9.RS可使用大多数OS系统
3.2.2.3LVS- NAT模式和LVS - DR模式总结
NAT模式 | DR模式 | |
RS操作系统 | 不限 | 禁用arp |
调度器和服务器网络 | 可跨网络 | 不可跨网络 |
调度服务器数量服务器数量 | 少 | 多 |
RS服务器网关 | 指向到调度器DIP | 指向到路由 |
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
3.3 LVS的调度算法
根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法。
算法 | 说明 |
静态方法 | 仅根据算法本身进行调度,不考虑RS的负载情况 |
动态方法 | 主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度 |
3.3.1 静态调度算法
算法 | 说明 |
RR(roundrobin) | 轮询 RS分别被调度,当RS配置有差别时不推荐 |
WRR(Weighted RR) | 加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少 |
SH(Source Hashing) | 实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定 |
DH(Destination Hashing) | 目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商 |
3.3.2、动态调度算法
主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的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但是,当webserver1的权重为1,webserver2的权重为10,经过运算前几次的调度都会被node2承接 |
NQ(Never Queue) | 第一轮均匀分配,后续SED |
LBLC(Locality-Based LC) | 动态的DH算法,使用场景:根据负载状态实现正向代理 |
LBLCR(LBLC with Replication) | 带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 |
四、LVS部署命令介绍
4.1 所需软件信息
程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
4.2 集群中增删改参数
4.2.1 管理集群服务中的增删改:
参数 | 说明 |
-A | 添加 |
-E | 修改 |
-t | tcp服务 |
-u | udp服务 |
-s | 指定调度算法,默认为WLC |
-p | 设置持久链接超时,持久链接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver |
-f | firewall mask 火墙标记,是一个数字 |
增加:
[root@haproxy ~]# ipvsadm -A -t 192.168.0.50:80 -s rr
[root@haproxy ~]#
[root@haproxy ~]# 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.50:80 rr
[root@haproxy ~]# 修改:
[root@haproxy ~]# ipvsadm -E -t 192.168.0.50:80 -s wrr
[root@haproxy ~]#
[root@haproxy ~]#
[root@haproxy ~]# 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.50:80 wrr
[root@haproxy ~]# 删除:
[root@haproxy ~]# ipvsadm -D -t 192.168.0.50:80
[root@haproxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@haproxy ~]#
4.2.2 管理集群中RealServer的增删改:
参数 | 说明 |
-a | 添加realserver |
-e | 更改realserver |
-t | tcp协议 |
-u | udp协议 |
-f | 火墙标签 |
-r | realserver地址 |
-g | 直连路由模式 |
-i | ip隧道模式 |
-m | nat模式 |
-w | 设定权重 |
-Z | 清空计数器 |
-C | 清空lvs策略 |
-L | 查看lvs策略 |
-n | 不做解析 |
--rate | 输出速率信息 |
增加:
[root@haproxy ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.10:80 -m
[root@haproxy ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.20:80 -m -w 2
[root@haproxy ~]# 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.50:80 rr-> 192.168.0.10:80 Masq 1 0 0 -> 192.168.0.20:80 Masq 2 0 0 更改:
[root@haproxy ~]# ipvsadm -e -t 192.168.0.50:80 -r 192.168.0.10 -m -w 2
[root@haproxy ~]# 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.50:80 rr-> 192.168.0.10:80 Masq 2 0 0 -> 192.168.0.20:80 Masq 2 0 0
[root@haproxy ~]# 删除:
[root@haproxy ~]# ipvsadm -d -t 192.168.0.50:80 -r 192.168.0.10
[root@haproxy ~]# ipvsadm -d -t 192.168.0.50:80 -r 192.168.0.20
[root@haproxy ~]# 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.50:80 rr
五、LVS部署集群演示
5.1 部署NAT模式集群
- Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
- Web服务器采用仅主机网卡与director相连
- Web服务器网关指向192.168.0.100
- 后端web服务器不需要连接外网
5.1.1 实验环境:
主机 | IP | vip | 角色 |
lvs | 192.168.0.100 | 172.25.254.100 | 调度器 |
webserver1 | 192.168.0.10 | null | 真实服务器 |
webserver2 | 192.168.0.20 | null | 真实服务器 |
5.1.2 lvs配置:
yum install ipvsadm -y --- 安装软件ipvsadm
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf/ --- 启用内核路由,并写入配置文件
添加调度策略并查看
[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
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr-> 192.168.0.10:80 Masq 1 0 0 -> 192.168.0.20:80 Masq 1 0 0
[root@lvs ~]# systemclt stop firewalld查看策略另外的方式:
cat /proc/net/ip_vs
cat /proc/net/ip_vs_conn
5.1.3 webserver1配置:
yum install httpd -yecho webserver1 - 192.168.0.10 > /var/www/html/index.htmlsystemctl restart httpd
systemctl stop firewalld
5.1.4 webserver2配置:
yum install httpd -yecho webserver2 - 192.168.0.20 > /var/www/html/index.htmlsystemctl restart httpd
systemctl stop firewalld
5.1.5 lvs上面测试:
[root@lvs ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
上面的配置都是临时的,重启之后需要重新做。
这里web服务写的不一样是因为便于查看测试结果,企业中内容应该是一样的。
5.2 部署DR模式集群
5.2.1 实验环境
主机 | IP | VIP | 角色 |
client | NAT模式: ens160:172.25.254.200/24 | null | 测试主机 |
router | NAT模式: ens160:172.25.254.100/24 仅主机模式: ens224:192.168.0.100/24 | null | 路由器 |
lvs | 仅主机模式: ens224:192.168.0.50/24 | lo:192.168.0.200 | 调度器 |
webserver1 | 仅主机模式: ens224:192.168.0.10/24 | lo:192.168.0.200 | web1服务器 |
webserver2 | 仅主机模式: ens224:192.168.0.20/24 | lo:192.168.0.200 | web2服务器 |
5.2.1.1 clinent主机环境:
5.2.1.2 router主机环境:
5.2.1.3lvs主机环境:
5.2.1.4 webserver1主机环境:
5.2.1.5 webserver2主机环境:
5.2.2 配置要点:
- Director服务器采用双IP桥接网络,一个是VIP,一个DIP
- Web服务器采用和DIP相同的网段和Director连接
- 每个Web服务器配置VIP
- 每个web服务器可以出外网
- 所有主机都要关掉防火墙和selinux
5.2.2.1 解决vip响应问题:
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
- 在前端网关做静态绑定
- 在各RS使用arptables
- 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore:
级别 | 说明 |
0 | 默认值,表示可使用本地任意接口上配置的任意地址进行响应 |
1 | 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应 |
限制通告级别:arp_announce:
级别 | 说明 |
0 | 默认值,把本机所有接口的所有信息向每个接口的网络进行通告 |
1 | 尽量避免将接口信息向非直接连接网络进行通告 |
2 | 必须避免将接口信息向非本网络进行通告 |
5.2.1.2 router 配置:
sysctl -a | grep ip_forwrd ------ 查看内核路由是否启用
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf/ --- 启用内核路由,并写入配置文件
5.2.1.3 lvs配置:
设定vip
[root@lvs ~]# ip a a dev lo 192.168.0.200/32配置策略:
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@lvs ~]# 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.200:80 wrr-> 192.168.0.10:80 Route 1 0 0 -> 192.168.0.20:80 Route 2 0 0
[root@lvs ~]#
5.2.1.4 RS1和RS2配置:
在RS1和RS2中解决响应问题并设定VIP
[root@webserver1 ~]# ip a a dev lo 192.168.0.200/32
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# [root@webserver2 ~]# ip a a dev lo 192.168.0.200/32
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
5.2.1.5 client 测试效果:
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]#
5.3 防火墙标签解决轮询错误
5.3.1 轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题。
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。
问题展示:
在两台服务器中安装mod_ssl
[root@webserver1 ~]# dnf install mod_ssl -y
[root@webserver2 ~]# dnf install mod_ssl -y设置调度策略,因为我们要调度80和443两个端口所以我们需要设定两组策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[root@lvs ~]#
[root@lvs ~]# 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.200:80 rr-> 192.168.0.10:80 Route 1 0 0 -> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.200:443 rr-> 192.168.0.10:443 Route 1 0 0 -> 192.168.0.20:443 Route 1 0 0
[root@lvs ~]# 测试问题:
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
[root@client ~]#
访问vip时都到了相同的服务器
5.3.2 防火墙标记解决轮询调度问题
5.3.2.1 在lvs中设定端口标签:
为端口做标记:
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66查看是否做上标记:
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK 6 -- 0.0.0.0/0 192.168.0.200 multiport dports 80,443 MARK set 0x42Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@lvs ~]# 设置调度策略:
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
[root@lvs ~]#
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr-> 192.168.0.10:0 Route 1 0 0 -> 192.168.0.20:0 Route 1 0 0
[root@lvs ~]# 测试[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
[root@client ~]# 此时就解决了轮询错误问题。
5.4 lvs持久链接
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。
5.4.1 解决方法:
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上 。
ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒
在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]
[root@lvs ~]# ipvsadm -LnC
一般配合动态调度算法使用效果会好一些。
5.4.2 演示:
LVS中做:
[root@lvs ~]# ipvsadm -E -f 66 -s rr -p
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr persistent 360-> 192.168.0.10:0 Route 1 0 0 -> 192.168.0.20:0 Route 1 0 0
[root@lvs ~]#
测试:
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
webserver2 - 192.168.0.20
[root@client ~]# 此时就不是轮询错误,是因为设置了持久链接
删除持久链接:
[root@lvs ~]# ipvsadm -E -f 66 -s rr
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr-> 192.168.0.10:0 Route 1 0 0 -> 192.168.0.20:0 Route 1 0 0
[root@lvs ~]#
再轮询查看:
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
[root@client ~]#
相关文章:

LVS(Linux virual server)详解
目录 一、LVS(Linux virual server)是什么? 二、集群和分布式简介 2.1、集群Cluster 2.2、分布式 2.3、集群和分布式 三、LVS运行原理 3.1、LVS基本概念 3.2、LVS集群的类型 3.2.1 nat模式 3.2.2 DR模式 3.2.3、LVS工作模式总结 …...

Session共享方法
在Web开发中,会话(Session)管理是跟踪用户与服务器之间交互的一种常见方法。Session 共享通常指的是在一个应用集群或多个应用服务之间保持用户的会话状态一致。这在负载均衡、微服务架构或者分布式系统中尤为重要 一、基于SQL的session管理…...

Ubuntu 22.04 Docker安装笔记
1、准备一台虚机 可以根据《VMware Workstation安装Ubuntu 22.04笔记》来准备虚拟机。完成后,根据需求安装必要的软件,并设置root权限进行登录。 sudo apt update sudo apt install iputils-ping -y sudo apt install vim -y允许root ssh登录࿱…...

编程-设计模式 6:适配器模式
设计模式 6:适配器模式 定义与目的 定义:适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。目的:该模式的主要目的是解决接口不匹配的问题,使得一个…...

ERC721 概念解释
目录 FeaturesVotesAccess ControlUpgradeabilityFeatures Mintable: 允许创建新的代币(minting)。合约的所有者或有权限的账户可以调用 mint 函数来生成新的代币,并将其分配给指定的地址。 Auto Increment Ids:自动递增 ID。每次创建新的代币时,代币的 ID 会自动递增,确保…...

数据结构(其五)--串
目录 12.串 12.1 基本操作 12.2 串的存储结构 12.3 字符串的模式匹配算法 (1).朴素模式匹配算法 (2).KMP算法 i.next[]数组的求解 ii.next[]数组的优化——nextval数组 iii.手算nextval数组 iiii.机算nextval数组 + KMP函数 12.串 串,即字符串(string),由零个或多…...

LeetCode Hot100 LRU缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -…...

GESP C++ 2024年06月一级真题卷
一、单选题(每题 2 分,共 30 分) 第 1 题 在 C 中,下列不可做变量的是 ( ) 。 A. five-Star B. five_star C. fiveStar D. _fiveStar 答案:A 解析:标识符命名规则,标识符由字母、数…...

在 Ubuntu Server 上配置静态 IP 地址
在 Ubuntu Server 上配置静态 IP 地址 测试时使用的Ubuntu server版本是22.04 一、Ubuntu 17.10之前版本 使用 ifupdown 配置文件来设置静态 IP。配置文件通常位于 /etc/network/interfaces。 1.1 编辑 /etc/network/interfaces 文件: sudo vim /etc/network/in…...

数据结构——栈的讲解(超详细)
前言: 小编已经在前面讲完了链表和顺序表的内容,下面我们继续乘胜追击,开始另一个数据结构:栈的详解,下面跟上小编的脚步,开启今天的学习之路! 目录 1.栈的概念和结构 1.1.栈的概念 1.2.栈的结构…...

三防平板助力MES系统,实现工厂移动式生产报工
在当今竞争激烈的制造业环境中,提高生产效率、优化生产流程以及实现精准的生产管理已经成为企业生存和发展的关键。 MES系统作为连接企业计划层和控制层的桥梁,在实现生产过程的信息化、数字化和智能化方面发挥着重要作用。与此同时,三防平板…...

WEB渗透Bypass篇-常规函数绕过
常规函数绕过 <?php echo exec(whoami);?> ------------------------------------------------------ <?php echo shell_exec(whoami);?> ------------------------------------------------------ <?php system(whoami);?> ------------------------…...

C++从入门到起飞之——string类的模拟实现 全方位剖析!
🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1、多文件之间的关系 2、模拟实现常用的构造函数 2.1 无参构造函数 2.2 有参的构造函数 2.3 析构函…...

数据库国产化大趋势下,还需要学习Oracle吗?
由于众所周知的原因,近两年各行各业都开始了数据库国产化替代的进程,从国外商业数据库替换到国产或者开源数据库,相信很多的数据库从业人员会把部分精力转移到其他数据库产品的学习中,也有一些人在大肆的宣扬Oracle已经过时了&…...

WebLogic
二、WebLogic 2.1 后台弱口令GetShell 漏洞描述 通过弱口令进入后台界面,上传部署war包,getshell 影响范围 全版本(前提后台存在弱口令) 漏洞复现 默认账号密码:weblogic/Oracle123weblogic常用弱口令: Default Passwords | CIRT.net这里注意&am…...

Aspose.Words.dll 插入模板表格,使用的是邮件合并MailMerge功能,数据源是DataTable或list对象,实例
本实例中的实例功能有: 1、 Aspose.Words.dll 插入模板指定域替换为文字或html标签,见1 2、Aspose.Words.dll 插入模板表格,使用的是邮件合并MailMerge功能,数据源是DataTable或List对象(将list转换成DataTable),见1和2 3、word转换Pdf文件,见1 4、将多个word输出文…...

同时打开多个微信
注: 以下方法用到的 D:\微信\WeChat\WeChat.exe是我的电脑微信路径,可右击桌面微信快捷方式 > 属性 > 目标查看 以下方法都需要先关掉已登录的微信后操作 <一> 找到微信路径 新建一个txt文件输入以下内容 start D:\微信\WeChat\WeChat.exe …...

MPU6050的STM32数据读取
目录 1. 概述2. STM32G030对MPU6050的读取3. STM32F1xx对MPU6050的读取 1. 概述 项目中,往往需要根据不同的环境使用不同的芯片处理某些数据,当使用不同的芯片对六轴陀螺仪芯片MPU6050进行数据处理中,硬件的连接、I/O口的设置往往需要根据相…...

【微信小程序开发】——奶茶点餐小程序的制作(二)
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...

Java 文件上传七牛云
Java系列文章目录 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 新建空间4.2 查找密钥4.3 进入开发者中心查找JavaSDK文档4.4 查找文件上传方法4.5 运行测试 五、总结:5.1 学习总结: 一、前言 学…...

大语言模型生成无人系统(如机械臂、无人机等)可以执行的指令序列
大语言模型生成无人系统(如机械臂、无人机等)可以执行的指令序列涉及将自然语言指令转化为具体的、可执行的指令集合。以下是一个详细的流程,展示了如何从自然语言指令生成无人系统的执行指令序列。 1. 输入自然语言指令 用户输入自然语言指…...

尚硅谷谷粒商城项目笔记——十、调试前端项目renren-fast-vue【电脑CPU:AMD】
十、调试前端项目renren-fast-vue 如果遇到其他问题发在评论区,我看到后解决 1 先下载安装git git官网下载地址 2 登录gitee搜索人人开源找到renren-fast-vue复制下载链接。【网课视频中也有详细步骤】 3 下载完成后桌面会出现renren-fast-vue的文件夹 4 开始调…...

Python 的元组和列表的区别是什么?
以下是 Python 中元组(tuple)和列表(list)的主要区别: 1. 语法表示:元组使用小括号 () 来定义,例如 (1, 2, 3) ;列表使用方括号 [] 来定义,例如 [1, 2, 3] 。 2. 可变性…...

【Impala】学习笔记
Impala学习笔记 【一】Impala介绍【1】简介(1)简介(2)优点(3)缺点 【2】架构(1)Impalad(守护进程)(2)Statestore(存储状态…...

视频汇聚平台EasyCVR接入移动执法记录仪,视频无法播放且报错500是什么原因?
GB28181国标视频汇聚平台EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。视频智能分析平台EasyCVR支持多协议接入,兼容多类型的设备,包括IPC、NV…...

【Linux基础】Linux基本指令(二)
目录 🚀前言一,mv指令二,more & less指令2.1 more 指令2.1 less指令 三,重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四,head & tail指令4.1 head 指令4.2 t…...

全面介绍 Apache Doris 数据灾备恢复机制及使用示例
引言 Apache Doris 作为一款 OLAP 实时数据仓库,在越来越多的中大型企业中逐步占据着主数仓这样的重要位置,主数仓不同于 OLAP 查询引擎的场景定位,对于数据的灾备恢复机制有比较高的要求,本篇就让我们全面的介绍和示范如何利用这…...

Python pandas常见函数
Pandas库 基本概念读取数据数据处理数据输出其他常用功能 pip install pandas基本概念 数据结构 Series: 一维数据结构 import pandas as pd data pd.Series([10, 20, 30, 40], index[a, b, c, d]) print(data)DataFrame: 二维数据结构 data {Name: [Alice, Bob, Charlie],Ag…...

行业落地分享:阿里云搜索RAG应用实践
最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…...

【SQL】温度比较
目录 题目 分析 代码 题目 表: Weather ------------------------ | Column Name | Type | ------------------------ | id | int | | recordDate | date | | temperature | int | ------------------------ id 是该表具有唯…...