2013-08-20 15:39:31
現在很多服務器都自帶雙千兆網口,利用網卡綁定既能增加網絡帶寬,同時又能做相應的冗余,目前應用於很多的場景。linux操作系統下自帶的網卡綁定模式,Linux bonding驅動提供了一個把多個網絡接口設備捆綁為單個網絡接口設置來使用,用於網絡負載均衡及網絡冗余。當然現在網卡產商也會出一些針對windows操作系統網卡管理軟件來做網卡綁定(windows操作系統沒有網卡綁定功能 需要第三方支持)。
我們公司是做分布式文件系統的,很多項目都用到網卡綁定來提高性能。在網絡找了很多資料,也做了大量的測試,下面就網卡綁定談一下自己的看法。
一、 Bonding的應用
1、 網絡負載均衡
對於bonding的網絡負載均衡是我們在文件服務器中常用到的,比如把三塊網卡,當做一塊來用,解決一個IP地址,流量過大,服務器網絡壓力過大的問題。如果在內網中,文件服務器為了管理和應用上的方便,大多是用同一個IP地址。對於一個百M的本地網絡來說,文件服務器在多個用戶同時使用的情況下,網絡壓力是極大的,為了解決同一個IP地址,突破流量的限制,畢竟網線和網卡對數據的吞吐量是有限制的。如果在有限的資源的情況下,實現網絡負載均衡,最好的辦法就是bonding 。
2、 網絡冗余
對於服務器來說,網絡設備的穩定也是比較重要的,特別是網卡。大多通過硬件設備的冗余來提供服務器的可靠性和安全性,比如電源。bonding 也能為網卡提供冗余的支持。把網個網卡綁定到一個IP地址,當一塊網卡發生物理性損壞的情況下,另一塊網卡也能提供正常的服務。
二、 Bonding的原理
什么是bonding需要從網卡的混雜(promisc)模式說起。我們知道,在正常情況下,網卡只接收目的硬件地址(MAC Address)是自身Mac的以太網幀,對於別的數據幀都濾掉,以減輕驅動程序的負擔。但是網卡也支持另外一種被稱為混雜promisc的模式,可以接 收網絡上所有的幀,比如說tcpdump,就是運行在這個模式下。bonding也運行在這個模式下,而且修改了驅動程序中的mac地址,將兩塊網卡的 Mac地址改成相同,可以接收特定mac的數據幀。然后把相應的數據幀傳送給bond驅動程序處理。
三、 Bonding的模式
linux有七種網卡綁定模式:
模式代號 |
模式名稱 |
模式方式 |
說明 |
0 |
(balance-rr) Round-robin policy |
輪詢策略 |
該策略是按照設備順序依次傳輸數據包,直到最后一個設備。這種模式提供負載均衡和容錯能力。 |
1 |
(active-backup) Active-backup policy |
主備策略 |
該策略只有一個設備處於活動狀態。 一個宕掉另一個馬上由備份轉換為主設備。mac地址是外部可見的。 此模式提供了容錯能力。 |
2 |
(balance-xor) XOR policy |
異或策略 |
該策略是根據MAC地址異或運算的結果來選擇傳輸設備,提供負載均衡和容錯能力。 |
3 |
Broadcast policy |
廣播策略 |
該策略將所有數據包傳輸給所有接口通過全部設備來傳輸所有數據,提供容錯能力。 |
4 |
(802.3ad) IEEE 802.3ad Dynamic link aggregation |
動態鏈接聚合 |
該策略通過創建聚合組來共享相同的傳輸速度,需要交換機也支持 802.3ad 模式,提供容錯能力。 |
5 |
(balance-tlb) Adaptive transmit load balancing |
適配器傳輸負載均衡 |
該策略是根據當前的負載把發出的數據分給每一個設備,由當前使用的設備處理收到的數據。本策略的通道聯合不需要專用的交換機支持,提供負載均衡和容錯能力。
|
6 |
(balance-alb) Adaptive load balancing |
適配器負載均衡 |
該策略在IPV4情況下包含適配器傳輸負載均衡策略,由ARP協商完成接收的負載,通道聯合驅動程序截獲ARP在本地系統發送出的請求,用其中一個設備的硬件地址覆蓋從屬設備的原地址。 |
第一種:bond0:round robin
1、 標准文檔描述
round-robin policy: Transmit packets in sequential order from the first available slave through the last. This mode provides load balancing and fault tolerance.
2、 特點
- Ø 負載均衡---所有鏈路處於負載均衡狀態,輪詢方式往每條鏈路發送報文,基於per packet方式發送。傳輸數據包順序是依次傳輸(即:第1個包走eth0,下一個包就走eth1....一直循環下去,直到最后一個傳輸完畢)。在一個雙網卡綁定的機器上ping一個地址,你會發現兩個網卡都有流量發出。負載到兩條鏈路上,說明是基於per packet方式進行輪詢發送。
- Ø 容錯能力---這模式的特點增加了帶寬,同時支持容錯能力,當有鏈路出問題,會把流量切換到正常的鏈路上。
- Ø 性能問題---一個連接或者會話的數據包如果從不同的接口發出的話,中途再經過不同的鏈路,在客戶端很有可能會出現數據包無序到達的問題,而無序到達的數據包需要重新要求被發送,這樣網絡的吞吐量就會下降。Bond0在大壓力的網絡傳輸下,性能增長的並不是很理想。
- Ø 交換機支持---該模式下,由於綁定的所有網卡的IP都被修改為同一個MAC地址。此時交換機收到發往該MAC地址的數據包時,將不知道從對應的哪個端口轉發該數據,為了解決交換機的這個問題,交換機應做端口綁定,將數據發往邏輯聚合端口,之后由聚合端口從多個端口轉發數據。
第二種:bond1:active-backup
1、 標准文檔描述
Active-backup policy: Only one slave in the bond is active. A different slave becomes active if, and only if, the active slave fails. The bond’s MAC address is externally visible on only one port (network adapter) to avoid confusing the switch. This mode provides fault tolerance. The primary option affects the behavior of this mode.
2、 特點
- Ø 容錯能力---只有一個slave是激活的(active)。也就是說同一時刻只有一個網卡處於工作狀態,其他的slave都處於備份狀態,只有在當前激活的slave故障后才有可能會變為激活的(active)。在bonding 2.6.2和以后的版本中,如果在active-backup模式下出現failover【譯注:指一個slave發生故障,另一個slave變為激活的設備】,bonding將會在新的slave上發出一個或多個ARP請求,其中一個ARP請求針對bonding master接口及它上面配置的每個VLAN接口,從而保證該接口至少配置了一個IP地址。針對VLAN接口的ARP請求將會被打上相應的VLAN id。
- Ø 無負載均衡---此算法的優點是可以提供高網絡連接的可用性,但是它的資源利用率較低,只有一個接口處於工作狀態,在有 N 個網絡接口的情況下,資源利用率為1/N。
- Ø 無需交換機支持--- MAC地址是外部可見得,從外面看來,bond的MAC地址是唯一的,以避免switch(交換機)發生混亂。
第三種:bond2:load balancing (xor)
1、 標准文檔描述
XOR policy: Transmit based on [(source MAC address XOR'd with destination MAC address) modulo slave count]. This selects the same slave for each destination MAC address. This mode provides load balancing and fault tolerance.
2、 特點
- Ø 負載均衡和容錯能力---基於指定的傳輸HASH策略傳輸數據包。缺省的策略是:(源MAC地址 XOR 目標MAC地址) % slave數量。其他的傳輸策略可以通過xmit_hash_policy選項指定。
- Ø 性能問題---該模式將限定流量,以保證到達特定對端的流量總是從同一個接口上發出。既然目的地是通過MAC地址來決定的,因此該模式在“本地”網絡配置下可以工作得很好。如果所有流量是通過單個路由器(比如 “網關”型網絡配置,只有一個網關時,源和目標mac都固定了,那么這個算法算出的線路就一直是同一條,那么這種模式就沒有多少意義了。),那該模式就不是最好的選擇。
- Ø 交換機支持---和balance-rr一樣,交換機端口需要能配置為“port channel”。這模式是通過源和目標mac做hash因子來做xor算法來選路的。
第四種:bond3:fault-tolerance (broadcast)
1、 標准文檔描述
Broadcast policy: transmits everything on all slave interfaces. This mode provides fault tolerance.
2、 特點
這種模式的特點是一個報文會復制兩份往bond下的兩個接口分別發送出去,當有對端交換機失效,我們感覺不到任何downtime,但此法過於浪費資源;不過這種模式有很好的容錯機制。此模式適用於金融行業,因為他們需要高可靠性的網絡,不允許出現任何問題。
第五種:bond4:lacp
1、 標准文檔描述
IEEE 802.3ad Dynamic link aggregation. Creates aggregation groups that share the same speed and duplex settings. Utilizes all slaves in the active aggregator according to the 802.3ad specification. Pre-requisites: 1. Ethtool support in the base drivers for retrieving.the speed and duplex of each slave. 2. A switch that supports IEEE 802.3ad Dynamic link aggregation. Most switches will require some type of configuration to enable 802.3ad mode.
2、 特點
802.3ad模式是IEEE標准,因此所有實現了802.3ad的對端都可以很好的互操作。802.3ad 協議包括聚合的自動配置,因此只需要很少的對交換機的手動配置(要指出的是,只有某些設備才能使用802.3ad)。802.3ad標准也要求幀按順序(一定程度上)傳遞,因此通常單個連接不會看到包的亂序。802.3ad也有些缺點:標准要求所有設備在聚合操作時,要在同樣的速率和雙工模式,而且,和除了balance-rr模式外的其它bonding負載均衡模式一樣,任何連接都不能使用多於一個接口的帶寬。
此外,linux bonding的802.3ad實現通過對端來分發流量(通過MAC地址的XOR值),因此在“網關”型配置下,所有外出(Outgoing)流量將使用同一個設備。進入(Incoming)的流量也可能在同一個設備上終止,這依賴於對端802.3ad實現里的均衡策略。在“本地”型配置下,路兩將通過 bond里的設備進行分發。
band4是要求參與綁定的端口都運行802.3ad協議。該方式與band0很相似,但是又有區別。在IEEE802.3ad中,“鏈路聚合控制協議(LACP)”自動通知交換機應該聚合哪些端口,IEEE802.3ad聚合配置之后,鏈路聚合控制協議單元(LACPDU)就會在服務器和交換機之間進行交換,LACP會通知交換機在聚合中配置的適配器應作為交換機上的一個適配器來考慮,而不再有用戶的干預。(按照協議應當如此,但是H3C5500-EI交換機上並未發現有單獨啟用802.3ad或LACP的命令,而聚合組中的靜態聚合的所有端口均不啟用LACP協議,所以如果按照band4的模式操作的話,建議在交換機上手工做動態端口聚合,且手工指定全局報文按照源MAC和目的MAC地址進行聚合負載分擔。)根據IEEE802.3ad的規范,前往相同IP地址的數據包都會通過相同的適配器進行發送。因此當在802.3ad方式下操作時,信息包會始終按照標准(standard)的方式進行分發,而不會按照輪詢(Round-Robin)方式進行分發。
3、 交換機端配置
interface AggregatePort 1 配置聚合口 interface GigabitEthernet 0/23 port-group 1 mode active 接口下開啟lacp 主動模式 interface GigabitEthernet 0/24 port-group 1 mode active
4、 必要條件
條件1:ethtool支持獲取每個slave的速率和雙工設定 條件2:switch(交換機)支持IEEE 802.3ad Dynamic link aggregation 條件3:大多數switch(交換機)需要經過特定配置才能支持802.3ad模式
第六種:bond5: transmit load balancing
1、 標准文檔描述
Adaptive transmit load balancing: channel bonding that does not require any special switch support. The outgoing traffic is distributed according to the current load (computed relative to the speed) on each slave. Incoming traffic is received by the current slave. If the receiving slave fails, another slave takes over the MAC address of the failed receiving slave. Prerequisite: Ethtool support in the base drivers for retrieving the speed of each slave.
2、 特點
balance-tlb模式通過對端均衡外出(outgoing)流量。既然它是根據MAC地址進行均衡,在“網關”型配置(如上文所述)下,該模式會通過單個設備來發送所有流量,然而,在“本地”型網絡配置下,該模式以相對智能的方式(不是balance-xor或802.3ad模式里提及的XOR方式)來均衡多個本地網絡對端,因此那些數字不幸的MAC地址(比如XOR得到同樣值)不會聚集到同一個接口上。
不像802.3ad,該模式的接口可以有不同的速率,而且不需要特別的交換機配置。不利的一面在於,該模式下所有進入的(incoming)流量會到達同一個接口;該模式要求slave接口的網絡設備驅動有某種ethtool支持;而且ARP監控不可用。
第七種:bond6:adaptive load balancing
1、
特點
該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receive load balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫為bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。所有端口都會收到對端的arp請求報文,回復arp回時,bond驅動模塊會截獲所發的arp回復報文,根據算法算到相應端口,這時會把arp回復報文的源mac,send源mac都改成相應端口mac。從抓包情況分析回復報文是第一個從端口1發,第二個從端口2發。以此類推。
(還有一個點:每個端口除發送本端口回復的報文,也同樣會發送其他端口回復的報文,mac還是其他端口的mac)這樣來自服務器端的接收流量也會被均衡。
當本機發送ARP請求時,bonding驅動把對端的IP信息從ARP包中復制並保存下來。當ARP應答從對端到達時,bonding驅動把它的硬件地址提取出來,並發起一個ARP應答給bond中的某個slave(這個算法和上面一樣,比如算到1口,就給發送arp請求,1回復時mac用1的mac)。使用ARP協商進行負載均衡的一個問題是:每次廣播 ARP請求時都會使用bond的硬件地址,因此對端學習到這個硬件地址后,接收流量將會全部流向當前的slave。這個問題通過給所有的對端發送更新(ARP應答)來解決,往所有端口發送應答,應答中包含他們獨一無二的硬件地址,從而導致流量重新分布。當新的slave加入到bond中時,或者某個未激活的slave重新激活時,接收流量也要重新分布。接收的負載被順序地分布(round robin)在bond中最高速的slave上。
當某個鏈路被重新接上,或者一個新的slave加入到bond中,接收流量在所有當前激活的slave中全部重新分配,通過使用指定的MAC地址給每個 client發起ARP應答。下面介紹的updelay參數必須被設置為某個大於等於switch(交換機)轉發延時的值,從而保證發往對端的ARP應答不會被switch(交換機)阻截。
當集群的機器數量較少,或者機器跨VLAN或者經過路由時,模式6就起不到很好的效果。mod=6與mod=0的區別:mod=6,先把eth0流量占滿,再占eth1,....ethX;而mod=0的話,會發現2個口的流量都很穩定,基本一樣的帶寬。而mod=6,會發現第一個口流量很高,第2個口只占了小部分流量。
2、 必要條件
條件1:ethtool支持獲取每個slave的速率;
條件2:底層驅動支持設置某個設備的硬件地址,從而使得總是有個slave(curr_active_slave)使用bond的硬件地址,同時保證每個bond 中的slave都有一個唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址將會被新選出來的 curr_active_slave接管。
四、 Bonding參數介紹
參數 |
說明 |
max_bonds |
為bonding驅動指定創建bonding設備的數量。比如,如果max_bonds為3,而且bonding驅動還沒有加載,那么bond0,bond1,bond2將會被創建。缺省值為1。 |
lacp_rate |
指定在802.3ad模式下,我們希望的鏈接對端傳輸LACPDU包的速率。可能的選項: slow 或者 0 請求對端每30s傳輸LACPDU fast 或者 1 請求對端每1s傳輸LACPDU 缺省值是slow |
downdelay |
指定一個時間,用於在發現鏈路故障后,等待一段時間然后禁止一個slave,單位是毫秒(ms)。該選項只對miimon監控有效。downdelay值應該是miimon值的整數倍,否則它將會被取整到最接近的整數倍。缺省值為0。 |
arp_ip_target |
指定一組IP地址用於ARP監控的目標,它只在arp_interval > 0時有效。這些IP地址是ARP請求發送的目標,用於判定到目標地址的鏈路是否工作正常。多個IP地址通過逗號分隔。至少指定一個IP地址。最多可以指定16個IP地址。缺省值是沒有IP地址。 |
arp_interval |
指定ARP鏈路監控頻率,單位是毫秒(ms)。如果APR監控工作於以太兼容模式(模式0和模式2)下,需要把switch(交換機)配置為在所有鏈路上均勻的分發網絡包。如果switch(交換機)被配置為以XOR方式分發網絡包,所有來自ARP目標的應答將會被同一個鏈路上的其他設備收到,這將會導致其他設備的失敗。ARP監控不應該和miimon同時使用。設定為0將禁止ARP監控。缺省值為0。 |
miimon |
指定MII鏈路監控頻率,單位是毫秒(ms)。這將決定驅動檢查每個slave鏈路狀態頻率。0表示禁止MII鏈路監控。100可以作為一個很好的初始參考值。缺省值為0。 |
mode |
指定bonding的策略。缺省是balance-rr (round robin,輪詢策略)。 |
primary |
指定哪個slave成為主設備(primary device),取值為字符串,如eth0,eth1等。只要指定的設備可用,它將一直是激活的slave。只有在主設備(primary device)斷線時才會切換設備。這在希望某個slave設備優先使用的情形下很有用,比如,某個slave設備有更高的吞吐率。 primary選項只對active-backup模式有效。 |
updelay |
指定當發現一個鏈路恢復時,在激活該鏈路之前的等待時間,以毫秒計算。該選項只對miimon鏈路偵聽有效。updelay應該是miimon值的整數倍,如果不是,它將會被向下取整到最近的整數。缺省值為0。 |
use_carrier |
指定miimon是否需要使用MII或者ETHTOOL ioctls還是netif_carrier_ok()來判定鏈路狀態。MII或ETHTOOL ioctls更低效一些,而且使用了內核里廢棄的舊調用序列;而netif_carrier_ok()依賴於設備驅動來維護狀態(判斷載波),在本文寫作時,大多數但不是全部設備驅動支持這個特性。 如果bonding總是認為鏈路是通的,但實際上是斷的,這有可能是由於你的網絡設備驅動不支持netif_carrier_on/off。因為 netif_carrier的缺省狀態是"carrier on",因此如果驅動不支持netif_carrier,則會顯示鏈路永遠正常。在這種情況下,把use_carrier設為0,從而讓bonding使用MII/ETHTOOL ictl來判定鏈路狀態。 該選項設為1會使用netif_carrier_ok(),而設為0則會使用廢棄的MII/ETHTOOL ioctls,缺省值是1。 |
xmit_hash_policy |
在balance-xor和802.3ad模式下選擇不同的hash模式,以用於slave選舉。可能的取值有: layer2 使用硬件MAC地址的XOR來生成hash。公式為: (源MAC地址 XOR 目的MAC地址)% slave數目 該算法會將某個網絡對(network peer)上所有的流量全部分配到同一個slave上。 layer3+4 該策略在可能的時候使用上層協議的信息來生成hash。這將允許特定網絡對(network peer)的流量分攤到多個slave上,盡管同一個連接(connection)不會分攤到多個slave上。 針對未分片的TCP和UDP包的計算公式為: ((源端口 XOR 目的端口) XOR ((源IP XOR 目的IP) AND 0xFFFF) % slave數目 對於已分片TCP或UDP包,以及其他的IP包,源端口和目的端口的信息被忽略了;對於非IP流量,采用和layer2一樣的hash策略。 該策略期望模仿某些交換機的行為,比如帶PFC2的Cisco交換機,以及某些Foundry和IBM的產品。 該算法不完全適應802.3ad,一個單一的TCP或UDP會話同時包含有分片和未分片的包將會導致包在兩個接口上傳遞,這將會導致投遞亂序。大多數流量不會滿足這種條件,正如TCP很少分片,而大多數UDP流量不會在長期的會話中存在。其他的802.3ad實現有可能不能容忍這樣的不適應性。 缺省設置是layer2。該選項在bonding 2.6.3加入,在早期版本中,該參數不存在,只只是layer2策略。 |