Linux服務器下多網卡負載均衡的研究 |
發布時間: 2012/8/11 10:56:48 |
1引言
現今幾乎各行各業內部都建立了自己的服務器,由于服務器的特殊地位,它的可靠性、可用性及其I/O速度就顯得非常的重要,保持服務器的高可用性和安全性是企業級IT環境的重要指標,其中最重要的一點是服務器網絡連接的高可用性,為實現這些要求,現在服務器大都采用多網卡配置,系統大都采用現在非常流行的Linux作為服務器工作的環境。現在帶寬已經不是服務質量提高的瓶頸了,相對的網絡設備和服務器的處理能力就漸漸成為新的瓶頸。為提高服務器的網絡連接的可用性和可靠性,目前Sun公司的Trunking技術、3Com公司的DynamicAccess技術、Cisco公司的Etherchannel技術等等都在研究將服務器的多個網卡接口綁定在一起的鏈路聚集技術,鏈路聚集技術將多個鏈路虛擬成一個邏輯鏈路進而提供了一種廉價、有效的方法擴展網絡設備和服務器的帶寬,提高網絡的靈活性與可用性。 本文介紹Linux下的bonding技術,Linux2.4.x的內核中采用了這種技術,利用bonding技術可以將多塊網卡接口通過綁定虛擬成為一塊網卡,在用戶看來這個聚合起來的設備好像是一個單獨的以太網接口設備,通俗點講就是多塊網卡具有相同的IP地址而并行連接聚合成一個邏輯鏈路工作。現在在關于Linuxbonding技術中,有幾種算法來實現負載均衡的要求,此文針對這些算法,在此進行簡單分析與研究,討論其不足,并提出另外一種在此基礎上改進的一種基于傳輸協議的負載均衡實現方法。討論如何實現多個網絡接口的分在均衡及其故障接管。 2負載均衡技術和高可用技術研究介紹 2.1負載均衡技術 負載均衡技術的主要思想就是如何根據某種算法將網絡的業務流量平均分配到不同的服務器和網絡設備上去,以減輕單臺服務器和網絡設備的負擔,從而提高整個系統的效率。負載均衡既可以由有負載均衡功能的硬件實現,也可以通過一些專用的軟件來實現,負載均衡是一種策略,它能讓多臺服務器或多條鏈路共同承擔一些繁重的計算或者I/O任務,從而以較低的成本消除網絡瓶頸,提高網絡的靈活性和可靠性。 2.2高可用技術 實現負載均衡首先是基于網絡的高可用性提出來的,高可用技術是容錯技術的一個分支。實現系統的高可用性最簡單的一個辦法就是冗余。完整的網絡負載均衡和高可用性網絡技術有兩個方面構成,一是多服務器的綁定和負載均衡,二是一個服務器內部的多網卡綁定的負載均衡,這里主要討論一個服務器內部的多網卡綁定時的負載均衡。 3Linux的bonding技術中負載均衡的簡單實現 3.1Linux的bonding技術 Linux的bonding技術是網卡驅動程序之上、數據鏈路層之下實現的一個虛擬層,通過這種技術,服務器接在交換機上的多塊網卡不僅被綁定為一個IP,MAC地址也被設定為同一個,進而構成一個虛擬的網卡,工作站向服務器請求數據,服務器上的網卡接到請求后,網卡根據某種算法智能決定由誰來處理數據的傳輸。Bonding技術可以提高主機的網絡吞吐量和可用性。 3.2Linux的幾種發送均衡算法 目前Linux的發送算法最主要的有三種:輪轉算法(Round-Robin)、備份算法(Active-Backup)、MAC地址異或算法(MAC-XOR)。下面對目前這三種主要算法進行簡單分析。 3.2.1輪轉算法 該算法是基于公平原則進行的,它為每個將要被發送的數據包選擇發送接口,算法的主要思想是首先第一個數據包由一個接口發送,另一個數據包則由另外一個接口發送,下面依次進行循環選擇。通過分析我們可以看出這種算法比較比較簡單,在發送數據方面也比較公平,能保證網卡發送數據時候的負載均衡,資源利用率很高。但是我們知道如果一個連接或者會話的數據包從不同的接口發出的話,中途再經過不同的鏈路,在客戶端很有可能會出現數據包無序到達的問題,而無序到達的數據包需要重新要求被發送,這樣網絡的吞吐量就會下降。 3.2.2備份算法 該算法將多個網卡接口中的一個接口設定為活動狀態,其他的接口處于備用狀態。當活動接口或者活動鏈路出現故障時,啟動備用鏈路,由此可見此算法的優點是可以提供高網絡連接的可用性,但是它的資源利用率較低,只有一個接口處于工作狀態,在有N個網絡接口的情況下,資源利用率為1/N。 [NextPage] 3.2.3MAC地址異或算法 該算法的主要思想是:由服務器的MAC地址和客戶端的MAC地址共同決定每個數據包的發送端口號,由源MAC地址和目的MAC地址進行異或計算,并將異或結果對接口數求余計算。由于發送到同一個客戶端的數據流經過同一個鏈路,因此數據包能夠有序到達客戶端。此算法在只有一個客戶機訪問服務器或者服務器和客戶機不在同一子網的情況下,由算法思想得知這種情況下負載不會均衡,在只有一個客戶機訪問服務器的時候,資源的利用率也是1/N(N為接口數)。 通常在一個大的局域網內,往往存在多個子網。其拓撲結構如下所示:
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個網卡接口。 本文出自:億恩科技【www.laynepeng.cn】 |