vlambda博客
学习文章列表

LVS系列教程03-IP负载均衡技术

关注「开源Linux」,选择“设为星标”
回复「学习」,有我为您特别筛选的学习资料~
开源Linux
欢迎来到『开源Linux』,这里是国内专业Linux技术社区。专注分享Linux/Unix相关内容,包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货。后台回复『读书』,有我为您特别筛选的书籍资料~
65篇原创内容
Official Account

前言

之前我们讲述了可伸缩网络服务的几种结构,它们都需要一个前端调度器。在调度器的实现技术中,IP 负载均衡技术是效率最高的。下面将描述三种 IP 负载均衡技术 :VS/NATVS/DRVS/TUN的工作原理,以及它们的优缺点。

VS/NAT

大多数商品化的 IP 负载均衡调度器产品都是使用此方法,如CiscoLocalDirectorF5Big/IP

VS/DR:

通过直接路由实现虚拟服务器的方法,将一组服务器构成一个高性能的、高可用的虚拟服务器

VS/TUN:

通过IP 隧道实现虚拟服务器的方法,将一组服务器构成一个高性能的、高可用的虚拟服务器

LVS系列教程03-IP负载均衡技术

一、实现框架

系统实现的若干问题可以查看官方文档的说明。

LVS官方文档:http://zh.linuxvirtualserver.org/node/58

在Linux内核2.0和内核2.2的版本中,通过修改了TCP/IP协议栈,在IP层截取和改写/转发IP报文,实现了三种IP 负载均衡技术,并提供了一个ipvsadm程序进行虚拟服务器的配置和管理。而在Linux内核2.42.6中,把它实现为NetFilter的一个模块,很多代码作了改写和进一步优化,已经较稳定。

LVS系列教程03-IP负载均衡技术

系统的主要功能模块如上图所示,“VS Schedule & Control Module”是虚拟服务器的主控模块,它挂接在IP报文遍历的LOCAL_IN链和IP_FORWARD链两处,用于截取/改写 IP 报文;“VS Rules Table”用于存放虚拟服务器的规则,“Connections Hash Table”表是用于记录当前连接的Hash表;“Stale Connection Collector”模块用于回收已经过时的连接;“Statistics Data”表记录IPVS的统计信息。用户空间的ipvsadm管理程序通过setsockopt()函数将虚拟服务器的规则写入“VS Rules Table”表中,通过/proc文件系统把“VS Rules Table”表中的规则读出。

连接的Hash 表可以容纳几百万个并发连接,在Linux内核2.2和内核2.4的IP虚拟服务器版本中每个连接只占用128Bytes有效内存,例如一个有256M可用内存的调度器就可调度两百万个并发连接。连接Hash表的桶个数可以由用户根据实际应用来设定,来降低Hash的冲突率。

在每个连接的结构中有连接的报文发送方式、状态和超时等。报文发送方式有VS/NATVS/TUNVS/DR本地节点,报文会被以连接中设定的方式发送到目标服务器。这意味着在一个服务器集群中,我们可以用不同的方式来调度不同的服务器。连接的状态和超时用于记录连接当前所在的状态,如SYN_REC、ESTABLISHED和FIN_WAIT等,不同的状态有不同的超时值。

IP 虚拟服务器具有以下特点:

  • 三种 IP 负载均衡技术,在一个服务器集群中,不同的服务器可以使用不同的IP负载均衡技术。
  • 可装卸连接调度模块,共有五种连接调度算法。
  • 高效的Hash函数
  • 高效的垃圾回收机制
  • 虚拟服务的数目没有限制,每个虚拟服务有自己的服务器集。
  • 支持持久的虚拟服务
  • 正确的ICMP处理
  • 拥有本地节点功能
  • 提供系统使用的统计数据
  • 针对大规模DoS攻击的三种防卫策略

通过IP虚拟服务器软件和集群管理工具可以将一组服务器组成一个高性能、高可用的网络服务。该系统具有良好的伸缩性,支持几百万个并发连接。无需对客户机和服务器作任何修改,可适用任何Internet站点。该系统已经在很多大型的站点得到很好的应用。

二、VS/NAT

VS/NAT的体系结构如下图所示。在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系统(如NFS文件系统)共享,也可以通过一个分布式文件系统来提供。

LVS系列教程03-IP负载均衡技术

这样,客户所看到的只是在Virtual IP Address上提供的服务,而服务器集群的结构对用户是透明的。对改写后的报文,应用增量调整Checksum的算法调整TCP Checksum的值,避免了扫描整个报文来计算Checksum的开销。

下面,举个例子来进一步说明VS/NAT,如下图所示:

LVS系列教程03-IP负载均衡技术
LVS系列教程03-IP负载均衡技术

从以下的例子中,我们可以更详细地了解报文改写的流程。

LVS系列教程03-IP负载均衡技术
LVS系列教程03-IP负载均衡技术

从服务器返回到调度器的响应报文如下:

LVS系列教程03-IP负载均衡技术
LVS系列教程03-IP负载均衡技术

这样,客户认为是从202.103.106.5:80服务得到正确的响应,而不会知道该请求是服务器172.16.0.2还是服务器172.16.0.3处理的。

三、VS/TUN

VS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将极大地提高整个集群系统的吞吐量。

LVS系列教程03-IP负载均衡技术
LVS系列教程03-IP负载均衡技术

VS/TUN中,响应报文根据服务器的路由表直接返回给客户,而不经过负载调度器,所以负载调度器只处于从客户到服务器的半连接中,VS/TUN的TCP状态迁移与VS/NAT的不同。我们给出半连接的TCP有限状态机,如下图所示,圈表示状态,箭头表示状态间的转换,箭头上的标识表示在当前状态上收到该标识的输入,迁移到下一个状态。VS/TUNTCP状态迁移是按照半连接的TCP有限状态机进行的。

LVS系列教程03-IP负载均衡技术

即在负载调度器中只负责调度请求,而响应由真实服务器直接返回给客户。

四、VS/DR

VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBMNetDispatcher产品中使用的方法类似,但IBM的NetDispatcher是非常昂贵的商品化产品。

LVS系列教程03-IP负载均衡技术
LVS系列教程03-IP负载均衡技术

VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的 TCP 有限状态机进行状态迁移。

五、优缺点比较

三种 IP 负载均衡技术的优缺点归纳在下表中:

LVS系列教程03-IP负载均衡技术

注:以上三种方法所能支持最大服务器数目的估计是假设调度器使用 100M 网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是对一般 Web 服务。使用更高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应地改变。所以,以上数据估计主要是为三种方法的伸缩性进行量化比较。

文章作者: Escape 

链接: https://escapelife.github.io/posts/921148bb.html



往期推荐



关注「开源Linux」加星标,提升IT技能