一. 術語
LA (Link aggregation): 鏈路聚合,不同廠家名稱不同,ethernet channel(以太通道)。
LAG: Link aggregation group.
LACP:Link aggregation control protocol。The IEEE® 802.3ad Link Aggregation Control Protocol (LACP) negotiates a set of aggregate links with the peer into one or more Link Aggregated Groups (LAGs). Each LAG is composed of ports of the same speed, set to full-duplex operation, and traffic is balanced across the ports in the LAG with the greatest total speed. Typically, there is only one LAG which contains all the ports. In the event of changes in physical connectivity, LACP will quickly converge to a new configuration.
LACP balances outgoing traffic across the active ports based on hashed protocol header information and accepts incoming traffic from any active port. The hash includes the Ethernet source and destination address and, if available, the VLAN tag, and the IPv4 or IPv6 source and destination address.
failover: 故障轉移。只通過主網口收發數據。如果主網口不可用,則使用下一個激活的網口。您在這里加入的第一個網口便會被視為主網口;此后加入的其他網口,則會被視為故障轉移的備用網口。如果發生故障轉移之后,原先的網口又恢復了可用狀態,則它仍會作為主網口使用。
Load Balance:負載均衡
MIB: Management Information Base (MIB), a repository of information to describe the operation of a specific network device.
二. 概述
Linux雙網卡綁定實現就是使用兩塊網卡虛擬成為一塊網卡,這個聚合起來的設備看起來是一個單獨的以太網接口設備,通俗點講就是兩塊網卡具有相同的IP地址而並行鏈接聚合成一個邏輯鏈路工作。其實這項 技術在Sun和Cisco中早已存在,被稱為Trunking和Etherchannel技術,在Linux的2.4.x的內核中也采用這這種技術,被稱為bonding。什么是bonding,需要從網卡的混雜(promisc)模式說起。我們知道,在正常情況下,網卡只接收目的硬件地址(MAC Address)是自身Mac的以太網幀,對於別的數據幀都濾掉,以減輕驅動程序的負擔。但是網卡也支持另外一種被稱為混雜promisc的模式,可以接收網絡上所有的幀,bonding也運行在這個模式下,而且修改了驅動程序中的mac地址,將兩塊網卡的Mac地址改成相同,可以接收特定mac的數據幀。然后把相應的數據幀傳送給bond驅動程序處理。
首先需要明確鏈路聚合的概念:鏈路聚合是將兩個或更多數據信道結合成一個單個的信道,該信道以一個單個的更高帶寬的邏輯鏈路出現。鏈路聚合一般用來連接一個或多個帶寬需求大的設備,例如連接骨干網絡的服務器或服務器群。
區別如下:
靜態聚合模式:配置聚合的端口數量是固定的,聚合后的帶寬也是固定的;
動態聚合模式:實際聚合的端口數量是根據流量策略動態調整的,聚合帶寬也會隨之變化。例如在低負載時有2個端口參與聚合,高負載時會有4個端口參與聚合,從而更好的滿足應用的要求。
Networking vendors have long offered a functionality for aggregating bandwidth across multiple physical links to a switch. This allows a machine (frequently a server) to treat multiple physical connections to switch units as a single logical link. The standard moniker for this technology is IEEE 802.3ad, although it is known by the common names of trunking, port trunking and link aggregation. The conventional use of bonding under linux is an implementation of this link aggregation.
A separate use of the same driver allows the kernel to present a single logical interface for two physical links to two separate switches. Only one link is used at any given time. By using media independent interface signal failure to detect when a switch or link becomes unusable, the kernel can, transparently to userspace and application layer services, fail to the backup physical connection. Though not common, the failure of switches, network interfaces, and cables can cause outages. As a component of high availability planning, these bonding techniques can help reduce the number of single points of failure.
For more information on bonding, see the Documentation/networking/bonding.txt from the linux source code tree.
三. 鏈路聚合模式
LA模式:
- balance-rr or 0
- active-backup or 1
- balance-xor or 2
- broadcast or 3
- 802.3ad or 4
- balance-tlb or 5
- balance-alb or 6
常用的有三種:
mode=0:平衡負載模式,有自動備援,但需要Switch支援及設定。
mode=1:自動備援模式,其中一條線若斷線,其他線路將會自動備援。
mode=6:平衡負載模式,有自動備援,不必Switch支援及設定。
說明:
需要說明的是如果想做成mode 0的負載均衡,僅僅設置這里optionsbond0 miimon=100 mode=0是不夠的,與網卡相連的交換機必須做特殊配置(這兩個端口應該采取聚合方式),因為做bonding的這兩塊網卡是使用同一個MAC地址.從原理分析一下(bond運行在mode0下):
mode 0下bond所綁定的網卡的IP都被修改成相同的mac地址,如果這些網卡都被接在同一個交換機,那么交換機的arp表里這個mac地址對應的端口就有多 個,那么交換機接受到發往這個mac地址的包應該往哪個端口轉發呢?正常情況下mac地址是全球唯一的,一個mac地址對應多個端口肯定使交換機迷惑了。所以 mode0下的bond如果連接到交換機,交換機這幾個端口應該采取聚合方式(cisco稱為 ethernetchannel,foundry稱為portgroup),因為交換機做了聚合后,聚合下的幾個端口也被捆綁成一個mac地址.我們的解 決辦法是,兩個網卡接入不同的交換機即可。
mode6模式下無需配置交換機,因為做bonding的這兩塊網卡是使用不同的MAC地址。
七種bond模式說明:
第一種模式:mod=0 ,即:(balance-rr)Round-robin policy(平衡掄循環策略)
特點:傳輸數據包順序是依次傳輸(即:第1個包走eth0,下一個包就走eth1….一直循環下去,直到最后一個傳輸完畢),此模式提供負載平衡和容錯能力;但是我們知道如果一個連接或者會話的數據包從不同的接口發出的話,中途再經過不同的鏈路,在客戶端很有可能會出現數據包無序到達的問題,而無序到達的數據包需要重新要求被發送,這樣網絡的吞吐量就會下降。
輪詢模式,所綁定的網卡會針對訪問以輪詢算法進行平分。
第二種模式:mod=1,即: (active-backup)Active-backup policy(主-備份策略)
特點:只有一個設備處於活動狀態,當一個宕掉另一個馬上由備份轉換為主設備。mac地址是外部可見得,從外面看來,bond的MAC地址是唯一的,以避免switch(交換機)發生混亂。此模式只提供了容錯能力;由此可見此算法的優點是可以提供高網絡連接的可用性,但是它的資源利用率較低,只有一個接口處於工作狀態,在有N個網絡接口的情況下,資源利用率為1/N。
高可用模式,運行時只使用一個網卡,其余網卡作為備份,在負載不超過單塊網卡帶寬或壓力時建議使用。
第三種模式:mod=2,即:(balance-xor)XOR policy(平衡策略)
特點:基於指定的傳輸HASH策略傳輸數據包。缺省的策略是:(源MAC地址 XOR 目標MAC地址)% slave數量。其他的傳輸策略可以通過xmit_hash_policy選項指定,此模式提供負載平衡和容錯能力。
基於HASH算法的負載均衡模式,網卡的分流按照xmit_hash_policy的TCP協議層設置來進行HASH計算分流,使各種不同處理來源的訪問都盡量在同一個網卡上進行處理。
缺省策略:MAC地址異或算法,由服務器的MAC地址和客戶端的MAC地址共同決定每個數據包的發送端口號,由源MAC地址和目的MAC地址進行異或計算,並將異或結果對接口數求余計算。由於發送到同一個客戶端的數據流經過同一個鏈路,因此數據包能夠有序到達客戶端。此算法在只有一個客戶機訪問服務器或者服務器和客戶機不在同一子網的情況下,由算法思想得知這種情況下負載不會均衡,在只有一個客戶機訪問服務器的時候,資源的利用率也是1/N(N為接口數)。
第四種模式:mod=3,即:broadcast(廣播策略)
特點:在每個slave接口上傳輸每個數據包,此模式提供了容錯能力。
廣播模式,所有被綁定的網卡都將得到相同的數據,一般用於十分特殊的網絡需求,如需要對兩個互相沒有連接的交換機發送相同的數據。
第五種模式:mod=4,即:(802.3ad)IEEE 802.3ad Dynamic link aggregation(IEEE802.3ad 動態鏈接聚合)
特點:創建一個聚合組,它們共享同樣的速率和雙工設定。根據802.3ad規范將多個slave工作在同一個激活的聚合體下。外出流量的slave選舉是基於傳輸hash策略,該策略可以通過xmit_hash_policy選項從缺省的XOR策略改變到其他策略。需要注意的是,並不是所有的傳輸策略都是802.3ad適應的,尤其考慮到在802.3ad標准43.2.4章節提及的包亂序問題。不同的實現可能會有不同的適應性。
802.3ab負載均衡模式,要求交換機也支持802.3ab模式,理論上服務器及交換機都支持此模式時,網卡帶寬最高可以翻倍(如從1Gbps翻到2Gbps)
必要條件:
條件1:ethtool支持獲取每個slave的速率和雙工設定
條件2:switch(交換機)支持IEEE802.3ad Dynamic link aggregation
條件3:大多數switch(交換機)需要經過特定配置才能支持802.3ad模式
第六種模式:mod=5,即:(balance-tlb)Adaptive transmit load balancing(適配器傳輸負載均衡)
特點:不需要任何特別的switch(交換機)支持的通道bonding。在每個slave上根據當前的負載(根據速度計算)分配外出流量。如果正在接受數據的slave出故障了,另一個slave接管失敗的slave的MAC地址。
適配器輸出負載均衡模式,輸出的數據會通過所有被綁定的網卡輸出,接收數據時則只選定其中一塊網卡。如果正在用於接收數據的網卡發生故障,則由其他網卡接管,要求所用的網卡及網卡驅動可通過ethtool命令得到speed信息。
該模式的必要條件:ethtool支持獲取每個slave的速率
第七種模式:mod=6,即:(balance-alb)Adaptive load balancing(適配器適應性負載均衡)
特點:該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receiveload balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫為bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。
來自服務器端的接收流量也會被均衡。當本機發送ARP請求時,bonding驅動把對端的IP信息從ARP包中復制並保存下來。當ARP應答從對端到達時,bonding驅動把它的硬件地址提取出來,並發起一個ARP應答給bond中的某個slave。使用ARP協商進行負載均衡的一個問題是:每次廣播 ARP請求時都會使用bond的硬件地址,因此對端學習到這個硬件地址后,接收流量將會全部流向當前的slave。這個問題可以通過給所有的對端發送更新(ARP應答)來解決,應答中包含他們獨一無二的硬件地址,從而導致流量重新分布。當新的slave加入到bond中時,或者某個未激活的slave重新 激活時,接收流量也要重新分布。接收的負載被順序地分布(roundrobin)在bond中最高速的slave上當某個鏈路被重新接上,或者一個新的slave加入到bond中,接收流量在所有當前激活的slave中全部重新分配,通過使用指定的MAC地址給每個 client發起ARP應答。下面介紹的updelay參數必須被設置為某個大於等於switch(交換機)轉發延時的值,從而保證發往對端的ARP應答 不會被switch(交換機)阻截。
必要條件:
條件1:ethtool支持獲取每個slave的速率;
條件2:底層驅動支持設置某個設備的硬件地址,從而使得總是有個slave(curr_active_slave)使用bond的硬件地址,同時保證每個 bond 中的slave都有一個唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址將會被新選出來的 curr_active_slave接管其實mod=6與mod=0的區別:mod=6,先把eth0流量占滿,再占eth1,….ethX;而mod=0的話,會發現2個口的流量都很穩定,基本一樣的帶寬。而mod=6,會發現第一個口流量很高,第2個口只占了小部分流量
適配器輸入/輸出負載均衡模式,在"模式5"的基礎上,在接收數據的同時實現負載均衡,除要求ethtool命令可得到speed信息外,還要求支持對網卡MAC地址的動態修改功能。
注意:
mode參數中的0、2、3、4模式要求交換機支持"ports group"功能並能進行相應的設置,例如在Cisco中要將所連接的端口設為"trunk group"。
選擇綁定模式的建議
如果系統流量不超過單個網卡的帶寬,請不要選擇使用mode 1之外的模式,因為負載均衡需要對流量進行計算,這對系統性能會有所損耗。
建議mode 5、mode 6只在交換機不支持"ports group"的情況下選用。
如果交換機及網卡都確認支持802.3ab,則實現負載均衡時盡量使用mode 4以提高系統性能
bond配置參數
xmit_hash_policy: 這個參數的重要性我認為僅次於mode參數,mode參數定義了分發模式 ,而這個參數定義了分發策略 ,文檔上說這個參數用於mode2和mode4,我覺得還可以定義更為復雜的策略呢。
1.layer2: 使用二層幀頭作為計算分發出口的參數,這導致通過同一個網關的數據流將完全從一個端口發送,為了更加細化分發策略,必須使用一些三層信息,然而卻增加了計算開銷,天啊,一切都要權衡!
該算法會將某個網絡對(network peer)上所有的流量全部分配到同一個slave上。
2.layer2+3: 在1的基礎上增加了三層的ip報頭信息,計算量增加了,然而負載卻更加均衡了,一個個主機到主機的數據流形成並且同一個流被分發到同一個端口,根據這個思想,如果要使負載更加均衡,我們在繼續增加代價的前提下可以拿到4層的信息。
3.layer3+4: 這個還用多說嗎?可以形成一個個端口到端口的流,負載更加均衡。然而且慢! 事情還沒有結束,雖然策略上我們不想將同一個tcp流的傳輸處理並行化以避免re-order或者re-transmit,因為tcp本身就是一個串行協議,比如Intel的8257X系列網卡芯片都在盡量減少將一個tcp流的包分發到不同的cpu,同樣,端口聚合的環境下,同一個tcp流也應該使用本policy使用同一個端口發送,但是不要忘記,tcp要經過ip,而ip是可能要分段的,分了段的ip數據報中直到其被重組(到達對端或者到達一個使用nat的設備)都再也不能將之划為某個tcp流了。ip是一個完全無連接的協議,它只關心按照本地的mtu進行分段而不管別的,這就導致很多時候我們使用layer3+4策略不會得到完全滿意的結果。可是事情又不是那么嚴重,因為ip只是依照本地的mtu進行分段,而tcp是端到端的,它可以使用諸如mss以及mtu發現之類的機制配合滑動窗口機制最大限度減少ip分段,因此layer3+4策略,很OK!
miimon和arp: 使用miimon僅能檢測鏈路層的狀態,也就是鏈路層的端到端連接(即交換機某個口和與之直連的本地網卡口),然而交換機的上行口如果down掉了還是無法檢測到,因此必然需要網絡層的狀態檢測,最簡單也是最直接的方式就是arp了,可以直接arp網關,如果定時器到期網關還沒有回復arp reply,則認為鏈路不通了。
同一bond的slaves的mac相同,除了模式TLB和ALB。
All slaves of bond0 have the same MAC address (HWaddr) as bond0 for all modes except TLB and ALB that require a unique MAC address for each slave.
四. 應用
鏈路聚合查看
cat /proc/net/bonding/bond0
~# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: load balancing (xor) Transmit Hash Policy: layer2+3 (2) MII Status: up MII Polling Interval (ms): 0 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth1 MII Status: up Speed: Unknown Duplex: Unknown Link Failure Count: 0 Permanent HW addr: 34:e7:0b:1e:f0:71 Slave queue ID: 0 Slave Interface: eth2 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 5e:14:30:bb:65:2d Slave queue ID: 0 Slave Interface: eth3 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 6a:c8:37:c4:96:a2 Slave queue ID: 0
此時eth1未連接,eth0連接。
參考:
1. https://en.wikipedia.org/wiki/Link_aggregation
2. http://blog.sina.com.cn/s/blog_4b3324050101r5wz.html
3. http://www.admin-magazine.com/Articles/Increasing-Throughput-with-Link-Aggregation
4. https://www.freebsd.org/doc/en/books/handbook/network-aggregation.html
5. http://linux-ip.net/html/ether-bonding.html
6. http://www.blogjava.net/gaojohn933/archive/2013/01/15/394234.html