当前位置: 首页 > news >正文

浅谈LVS

  • 一、集群的概念与分类
  • 二、lvs介绍
  • 三、lvs结构
  • 四、LVS内核模型
  • 五、LVS的包转发模型
    • 1.NAT模型
    • 2.DR模型
    • 3.TUN模型
  • 六、lvs调度算法
    • 1、静态算法(4种)
    • 2、动态算法(6种)

一、集群的概念与分类

以下内容,个人理解,可能有错误与不足,望指正。

集群(cluster),从字面上就知道,集与群都是多的概念。集群就是多台机器组合在一起共同完成一个需求。

集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。集群不是简单的机器相加,它实现一种1+1远大于2的目的。
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。

集群分类:

集群分为同构与异构两种,它们的区别在于:组成集群系统的计算机之间的体系结构是否相同。集群计算机按功能和结构可以分成以下几类:
高可用性集群High-availability (HA) clusters
负载均衡集群Load balancing clusters
高性能计算集群High-performance(HPC)clusters
网格计算Grid computing

高可用性集群(HA)
高可用,意思是提供服务的可用,高可用,就是服务一直可用。 一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。还指可以将集群中的某节点进行离线维护再上线,该过程并不影响整个集群的运行。高可用的软件有keepalived,
负载均衡集群(LB)
负载均衡集群运行时,一般通过一个或者多个前端负载均衡器,将工作负载分发到后端的一组服务器上,从而达到整个系统的高性能和高可用性。这样的计算机集群有时也被称为服务器群(Server Farm)。一般高可用性集群和负载均衡集群会使用类似的技术,或同时具有高可用性与负载均衡的特点。
Linux虚拟服务器(LVS)项目在Linux操作系统上提供了最常用的负载均衡软件。提供负载均衡的软件很多,比如haproxy,nginx,apache,lvs
高性能计算集群(HP)
高性能计算集群采用将计算任务分配到集群的不同计算节点而提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPC cluster的并行能力。这类程序一般应用特定的运行库,比如专为科学计算设计的MPI库。
HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其它节点计算结果的情况。
网格计算
网格计算或网格集群是一种与集群计算非常相关的技术。网格与传统集群的主要差别是网格是连接一组相关并不信任的计算机,它的运作更像一个计算公共设施而不是一个独立的计算机。还有,网格通常比集群支持更多不同类型的计算机集合。
网格计算是针对有许多独立作业的工作任务作优化,在计算过程中作业间无需共享数据。网格主要服务于管理在独立执行工作的计算机间的作业分配。资源如存储可以被所有节点共享,但作业的中间结果不会影响在其他网格节点上作业的进展。

二、lvs介绍

​ Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为此,必须采用多服务器和负载均衡技术才能满足大量并发访问的需要。Linux 虚拟服务器(Linux Virtual Servers,LVS) 使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案 。

​ lvs( Linux Virtual Server),意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。已经是整合在linux内核中 , LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。由于lvs是工作的网路4层(网络层)基础上,相比于haproxy和nginx等工作在7层上,性能更好,当然,也有自己的弊端,对一些应用层上的更细颗粒度的过滤就相对弱一点。

三、lvs结构

​ LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。

​ LVS是整合在linux中,配合linux的iptables一起工作的,LVS集群采用IP负载均衡技术和基于内容请求分发技术。

在上图中,Director Server就是调度器,负责将请求分发到后面的RS(Real Sever),RS处理具体的逻辑。

四、LVS内核模型

lvs工作的内核模式中,lvs借助iptable的钩子函数。

1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。

2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。

3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。

4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。

5.最后经由POSTROUTING链发往后端服务器。

五、LVS的包转发模型

1.NAT模型:

这里的NAT(network address Translate)模式,相当于iptables中的NAT模式,就是在director server中修改了ip包中的地址信息。

1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。

3.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

4.然后lvs将此报文的源地址修改为本机并发送给客户端。注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端。

优点:RS不需要公网ip,RS与外界公网是分开的

​ 请求进出都是通过Director Server,进行地址转换,对数据统计,审计过滤等。

缺点:

​ 数据进出都是经过DS,对DS的压力很大。

2.DR模型

DR(direct route)直接路由


​ DR模型就是解决NAT中DS负载压力大的问题,由图中可以看出,数据的请求才会经过DS,数据返回是直接由RS返回给用户。

1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。

3.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

​ 注意:需要设置lo接口的VIP不能响应本地网络内的arp请求。

优点: 一个DS可以负载更多的RS

缺点:

RS需要公网ip和内网ip

3.TUN模型

TUN模型就是DR模型上加了一层隧道。

1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

3.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意:需要设置lo接口的VIP不能在共网上出现

六、lvs调度算法

调度算法就是,前端一个请求到达DS,DS将这个请求发送给后端哪个RS.

LVS的调度算法分为静态与动态两类。

1、静态算法(4种)

只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况

.RR:轮叫调度(Round Robin)
  调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。轮流分配请求。

②.WRR:加权轮叫(Weight RR)
  调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③.DH:目标地址散列调度(Destination Hash )
  根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

④.SH:源地址 hash(Source Hash)
  源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

2、动态算法(6种)

前端的调度器会根据后端真实服务器的实际连接情况来分配请求

①.LC:最少链接(Least Connections)
  调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

②.WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
  在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③.SED:最短延迟调度(Shortest Expected Delay )
  在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

.NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
  无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

⑤.LBLC:基于局部性的最少链接(locality-Based Least Connections)
  基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

⑥. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
  带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

相关文章:

  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • python开发 *进程数据隔离.守护进程,进程同步工具 * 180725
  • 磁条卡,IC卡,ID卡,信用卡芯片卡,信用卡磁条卡 等等的区别
  • AI时代,APP运营是否会被淘汰
  • 初到湾区
  • android进程防杀套路【转】
  • 老K漫谈区块链的共识(1)——免信任的共识机制
  • 【Oracle】在win10上安装Oracle客户端报错:[INS-13001]环境不满足最低要求
  • Python、Linux与我的缘分
  • NSString 字符串
  • md5sum
  • jdbc就是这么简单
  • PhotoPickerDemo【PhotoPicker0.9.8的个性化修改以及使用(内部glide版本号是3.7.0)】...
  • php中类文件名的命名的规则是什么
  • Vue组件定义
  • HTTP 简介
  • Javascript设计模式学习之Observer(观察者)模式
  • Java小白进阶笔记(3)-初级面向对象
  • JS专题之继承
  • Laravel 中的一个后期静态绑定
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • magento 货币换算
  • mockjs让前端开发独立于后端
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • mysql_config not found
  • MySQL数据库运维之数据恢复
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • session共享问题解决方案
  • Shell编程
  • Spring Cloud中负载均衡器概览
  • VuePress 静态网站生成
  • vue脚手架vue-cli
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 复杂数据处理
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何解决微信端直接跳WAP端
  • 7行Python代码的人脸识别
  • 阿里云ACE认证之理解CDN技术
  • 整理一些计算机基础知识!
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ###C语言程序设计-----C语言学习(6)#
  • (LeetCode 49)Anagrams
  • (LeetCode) T14. Longest Common Prefix
  • (分类)KNN算法- 参数调优
  • (附源码)php新闻发布平台 毕业设计 141646
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十三)Flask之特殊装饰器详解
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .bat批处理出现中文乱码的情况
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net6Api后台+uniapp导出Excel
  • .net反编译工具