lvs的四种调度类型和调度算法介绍

lvs是linux内核级的负载均衡解决方案,作为netfilter的补充套件,其工作在INPUT hook上。

相比nginx等负载均衡解决方案的差异如下:

  • lvs工作于内核空间,不受用户空间套接字和端口数量的限制,而且所有调度工作在内核空间完成,效率更高;

  • nginx为七层负载均衡器,虽然通过stream模块也可以做到四层负载均衡,但是受到套接字数量限制,而且性能不如lvs;

此文章只讨论lvs的四种调度类型和调度算法。

一、lvs集群的类型:

在介绍lvs类型工作原理之前先引入如下概念:

  • CIP:客户端ip地址

  • RIP:后端服务器ip地址

  • VIP:lvs负载均衡器面向客户端的ip地址

  • DIP:lvs负载均衡器面向后台服务器的ip地址

  • VS:lvs负载均衡器

  • RS:后端提供服务的服务器

lvs集群分为如下4种类型:

  • lvs-nat

  • lvs-dr

  • lvs-tun

  • lvs-fullnat

分别详细介绍4种类型的工作原理:

  1. lvs-nat工作原理介绍:

    通过名字大概也可以看出来,此类型和iptables的dnat类型很相似。不过iptables的dnat只能把访问某地址的请求转发到某一台特定的服务器。而lvs-nat却可以通过调度算法把用户请求转发至后台的服务器集群中的某一台,所以lvs-nat可以理解为面向多目标的dnat。

    其工作原理如下:

    client请求vs的vip –> 数据到达INPUT链 –> 源ip保持不变,匹配lvs规则,目标ip通过调度算法变为后台某一台RS的RIP –> 后台RS发起响应报文(源地址为RIP,目的地址为DIP) –> VS把数据包发送给客户端(源地址VIP,目标地址CIP)

  2. lvs-dr工作原理介绍:

    lvs-nat存在一个问题:所有的请求和响应报文都需要经过负载均衡器做转发,这样会导致负载均衡器压力过大,而且效率不高。所以如果能够让后台服务器直接响应客户端效率会提高不少。因此诞生了lvs-dr的方式。lvs-dr会在请求报文再封装一个MAC地址首部用于同一网段通信,而且所有的RS都需要配置VIP的地址。

    所有RS都配置vip则会存在ip地址冲突,所有需要如下方法解决:

    • 在前端网关做静态地址绑定,不够灵活,不可取;

    • 通过arptable做配置,过于繁琐;

    • 通过修改linux内核参数来禁止相同ip的网卡做arp的通告和回应;

    lvs-dr的负载均衡器和后台服务器位于同一网段,其工作过程如下:

    客户端发送请求报文到负载均衡器(源ip:CIP,目标ip:vip)–> 负载均衡器在请求报文封装MAC首部,源MAC为dip,目标MAC为某一台RS,源ip和目标ip和端口都保持不变 –> RS通过本机vip地址给客户端发送响应报文。

  3. lvs-tun工作原理:

    当RS分布于不同地点的多个机房的时候lvs负载均衡器则无法完成工作的调度,所有需要lvs-tun来进行工作。

    注意:

    lvs-tun的所有RS也都需要配置VIP用于发送响应报文。

    lvs-tun是在请求报文又封装了一层ip报文用于隧道传输,工作方法如下:

    客户端发送请求到lvs负载均衡器(源ip:CIP,目标ip:VIP)–> 通过调度算法选定一台公网上的RS,然后在请求报文外再封装一层ip首部,源ip为DIP,目标IP为RIP –> RS接收到报文,拆包得到原始请求报文(源ip:CIP,目标ip:VIP),然后用本机的VIP发送响应报文到CIP完成通信。

  4. lvs-fullnat工作原理:

    lvs-fullnat不是lvs内置的一种调度机制,需要编译安装。lvs-fullnat会修改报文的源ip和目标ip,也可以用于公网通信。

    工作原理如下:

    客户端发送请求到lvs(源ip:CIP,目标ip:VIP)–> lvs根据调度机制发送报文到挑选的RS(源ip:DIP,目标IP:RIP)–> RS发送响应报文(源IP:RIP,目标IP:DIP)–> lvs转发响应报文到客户端(源IP:VIP,目标ip:CIP)–> 通信完成。

二、lvs调度算法

lvs调度算法按照是否计算后台服务器的负载分为动态方法和静态方法:

静态方法:

  • RR:轮询

  • WRR:加权轮询,根据服务器的权重去做轮询

  • SH:用于session保持,将来自同一ip的请求都发往该ip第一次请求的RS,用于保持会话;

  • DH:发送到同一目的地址的请求都发送到指定的RS服务器,常用于正向代理的缓存场景。如:一个企业有两条外网线路,每个外网线路的网关都有缓存,如果采用轮询机制通过两个网关进行网络访问,则网关缓存命中率太低,所有把发往某一指定目标ip的所有请求都发送到指定的网关则提高网关缓存命中率。

动态方法:

  • LC:最少连接,把请求发送给连接最少的服务器,公式:Overhead=activeconns*256+inactiveconns

  • WLC:加权最少连接,按照服务器权重和服务器的连接数分配连接。但是,如果两台服务器连接都为0,则按照轮询,权重高的服务器无法发挥最佳效率,公式:Overhead=(activeconns*256+inactiveconns)/weight

  • SED:最短延迟,当连接都为0的时候,优先由权重高服务器的来处理。但是如果权重相差较大,则权重低的服务器则会闲置。公式:Overhead=(activeconns+1)*256/weight

  • NQ:never queue,永不排队,如果负载一直,则到来的请求按照权重从大到小每个都分配一个负载。之后再按照SED算法进行工作。

  • LBLC:动态DH算法,新到来的未绑定的请求按照服务器负载来进行调度绑定。

  • LBLR:带复制功能的LBLC算法,即缓存复

原创文章,作者:王子豪,如若转载,请注明出处:http://www.178linux.com/78527

(1)
王子豪王子豪
上一篇 2017-06-25 18:58
下一篇 2017-06-25 21:31

相关推荐

  • yum命令的使用及磁盘管理中命令的使用方法(mkfs ,blkid,e2label等)

    yum      #cd /etc/yum.repos.d          #yum repolist(在 #cd下)其他命令在 #cd /etc/yum.repos.d运行          #yum-config-manag…

    2017-08-19
  • 磁盘管理(三)逻辑卷快照

      概述:逻辑卷管理(LVM)提供了为任何逻辑卷作一个快照的功能,目的是在一致的状态下来得到一个文件系统的备份.因为在备份过程中,应用程序可能访问一个分区的文件或者数据库.一些文件可能在一个状态被备份,而后面的文件可能在一个更新后被备份,导致备份的不完整 .传统的解决方法是以只读的方式挂载一个分区,对数据库应用表级锁或者关闭数据库的引擎等;所有的措…

    Linux干货 2016-09-05
  • OpenStack私有云部署

    前言 相信你一定对“云主机”一词并不陌生吧,通过在Web页面选择所需主机配置,即可快速定制一台属于自己的虚拟主机,并实现登陆操作,大大节省了物理资源。但这一过程是如何实现的呢?本文带来OpenStack Icehouse私有云实战部署。 OpenStack 简介 OpenStack是由网络主机服务商Rackspace和美国宇航局联合推出的一个开源项目,Ope…

    2016-12-19
  • LVM逻辑卷管理器详解

    一、LVM简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现。LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。…

    Linux干货 2016-09-05
  • ☞Linux进程管理与性能分析

    Linux进程管理与性能分析 概述 系统维护的一个重要工作就是监控Linux系统的运行状态是否正常,分析系统资源的使用情况,进而对系统进行优化,提高其性能。在实际环境中,系统稳定性尤为重要,可以说系统的稳定性关系到企业的存亡。因此,第一时间掌握CPU、Memory、IO、Network的等系统资源的状态则可以在系统出现问题时及时解决,把损失降到最低。&nbs…

    Linux干货 2016-09-11
  • 浅谈Android应用HTTP框架选型

    我们知道,Android应用主要是通过客户端-服务器的方式进行数据交互,一般在APP开发时可能是一个接口对应一个显示模块,这样的设计会让客户端更新时很麻烦。为了解决这个问题,通常的做法是和服务端之间定义协议,设计显示模式,进而达到实时更新UI界面的目的,增加或删除显示模块时不需要让用户手动更新apk,这种方法最常见的就是在做活动或者广告的时候用到。以我们的优…

    2016-06-22