preface
在藍廠就職到時候,每台緩存服務器都能夠跑到2G的流量,這么大的流量,有人會問,服務器是不是安裝的萬兆網卡,no no no,僅僅是3張千兆網卡綁定在一塊。萬兆網卡的服務器少見,大多數都是定制的,就像我第一家公司那樣自己去單獨購買intel的萬兆網卡。
其實這個3張千兆網卡綁定在一塊就是做的是負載均衡,在OSI七層參考模型上,是數據鏈路層的負載均衡。
OSI 七層參考模型
那我們先看看OSI七層模型先。
數據鏈路層的負載均衡
數據鏈路層負載均衡其實也就是網卡的負載均衡,在下面的應用情況下,就要考慮對網卡進行負載均衡:
- 某個服務器跑的應用非高峰期間都能達到500M以上,晚高峰一般能夠超過1G,主流服務器的網卡都是千兆的,超過1G的流量明顯會導致丟包的問題,此時又不能停止業務對網卡進行更換,所以必須在增加一個網卡來聯合提供服務,所以就必須把多張網卡捆綁做成一個邏輯網卡。
- 對網卡的高可用性要求,某些業務必須要求網卡層面的高可用性,所以必須捆綁多個網卡。
對於linux系統來說,數據鏈路層的解決方案就是實現多個網卡綁定,即linux bonding,在思科交換機上這稱為以太網通道(Ether Channel)
linux bonding
在配置之前,我們先說說linux bonding的七種模式:
七種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選項指定,此模式提供負載平衡和容錯能力
第四種模式:mod=3,即:broadcast(廣播策略)
特點:在每個slave接口上傳輸每個數據包,此模式提供了容錯能力
第五種模式:mod=4,即:(802.3ad) IEEE 802.3adDynamic link aggregation(IEEE 802.3ad 動態鏈接聚合)
特點:創建一個聚合組,它們共享同樣的速率和雙工設定。根據802.3ad規范將多個slave工作在同一個激活的聚合體下。
外出流量的slave選舉是基於傳輸hash策略,該策略可以通過xmit_hash_policy選項從缺省的XOR策略改變到其他策略。需要注意的是,並不是所有的傳輸策略都是802.3ad適應的,尤其考慮到在802.3ad標准43.2.4章節提及的包亂序問題。不同的實現可能會有不同的適應性。
必要條件:
條件1:ethtool支持獲取每個slave的速率和雙工設定
條件2:switch(交換機)支持IEEE 802.3ad Dynamic link aggregation
條件3:大多數switch(交換機)需要經過特定配置才能支持802.3ad模式
第六種模式:mod=5,即:(balance-tlb) Adaptive transmit load balancing(適配器傳輸負載均衡)
特點:不需要任何特別的switch(交換機)支持的通道bonding。在每個slave上根據當前的負載(根據速度計算)分配外出流量。如果正在接受數據的slave出故障了,另一個slave接管失敗的slave的MAC地址。
該模式的必要條件:ethtool支持獲取每個slave的速率
第七種模式:mod=6,即:(balance-alb) Adaptive load balancing(適配器適應性負載均衡)
特點:該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receive load balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫為bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。
在我司的生產環境下的使用的mode4,mode4需要讓網絡組同事調配交換機,讓交換機能夠支持服務器的linux bonding。所以這里不贅述交換機那塊的配置,如果同志你們公司沒有搞網絡的同事幫你調配,那你自己搜索下思科交換的以太網通道,或者華為華三的端口聚合技術(端口聚合技術,好像沒有記錯)的配置。
配置linux
配置的時候建議本地配置,不要遠程配置,因為會導致網絡暫時中斷。
[root@localhost network-scripts]# cat ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
IPV6INIT="yes"
NM_CONTROLLED="no"
MASTER="bond0" # 屬於bond0的成員,
SLAVE="yes"
ONBOOT="no"
You have new mail in /var/spool/mail/root
[root@localhost network-scripts]# cat ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
IPV6INIT="yes"
NM_CONTROLLED="no"
ONBOOT="no"
MASTER="bond0" # 屬於bond0的成員,
SLAVE="yes"
[root@localhost network-scripts]# cat ifcfg-bond0
DEVICE="bond0"
IPADDR="192.168.141.3"
NETMASK="255.255.255.0"
GATEWAY="192.168.141.2"
BOOTPROTO="static"
ONBOOT="yes"
BONDING_OPTS="minion=100 mode=4" # 這里設置為mode4級別,交換機注意需要調配以太網通道,不然無法網絡無法工作,mode4 就是 IEEE 802.3ad Dynamic link aggregation,否則,linux和交換機會協商不成功。
[root@localhost network-scripts]# service network restart
[root@localhost network-scripts]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:0C:29:45:2A:23
inet addr:192.168.141.3 Bcast:192.168.141.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:2a23/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:27459 errors:0 dropped:0 overruns:0 frame:0
TX packets:13522 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8463210 (8.0 MiB) TX bytes:2021407 (1.9 MiB)
eth0 Link encap:Ethernet HWaddr 00:0C:29:45:2A:23
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:21901 errors:0 dropped:0 overruns:0 frame:0
TX packets:13304 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7939864 (7.5 MiB) TX bytes:1990240 (1.8 MiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:45:2A:23
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:5558 errors:0 dropped:0 overruns:0 frame:0
TX packets:218 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:523346 (511.0 KiB) TX bytes:31167 (30.4 KiB)
配置成功。
檢查bond0狀態
我們不管配置什么服務,都需要在配置完成之后去檢查是否正常。
[root@localhost ~]# ethtool bond0 # 查看bond0的狀態
Settings for bond0:
Supported ports: [ ]
Supported link modes: Not reported
Supported pause frame use: No
Supports auto-negotiation: No
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Speed: 2000Mb/s # 查看這速度是否為兩個網卡之和,我這邊配置了2快網卡,每塊都是千兆的,所以這里顯示2G是正確的。
Duplex: Full #全雙工模式
Port: Other
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Link detected: yes
[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
802.3ad info
LACP rate: slow
Aggregator selection policy (ad_select): stable
Active Aggregator Info:
Aggregator ID: 2
Number of ports: 1
Actor Key: 17
Partner Key: 1
Partner Mac Address: 00:00:00:00:00:00
Slave Interface: eth0 #由此可以看到bond0由eth0和eth1組成。
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:45:2a:23
Aggregator ID: 1
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:45:2a:2d
Aggregator ID: 2
Slave queue ID: 0
接下來測試流量和可用性:
- 我們依次拔掉eth1,eth0的網線,然后ping服務器ip,看是否通暢。正確的情況就是不管拔掉哪根,都可正常ping通
- 從多個服務器對做了bonding的服務器發起流量測試,測試工具iperf(下載地址是https://iperf.fr/iperf-download.php#fedora),需要驗證的是,做了bonding的服務器,網卡吞吐量會接近2G。。。
Notice
- Cisco交換機到服務器的端口負載算法是不可配置的。
- 從服務器到交換機發出的數據的端口選擇,可以使用使用xmit_hash_policy這個配置項進行調整。如果通往段的多台服務器調用該綁定的服務器,則可以使用默認的算法layer2;對公網多個IP的來源訪問,可以修改layer2+3。可以參考官方文檔幫助:https://www.kernel.org/doc/Documentation/networking/bonding.txt