Linux下雙網卡綁定技術實現負載平衡和失效保護(在Centos5和Centos6通用)
保持伺服器的高可用性是企業級 IT 環境的重要因素。其中最重要的一點是伺服器網路連接的高可用性。網卡(NIC)綁定技術有助於保證高可用性特性並提供其它優勢以提高網路效能。
我們在這介紹的Linux雙網卡綁定實現就是使用兩塊網卡虛擬成為一塊網卡,這個彙總起來的裝置看起來是一個單獨的乙太網路介面裝置,通俗點講就是兩塊網卡具有相同的IP地址而並行連結彙總成一個邏輯鏈路工作。其實這項技術在Sun和Cisco中早已存在,被稱為Trunking和Etherchannel技術,在Linux的2.4.x的核心中也採用這這種技術,被稱為bonding。bonding技術的最早應用是在叢集——beowulf上,為了提高叢集節點間的資料轉送而設計的。下面我們討論一下bonding 的原理,什麼是bonding需要從網卡的混雜(promisc)模式說起。我們知道,在正常情況下,網卡只接收目的硬體地址(MAC Address)是自身Mac的乙太網路幀,對於別的資料幀都濾掉,以減輕驅動程式的負擔。但是網卡也支援另外一種被稱為混雜promisc的模式,可以接收網路上所有的幀,比如說tcpdump,就是運行在這個模式下。bonding也運行在這個模式下,而且修改了驅動程式中的mac地址,將兩塊網卡的Mac地址改成相同,可以接收特定mac的資料幀,然後把相應的資料幀傳送給bond驅動程式處理。
說了半天理論,其實配置很簡單,一共四個步驟:
實驗的作業系統是Redhat Linux Enterprise 3.0
綁定的前提條件:晶片集型號相同,而且網卡應該具備自己獨立的BIOS晶片
雙網卡綁定的拓樸圖(見)
1.編輯虛擬網路介面設定檔,指定網卡IP
vi /etc/sysconfig/network-scripts/ifcfg-bond0
[root@rhas-13 root]# cp/etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-bond0
2 #vi ifcfg-bond0DEVICE=bond0
BOOTPROTO=static
IPADDR=172.31.0.13
NETMASK=255.255.252.0
BROADCAST=172.31.3.254
ONBOOT=yes
TYPE=Ethernet這裡要注意,不要指定單個網卡的IP 位址、子網路遮罩或網卡 ID。將上述資訊指定到虛擬適配器(bond0)中即可。
[root@rhas-13 network-scripts]# vi ifcfg-eth0DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes[root@rhas-13 network-scripts]# vi ifcfg-eth1DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes3 # vi /etc/modprobe.conf
編輯 /etc/modprobe.conf 檔案,加入如下一行內容,以使系統在啟動時載入bonding模組,對外虛擬網路介面裝置為 bond0
加入下列兩行alias bond0 bonding
options bond0 mode=0 miimon=250 use_carrier=1 updelay=500 downdelay=500說明:miimon是用來進行鏈路監測的。 比如:miimon=100,那麼系統每100ms監測一次鏈路串連狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3等四種模式,常用的為0,1兩種。
mode=0表示load balancing (round-robin)為負載平衡方式,兩塊網卡都工作。
mode=1表示fault-tolerance (active-backup)提供冗餘功能,工作方式是主備的工作方式,也就是說預設情況下只有一塊網卡工作,另一塊做備份。
bonding只能提供鏈路監測,即從主機到交換器的鏈路是否接通。如果只是交換器對外的鏈路down掉了,而交換器本身並沒有故障,那麼bonding會認為鏈路沒有問題而繼續使用
到這時已經配置完畢,重啟服務即可
service network restart
重啟會看見以下資訊就表示配置成功了
...............。
Bringing up interface bond0 OK
Bringing up interface eth0 OK
Bringing up interface eth1 OK
...............。
下面我們討論以下mode分別為0,1時的情況
mode=1工作在主備模式下,這時eth1作為備份網卡是no arp的
[root@rhas-13 network-scripts]# ifconfig驗證網卡的配置資訊
bond0 Link encap:EthernetHWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13Bcast:172.31.3.255Mask:255.255.252.0
UP BROADCAST RUNNING MASTER MULTICASTMTU:1500Metric:1
RX packets:18495 errors:0 dropped:0 overruns:0 frame:0
TX packets:480 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1587253 (1.5 Mb)TX bytes:89642 (87.5 Kb)
eth0Link encap:EthernetHWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13Bcast:172.31.3.255Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICASTMTU:1500Metric:1
RX packets:9572 errors:0 dropped:0 overruns:0 frame:0
TX packets:480 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:833514 (813.9 Kb)TX bytes:89642 (87.5 Kb)
Interrupt:11
eth1Link encap:EthernetHWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13Bcast:172.31.3.255Mask:255.255.252.0
UP BROADCAST RUNNING NOARP SLAVE MULTICASTMTU:1500Metric:1
RX packets:8923 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:753739 (736.0 Kb)TX bytes:0 (0.0 b)
Interrupt:15
那也就是說在主備模式下,當一個網路介面失效時(例如主交換器掉電等),不會出現網路中斷,系統會按照cat /etc/rc.d/rc.local裡指定的網卡順序工作,機器仍能對外服務,起到了失效保護的功能。
在mode=0負載平衡工作模式,他能提供兩倍的頻寬,下面我們來看一下網卡的配置資訊
[root@rhas-13 root]# ifconfig
bond0 Link encap:EthernetHWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13Bcast:172.31.3.255Mask:255.255.252.0
UP BROADCAST RUNNING MASTER MULTICASTMTU:1500Metric:1
RX packets:2817 errors:0 dropped:0 overruns:0 frame:0
TX packets:95 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:226957 (221.6 Kb)TX bytes:15266 (14.9 Kb)
eth0Link encap:EthernetHWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13Bcast:172.31.3.255Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICASTMTU:1500Metric:1
RX packets:1406 errors:0 dropped:0 overruns:0 frame:0
TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:113967 (111.2 Kb)TX bytes:7268 (7.0 Kb)
Interrupt:11
eth1Link encap:EthernetHWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13Bcast:172.31.3.255Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICASTMTU:1500Metric:1
RX packets:1411 errors:0 dropped:0 overruns:0 frame:0
TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:112990 (110.3 Kb)TX bytes:7998 (7.8 Kb)
Interrupt:15
在這種情況下出現一塊網卡失效,僅僅會是伺服器出口頻寬下降,也不會影響網路使用。
通過查看bond0的工作狀態查詢能詳細的掌握bonding的工作狀態
[root@rhas-13 bonding]# cat /proc/net/bonding/bond0
bonding.c:v2.4.1 (September 15, 2003)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
Multicast Mode: all slaves
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8a
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8b
Linux下通過網卡綁定技術既增加了伺服器的可靠性,又增加了可用網路頻寬,為使用者提供不間斷的關鍵服務。
前面只是2個網口綁定成一個bond0的情況,如果我們要設定多個bond口,比如物理網口eth0和eth1組成bond0,eth2和eth3組成bond1,
那麼網口設定檔案的設定方法和上面第1步講的方法相同,只是/etc/modprobe.d/bonding.conf的設定就不能像下面這樣簡單的疊加了:
alias bond0 bonding
options bonding mode=1 miimon=200
alias bond1 bonding
options bonding mode=1 miimon=200
正確的設定方法有2種:
第一種,你可以看到,這種方式的話,多個bond口的模式就只能設成相同的了:
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=1
第二種,這種方式,不同的bond口的mode可以設成不一樣:
alias bond0 bonding
options bond0 miimon=100 mode=1
install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0
仔細看看上面這2種設定方法,現在如果是要設定3個,4個,甚至更多的bond口,你應該也會了吧!
後記:簡單的介紹一下上面在載入bonding模組的時候,options裡的一些參數的含義:
miimon監視網路連結的頻度,單位是毫秒,我們設定的是200毫秒。
max_bonds 配置的bond口個數
modebond模式,主要有以下幾種,在一般的實際應用中,0和1用的比較多,
如果你要深入瞭解這些模式各自的特點就需要靠讀者你自己去查資料並做實踐了。
0或balance-rr 輪轉策略,提供負載平衡和耐故障功能,按順序輪流把包發給包含在bond口內的網口。
1或active-backup主備策略,提供高耐故障功能,邏輯簡單,一個處於啟用狀態,一個失敗,另外一個自動啟用。
2或balance-xorXOR策略,提供負載平衡和耐故障功能。
3或broadcast廣播策略,耐故障功能。把資料以廣播的方式,發給包含在該bond口內的所有網口。
4或802.3adIEEE 802.3ad動態連結集合。
5或balance-tlb自動適應傳輸負載平衡策略。
6或balance-alb自動適應負載平衡策略。