LVS系列教程03-IP负载均衡技术
前言
之前我们讲述了可伸缩网络服务
的几种结构,它们都需要一个前端调度器
。在调度器的实现技术中,IP 负载均衡技术
是效率最高的。下面将描述三种 IP 负载均衡技术 :VS/NAT
、VS/DR
和VS/TUN
的工作原理,以及它们的优缺点。
VS/NAT
大多数商品化的 IP 负载均衡调度器产品都是使用此方法,如Cisco
的LocalDirector
、F5
的Big/IP
。
VS/DR:
通过直接路由
实现虚拟服务器的方法,将一组服务器构成一个高性能的、高可用的虚拟服务器
VS/TUN:
通过IP 隧道
实现虚拟服务器的方法,将一组服务器构成一个高性能的、高可用的虚拟服务器
一、实现框架
系统实现的若干问题可以查看官方文档的说明。
LVS官方文档:
http://zh.linuxvirtualserver.org/node/58
在Linux内核2.0
和内核2.2
的版本中,通过修改了TCP/IP
协议栈,在IP层截取和改写/转发IP报文,实现了三种IP 负载均衡技术
,并提供了一个ipvsadm
程序进行虚拟服务器的配置和管理。而在Linux内核2.4
和2.6
中,把它实现为NetFilter
的一个模块,很多代码作了改写和进一步优化,已经较稳定。
系统的主要功能模块如上图所示,“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/NAT
、VS/TUN
、VS/DR
和本地节点
,报文会被以连接中设定的方式发送到目标服务器。这意味着在一个服务器集群中,我们可以用不同的方式来调度不同的服务器。连接的状态和超时用于记录连接当前所在的状态,如SYN_REC、ESTABLISHED和FIN_WAIT等,不同的状态有不同的超时值。
IP 虚拟服务器具有以下特点:
-
三种 IP 负载均衡技术,在一个服务器集群中,不同的服务器可以使用不同的IP负载均衡技术。 -
可装卸连接调度模块,共有五种连接调度算法。 -
高效的Hash函数 -
高效的垃圾回收机制 -
虚拟服务的数目没有限制,每个虚拟服务有自己的服务器集。 -
支持持久的虚拟服务 -
正确的ICMP处理 -
拥有本地节点功能 -
提供系统使用的统计数据 -
针对大规模DoS攻击的三种防卫策略
通过IP
虚拟服务器软件和集群管理工具可以将一组服务器组成一个高性能、高可用的网络服务。该系统具有良好的伸缩性,支持几百万个并发连接。无需对客户机和服务器作任何修改,可适用任何Internet
站点。该系统已经在很多大型的站点得到很好的应用。
二、VS/NAT
VS/NAT
的体系结构如下图所示。在一组服务器前有一个调度器,它们是通过Switch/HUB
相连接的。这些服务器提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系统(如NFS
文件系统)共享,也可以通过一个分布式文件系统来提供。
这样,客户所看到的只是在Virtual IP Address
上提供的服务,而服务器集群的结构对用户是透明的。对改写后的报文,应用增量调整Checksum
的算法调整TCP Checksum的值,避免了扫描整个报文来计算Checksum
的开销。
下面,举个例子来进一步说明VS/NAT
,如下图所示:
从以下的例子中,我们可以更详细地了解报文改写的流程。
从服务器返回到调度器的响应报文如下:
这样,客户认为是从202.103.106.5:80
服务得到正确的响应,而不会知道该请求是服务器172.16.0.2
还是服务器172.16.0.3
处理的。
三、VS/TUN
在VS/NAT
的集群系统中,请求和响应的数据报文都需要通过负载调度器
,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈
。大多数Internet
服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将极大地提高整个集群系统的吞吐量。
在VS/TUN
中,响应报文根据服务器的路由表
直接返回给客户,而不经过负载调度器,所以负载调度器只处于从客户到服务器的半连接
中,VS/TUN的TCP状态迁移与VS/NAT的不同。我们给出半连接的TCP有限状态机,如下图所示,圈表示状态,箭头表示状态间的转换,箭头上的标识表示在当前状态上收到该标识的输入,迁移到下一个状态。VS/TUN
的TCP
状态迁移是按照半连接的TCP
有限状态机进行的。
即在负载调度器中只负责调度请求,而响应由真实服务器直接返回给客户。
四、VS/DR
跟VS/TUN
方法相同,VS/DR
利用大多数Internet
服务的非对称特点
,负载调度器
中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBM
的NetDispatcher
产品中使用的方法类似,但IBM的NetDispatcher是非常昂贵的商品化产品。
VS/DR
负载调度器也只处于从客户到服务器的半连接中,按照半连接的 TCP 有限状态机进行状态迁移。
五、优缺点比较
三种 IP 负载均衡技术
的优缺点归纳在下表中:
注:以上三种方法所能支持最大服务器数目的估计是假设调度器使用 100M 网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是对一般 Web 服务。使用更高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应地改变。所以,以上数据估计主要是为三种方法的伸缩性进行量化比较。
文章作者: Escape
链接: https://escapelife.github.io/posts/921148bb.html
往期推荐
关注「开源Linux」加星标,提升IT技能