老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

深入浅出 | 阿里巴巴处理千万并发访问利器——LVS

老男孩IT教育

行业新闻

2023年6月15日 17:48

LVS是linux Virtual server的缩写,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能。

  本文目录

  LVS 负载均衡集群简介

  LVS 负载均衡发展历史

  LVS 负载均衡层次结构

  LVS 负载均衡工作原理

  LVS 负载均衡工作模式

  LVS 负载均衡调度算法

  1.1 LVS负载均衡集群简介

  LVS是linux Virtual server的缩写,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能;

  该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。

  相关官方资料链接如下:

  1.2 LVS负载均衡发展历史

  早在Linux系统发布2.2内核时,LVS服务的核心组件IPVS,就已经以内核补丁的形式出现

  从2.4.23版本开始,IPVS软件就已经合并到linux内核的常用版本的内核补丁集合

  从2.4.24以后IPVS已经成为linux官方标准内核的一部分。

  利用LVS实现负载均衡功能时,系统内核中的IPVS才是linux中真正实现负载均衡调度工具。

  1.3 LVS负载均衡层次结构

  从下图可知,LVS负载均衡调度技术是在linux内核中实现的,因此被称为linux虚拟服务器(linux virtual server)

  使用LVS实现负载均衡功能时,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理;

  或者通过keepailived软件直接管理ipvs。

  1.4 LVS负载均衡工作原理

  LVS集群负载均衡服务接受所有入站客户端请求,并根据调度算法决定哪个节点应该处理回复请求。

  负载均衡器(简称LB)也被称为LVS Director(简称 director);

  LVS虚拟服务器的体系结构如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接;

  在它们的前端有一个负载调度器,负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的;

  客户访问集群系统提供的网络服务,就像访问一台高性能、高可用的服务器一样。

  客户端程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到;

  通过检测节点或服务进程故障和正确地重置系统达到高可用性。

  负载均衡网站架构组成部分术语解释:

  LVS集群内部的节点称为真实服务器(real server),也叫做集群节点,请求集群服务的计算机称为客户端计算机;

  与计算机通常在网上交换数据包方式相同,客户端计算机,Director和真实服务器使用IP地址彼此进行通信。

  1.5 LVS负载均衡工作模式

  LVS负载均衡在进行部署使用时,具有3种常见的工作模式会应用在不同企业场景,具体工作模式为:

  工作模式01:TUN

  工作模式02:DR

  工作模式03:NAT

  01 Tun

  英文全称为Tunneling。

  强调说明:

  在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)

  TUN模式工作流程:

  1、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。

  此时报文的源IP为CIP,目标IP为VIP。

  2、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链

  3、IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,

  封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。

  此时源IP为DIP,目标IP为RIP

  4、POSTROUTING链根据最新封装的IP报文,将数据包发至RS;

  因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输;

  此时源IP为DIP,目标IP为RIP

  5、RS接收到报文后发现是自己的IP地址,就将报文接收下来,

  拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,此时RS开始处理此请求,

  处理完成之后,通过lo接口送给eth0网卡,然后向外传递。

  此时的源IP地址为VIP,目标IP为CIP

  6、响应报文最终送达至客户端

  TUN模式工作总结:

  1、负载均衡器通过把请求的报文通过IP隧道(ipip隧道)的方式请求的报文不经过源目的地址的改写(包括mac)。

  而是直接封装成另外的IP报文转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户

  2、由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。

  理论上:只要能出网即可,无需外网IP地址

  3、由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定的系统开销。

  TUN模式适合LAN/WAN

  4、TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题

  5、所有的RS服务器都要绑定VIP,抑制ARP,配置复杂

  6、LAN环境一般多采用DR模式,WAN环境可以用TUN模式

  但是当前在WAN环境下请求转发更多的被haproxy/nginx/DNS调度等代理取代。

  因此,TUN模式在国内公司实际应用的已经很少。

  7、直接对外的访问业务,例如:web服务做RS节点,最好用公网IP地址。

  不直接对外的业务,例如:mysql存储系统RS节点,最好用内部IP地址。

  02 DR

  英文全称为Direct Routing。

  强调说明:

  Virtual Server via Direct Routing(VS/DR)模式是通过改写请求报文的目标mac地址,将请求发给真实服务器的;

  而真实服务器将响应后的处理结果直接返回给客户端用户,即不经过负载均衡器本身了。

  同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。

  而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求

  DR模式工作流程:

  1、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP。

  2、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链

  3、IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,

  将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。

  此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址

  4、由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,

  那么此时数据包将会发至Real Server。

  5、RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。

  处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。

  此时的源IP地址为VIP,目标IP为CIP

  6、响应报文最终送达至客户端

  DR模式工作总结:

  1、通过在调度器LB上修改数据包的目的MAC地址实现转发源IP地址仍然是CIP,目的IP地址仍然是VIP

  2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式比)

  3、至于DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)

  4、需要注意RS节点的VIP绑定(lo:vip)和ARP抑制问题

  5、强调下:RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP

  (这是RS带有外网IP地址的情况)理论讲,只要RS可以出网即可,不是必须要配置外网IP

  6、由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度LB无法改变请求的报文的目的端口(和NAT要区别)

  7、当前调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持windows,真实服务器RS节点可以是windows系统

  8、总的来说DR模式效率很高,但是配置也比较麻烦。因此,访问量不是特别大的公司可以用haproxy/nginx取代之

  (日2000W PV或并发请求1W以下都可以考虑用haproxy/nginx(LVS NAT模式))

  9、直接对外的访问业务,例如 web服务做RS节点,RS最好用公网IP地址,如果不直接对外的业务,

  例如 mysql存储系统RS节点,最好只用内部IP地址

  03 NAT

  英文全称为Network Address Translation。

  强调说明:

  修改目标IP地址为挑选出的RS的IP地址。

  NAT模式工作流程:

  1、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。

  此时报文的源IP为CIP,目标IP为VIP。

  2、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链

  3、IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,

  然后将数据包发至POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP

  4、POSTROUTING链通过选路,将数据包发送给Real Server

  5、Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。

  此时报文的源IP为RIP,目标IP为CIP

  6、Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。

  此时报文的源IP为VIP,目标IP为CIP

  NAT模式工作总结:

  1、NAT技术将请求的报文(DNAT)和响应的报文(SNAT),通过调度器地址重写然后在转发给内部服务器,报文返回时在改写成原来的用户请求的地址。

  2、只需要在调度器LB上配置wan公网IP即可,调度器也要有私有LAN IP和内部RS节点通信

  3、每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB

  4、由于请求与相应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。

  5、NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换得到RS节点的10.0.0.2:8080

  (DR和TUN模式不具备的)

  6、所有NAT内部RS节点只需配置私有LAN IP即可

  7、由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1

  1.6 LVS负载均衡调度算法

  LVS的调度算法决定了如何在集群节点之间分布工作负荷;

  当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。

  Director调度器可用于做出该决定的调度方法成两个基本类型:

  固定调度方法:rr wrr dh sh

  动态调度算法:wlc lc lblc SED NQ

  固定调度方法解释说明:

  01 rr(轮询调度)

  全称为Round-Robin。

  将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简单,但是只适合于RS节点处理性能相差不大的情况。

  02 wrr(加权轮询调度)

  全称为weighted Round-Robin。

  将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到连接数将比权值较低的RS节点更多;

  相同权值的RS得到相同数目的连接数。

  03 dh(目的地址哈希调度)

  全称为Destination Hashing。

  以目的地址为关键字查找一个静态hash表来获得需要的RS。

  04 sh(源地址哈希调度)

  全称为Source Hashing。

  以源地址为关键字查找一个静态hash表来获得需要的RS

  动态调度方法解释说明:

  01 wlc(加权最小连接数调度)

  全称为weighted least-Connection。

  假设各台RS的权值依次为Wi(I=1..n),当前的TCP连接数依次为Ti(I=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS

  02 lc(最小连接数调度)

  全称为least-connection。

  IPVS表存储了所有的活动的连接,把新的连接请求发送到当前连接数最小的RS

  03 lblc(基于地址的最小连接数调度)

  全称为locality-based least-connection。

  将来自同一目的地址的请求分配给同一台RS节点,如果这台服务器尚未满负荷,分配给连接数最小的RS,并以它为下一次分配的首先考虑

  04 SED(最短的期望的延迟)

  全称为shortest expected delay scheduling SED,基于wlc算法

  举例说明ABC三台机器分别权重123,连接数分别是123,那么如果使用wlc算法的话一个新请求进入时他可能会分给ABC中任意一个。

  使用sed算法后进行这样一个运算A(1+1)/1 B(1+2)/2 C(1+3)/3,根据运算结果,把连接交给C

  05 NQ(最少队列调度)

  全称为never queue scheduling NQ,无需队列

  如果有台realserver的连接数=0就直接分配过去,不需要再进行sed运算

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。