一、LVS
全称 Linux Virtual Server,四种模式,十三种算法
二、什么是集群
集群(Cluster)是指将多台独立的计算机(服务器)通过网络连接在一起,协同工作,对外表现为一个统一的系统。同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的
三、集群分类
1、高可用集群(HA Cluster)
服务永不中断。当某个节点故障时,自动把服务迁移到其他健康节点,多节点服务器随时代替。
2、负载均衡集群(LB Cluster)
横向扩展处理能力。把大量并发请求分摊到多个节点并行处理,提升整体吞吐量。
3、高性能计算集群(HPC Cluster)
极致算力。将一个大任务拆分成无数小任务,分发给成百上千个节点并行计算,最后汇总结果。
分布式一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。
分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率
四、LVS 的作用
LVS 全称 Linux Virtual Server,是 Linux 内核层实现的高性能、高可用 的负载均衡集群技术,由章文嵩博士开发,目前是 Linux 内核的标准模块 之一。
它的核心作用是将前端的请求流量分发到后端多台真实服务器 (Real Server)上,从而提升服务的并发处理能力和可用性。
五、lvs的4种模式及原理
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的调度机容易阻塞
2、DR 模式
调度器只修改数据包的目标 MAC 地址,IP 层不变。Real Server 收到后,因为目标 IP 就是自己的 VIP(lo 接口上配了 VIP),直接处理。响应包由 Real Server 直接发给 Client,不经过 Director。
3、TUN 模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)
4、Full-NAT 模式![]()
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默认不支持
四、lvs13种算法
静态
1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态
1、LC:least connections(最少链接发)
适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
2、WLC:Weighted LC(权重最少链接)
默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3、SED:Shortest Expection Delay,
初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
新增
1.FO(Weighted Fai Over)调度算法:常用作灰度发布
在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F OVERLOAD标志)的且权重最高的真实服务器,进行调度
当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。
2.OVF(Overflow-connection)调度算法
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
未过载(未设置IP_VS_DEST_F OVERLOAD标志)
真实服务器当前的活动连接数量小于其权重值
其权重值不为零
五、防火墙标签解决轮询错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题 当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
问题复现
RS1+RS2
#在RS1和RS2中开启https
[root@RS1+RS2 ~]# dnf install mod_ssl -y
[root@RS1+RS2 ~]# systemctl restart httpd
Lobster AI
cpp
运行
在vsnode中添加https的轮询策略
[root@vs1 ~]# ipvsadm -A -t 192.168.0.100:443 -s rr
[root@vs1 ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.10:443 -g
[root@vs1 ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.20:443 -g
[root@vs1 ~]# 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.100:80 rr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 1 0 0
TCP 192.168.0.100:443 rr
-> 192.168.0.10:443 Route 1 0 0
-> 192.168.0.20:443 Route 1 0 0
Lobster AI
cpp
运行
轮询错误展示
解决方案:
使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载
运行
![]()
六、lvs持久链接
lvs的会话粘滞解决方案
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单 纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单 粗暴,可能会导致调度失衡
解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把 这个源的主机调度到了那个RS上
如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。
如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
设定ipvs调度策略