歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux管理 >> Linux服務

Linux服務器下多網卡負載均衡的研究

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。

[NextPage]

  3.2.3 MAC地址異或算法

  該算法的主要思想是:由服務器的MAC地址和客戶端的MAC地址共同決定每個數據包的發送端口號,由源MAC地址和目的MAC地址進行異或計算,並將異或結果對接口數求余計算。由於發送到同一個客戶端的數據流經過同一個鏈路,因此數據包能夠有序到達客戶端。此算法在只有一個客戶機訪問服務器或者服務器和客戶機不在同一子網的情況下,由算法思想得知這種情況下負載不會均衡,在只有一個客戶機訪問服務器的時候,資源的利用率也是1/N(N為接口數)。

  通常在一個大的局域網內,往往存在多個子網。 其拓撲結構如下所示:

Linux服務器下多網卡負載均衡的研究(圖一)

圖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(都是用二進制表示)的最後兩位不相同時,算法公式的計算結果不相等,兩個連接的數據流從不同的接口發送出去。

[NextPage]

  (3)對於不同子網的兩個TCP連接來說,假定主機號和連接的目的號port號都相同,子網號不同。設連接1和連接2所在的子網號分別為subnet1和subnet2, 當兩者的最後兩位不相同時,算法公式的計算結果不相等,此時兩個連接的數據流從不同的接口發送出去。

  下面考慮有N個網卡接口的情況,在某個時間段內從第i個接口發送的連接數為 (i=1,2,….N),第i個接口發送的第j個連接的數據流為 ,則第i個網卡接口的負載是:

Linux服務器下多網卡負載均衡的研究(圖二)

②式

  當②式成立時,每個接口的負載絕對均衡,由於①式能夠將連接盡量分配到不同的接口,所以一般情況下 = =…… ,即每個接口的連接數相等,但是每個連接的數據流量不一定相等,也就是說②式不一定成立,根據統計原理,當客戶機和服務器的連接數足夠大並且時間足夠長時,②式是成立的。

  從上面對基於傳輸協議的負載均衡算法分析來看,該算法不僅在網絡層並且傳輸層都實現了各個接口的負載均衡,且保證了數據有序到達客戶端問題,同時資源的利用率也很高。

  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地址異或算法每次計算的結果也就唯一,只有一個接口被使用,吞吐率最小。相對來說,基於傳輸協議的發送算法吞吐率要大一些。

Linux服務器下多網卡負載均衡的研究(圖三)

表一測試結果

  上面測試需要說明的是:測試中服務器僅配置了兩塊網卡,並且只有一台客戶機訪問服務器,當網卡接口和客戶機增加時,此文介紹的基於傳輸協議的發送算法的優勢將會很明顯。在一個比較大的局域網中多個客戶機和服務器建立連接對話時,采用輪轉算法的同一個連接的數據包經過不同的鏈路傳送,無序到達客戶端的概率就會增加,重發的次數也增加,服務器吞吐率會降低。而基於傳輸協議的發送算法則不存在這樣的問題,此種情況下,服務器的吞吐率相對增加。

  6 結束語

  Linux的bonding技術將多個網卡接口綁定在一起,使用多個接口發送數據,算法上實現了負載均衡和故障遷移與接管。它是一種不對稱得負載均衡技術,目前只是研究了發送算法,接受算法還有待於進一步的研究,目前的鏈路技術都是將網卡接口綁定在一起來提高服務器的網絡性能,但是各種實現算法包括基於傳輸協議的發送算法並沒有考慮接口的速度,這一點有必要進一步改進。

Copyright © Linux教程網 All Rights Reserved