摘 要 负载均衡技术的使用能够在不对网络中各种设备进行重大改造的条件下提高各种服务的质量,是解决当前网络业务迅猛增加和升级硬件设施之间矛盾的一个有效措施,本文简单描述了关于负载均衡方面的研究现状,重点介绍了现今linux bonding技术及其基于bonding技术的几种负载均衡的算法,并对此进行了简要的分析与研究,提出了其不足之处,针对这些不足提出了一种多网卡情况下基于传输协议的发送方面的算法,并对此进行了简单的实现,最后对此进行了测试,测试结果表明该方法的可用性。 关键词 linux bonding; 传输协议;负载均衡;高可用性; 1 引言 现今几乎各行各业内部都建立了自己的服务器,由于服务器的特殊地位,它的可靠性、可用性及其I/O速度就显得非常的重要,保持服务器的高可用性和安全性是企业级IT环境的重要指标,其中最重要的一点是服务器网络连接的高可用性,为实现这些要求,现在服务器大都采用多网卡配置,系统大都采用现在非常流行的linux作为服务器工作的环境。现在带宽已经不是服务质量提高的瓶颈了,相对的网络设备和服务器的处理能力就渐渐成为新的瓶颈。为提高服务器的网络连接的可用性和可靠性,目前Sun公司的Trunking技术、3Com公司的DynamicAccess技术、Cisco公司的Etherchannel技术等等都在研究将服务器的多个网卡接口绑定在一起的链路聚集技术, 链路聚集技术将多个链路虚拟成一个逻辑链路进而提供了一种廉价、有效的方法扩展网络设备和服务器的带宽,提高网络的灵活性与可用性。 本文介绍linux下的bonding 技术,linux 2.4.x的内核中采用了这种技术,利用bonding技术可以将多块网卡接口通过绑定虚拟成为一块网卡,在用户看来这个聚合起来的设备好像是一个单独的以太网接口设备,通俗点讲就是多块网卡具有相同的IP地址而并行连接聚合成一个逻辑链路工作。现在在关于linux bonding 技术中,有几种算法来实现负载均衡的要求,此文针对这些算法,在此进行简单分析与研究,讨论其不足,并提出另外一种在此基础上改进的一种基于传输协议的负载均衡实现方法。讨论如何实现多个网络接口的分在均衡及其故障接管。2 负载均衡技术和高可用技术研究介绍2.1 负载均衡技术 负载均衡技术的主要思想就是如何根据某种算法将网络的业务流量平均分配到不同的服务器和网络设备上去,以减轻单台服务器和网络设备的负担,从而提高整个系统的效率。负载均衡既可以由有负载均衡功能的硬件实现,也可以通过一些专用的软件来实现,负载均衡是一种策略,它能让多台服务器或多条链路共同承担一些繁重的计算或者I/O任务,从而以较低的成本消除网络瓶颈,提高网络的灵活性和可靠性。2.2 高可用技术 实现负载均衡首先是基于网络的高可用性提出来的,高可用技术是容错技术的一个分支。实现系统的高可用性最简单的一个办法就是冗余。完整的网络负载均衡和高可用性网络技术有两个方面构成,一是多服务器的绑定和负载均衡,二是一个服务器内部的多网卡绑定的负载均衡,这里主要讨论一个服务器内部的多网卡绑定时的负载均衡。3 Linux的bonding技术中负载均衡的简单实现3.1 Linux的bonding技术 Linux的bonding技术是网卡驱动程序之上、数据链路层之下实现的一个虚拟层,通过这种技术,服务器接在交换机上的多块网卡不仅被绑定为一个IP,MAC地址也被设定为同一个,进而构成一个虚拟的网卡,工作站向服务器请求数据,服务器上的网卡接到请求后,网卡根据某种算法智能决定由谁来处理数据的传输。Bonding技术可以提高主机的网络吞吐量和可用性。3.2 Linux的几种发送均衡算法 目前Linux的发送算法最主要的有三种:轮转算法(Round-Robin)、备份算法(Active-Backup)、MAC地址异或算法(MAC-XOR)。下面对目前这三种主要算法进行简单分析。3.2.1 轮转算法 该算法是基于公平原则进行的,它为每个将要被发送的数据包选择发送接口,算法的主要思想是首先第一个数据包由一个接口发送,另一个数据包则由另外一个接口发送,下面依次进行循环选择。通过分析我们可以看出这种算法比较比较简单,在发送数据方面也比较公平,能保证网卡发送数据时候的负载均衡,资源利用率很高。但是我们知道如果一个连接或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降。3.2.2 备份算法 该算法将多个网卡接口中的一个接口设定为活动状态,其他的接口处于备用状态。当活动接口或者活动链路出现故障时,启动备用链路,由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有N个网络接口的情况下,资源利用率为1/N。3.2.3 MAC地址异或算法 该算法的主要思想是:由服务器的MAC地址和客户端的MAC地址共同决定每个数据包的发送端口号,由源MAC地址和目的MAC地址进行异或计算,并将异或结果对接口数求余计算。由于发送到同一个客户端的数据流经过同一个链路,因此数据包能够有序到达客户端。此算法在只有一个客户机访问服务器或者服务器和客户机不在同一子网的情况下,由算法思想得知这种情况下负载不会均衡,在只有一个客户机访问服务器的时候,资源的利用率也是1/N(N为接口数)。通常在一个大的局域网内,往往存在多个子网。 其拓扑结构如下所示:
图1 局域网拓扑图4 基于传输协议的发送算法上面我们对Linux中的几种实现多网卡发送负载均衡算法进行了分析,针对这些算法的不足,这里提出另外一种发送负载均衡算法。4.1 算法描述实现 我们知道网络传输协议有TCP和UDP两种,其中UDP是一种无连接、不可靠的传输协议。TCP是一种提供面向连接的、可靠的字节流服务,譬如一个客户机和一个服务器在彼此交换数据前要建立一个连接。一个TCP连接或者一个UDP会话的结构大致如下:{source,dst,saddr,daddr}其中source为源端口号,dst为目的端口号,saddr为源ip地址,daddr为目的ip地址。基于传输协议的发送算法的主要思想是: 由目的主机号、目的主机所在子网的子网号及该会话的TCP或UDP的目的端口号共同决定某个数据包的发送接口号,此算法和MAC地址的异或算法有点类似,因为它也是一种异或计算。 下面我们约定: (1)host为要发送数据包的目的主机号。(2)subnet为目的主机的子网的子网号。(3)port 为UDP或TCP连接的目的端口号。(4)slave_cnt为绑定的接口数。 不失一般性,这里先考虑slave_cnt为4的情况,在这种情况下由上述几个条件异或并进行求余计算来共同确定发送的接口号,即进行下面的运算:(host ^ subnet ^ port ) & (0x03) % slave_cnt ①式 上式可能的结果可能为0、1、2、3。即该算法这种情况下最多可以绑定4个网卡接口。该算法最大程度上将不同连接的数据包从不同的接口发送,下面分几种情况讨论: (1)对于同一个客户机的两个TCP连接,发送的接口号只与要连接的目的端口号有关。我们假设连接1和连接2的目的端口号分别为port1,port2,当port1(二进制)和port2(二进制)的最后两位不同时,上个算法的计算结果不相等,两个连接的数据流从不同的接口发送出去. (2)对于同一个子网的不同客户机的两个TCP连接来说, 上述算法式子中的subnet相同,假设连接的目的端口号port相同。但是主机号不同。设目的主机号分别为host1和host2,当host1和host2(都是用二进制表示)的最后两位不相同时,算法公式的计算结果不相等,两个连接的数据流从不同的接口发送出去。 (3)对于不同子网的两个TCP连接来说,假定主机号和连接的目的号port号都相同,子网号不同。设连接1和连接2所在的子网号分别为subnet1和subnet2, 当两者的最后两位不相同时,算法公式的计算结果不相等,此时两个连接的数据流从不同的接口发送出去。 下面考虑有N个网卡接口的情况,在某个时间段内从第i个接口发送的连接数为 (i=1,2,….N),第i个接口发送的第j个连接的数据流为 ,则第i个网卡接口的负载是: 当 ②式。 当②式成立时,每个接口的负载绝对均衡,由于①式能够将连接尽量分配到不同的接口,所以一般情况下 = =…… ,即每个接口的连接数相等,但是每个连接的数据流量不一定相等,也就是说②式不一定成立,根据统计原理,当客户机和服务器的连接数足够大并且时间足够长时,②式是成立的。 从上面对基于传输协议的负载均衡算法分析来看,该算法不仅在网络层并且传输层都实现了各个接口的负载均衡,且保证了数据有序到达客户端问题,同时资源的利用率也很高。5 测试结果进行验证分析 测试软件环境:RedHat9.0(内核2.4.20) 测试硬件配置环境:一台服务器(CPU: P IV 2.8G;内存: 512M;两块支持MII状态字寄存器的百兆网卡,每个有一个接口;一台客户机(配置和服务器一样);两台(一台也可)24口千兆交换机。测试软件为netpipe,利用此软件可以测试TCP 协议性能,用它依次来对轮转算法、MAC地址异或算法以及基于传输协议的发送算法的网络延时和吞吐率。这里服务器用来发送数据,客户机用来接收数据。 服务器发送方执行: NPtcp –t –s –h 172.19.11.130 –o test.ppt –p 客户机接受方执行: NPtcp –r –s 测试结果(测试结果为平均值)如表一所示。 从测试结果可以得出结论:由于轮转算法简单,计算量小,网络延迟也相对小,而基于传输协议的发送算法计算量相对较多,网络延时也比较大。由于这里是双机对测,即只有一个客户端,一个服务器端,所有MAC地址异或算法每次计算的结果也就唯一,只有一个接口被使用,吞吐率最小。相对来说,基于传输协议的发送算法吞吐率要大一些。表一测试结果 上面测试需要说明的是:测试中服务器仅配置了两块网卡,并且只有一台客户机访问服务器,当网卡接口和客户机增加时,此文介绍的基于传输协议的发送算法的优势将会很明显。在一个比较大的局域网中多个客户机和服务器建立连接对话时,采用轮转算法的同一个连接的数据包经过不同的链路传送,无序到达客户端的概率就会增加,重发的次数也增加,服务器吞吐率会降低。而基于传输协议的发送算法则不存在这样的问题,此种情况下,服务器的吞吐率相对增加。6 结束语 Linux的bonding技术将多个网卡接口绑定在一起,使用多个接口发送数据,算法上实现了负载均衡和故障迁移与接管。它是一种不对称得负载均衡技术,目前只是研究了发送算法,接受算法还有待于进一步的研究,目前的链路技术都是将网卡接口绑定在一起来提高服务器的网络性能,但是各种实现算法包括基于传输协议的发送算法并没有考虑接口的速度,这一点有必要进一步改进。参考文献 1 A Cost-effective Approach to Improve Server Performance and Fault Tolerance.http://itpapers.zdnet.com/whitepaper.aspx?&scid=15&docid=46346 2 毛德操 ,胡希明著.LINUX内核源代码情景分析. 浙江大学出版社 3 博韦&西斯特陈莉君.深入理解linux内核(第二版)4 Alan Robertson Linux-HA Heartbeat system design.http://linux-ha.org.5 M.Bozyigita.”History-driven dynamic load balancing for recurring applications on network of workstations”. Systems and software,6 Load Balancing your NICS