Linux下多網卡冗餘的實現 一、簡介 所謂多網卡冗餘就是通過工具把多張網卡綁定成一個IP地址(bond0屬於虛擬網卡)使用。這項技術在大中小企業都無比受用。如下圖: 多網卡的綁定的優點: 1、擴大伺服器的網路帶寬 2、可以有效均衡負載和提高容錯能力,避免單點失效 3、一旦發生故障,無縫切換網卡。 ...
Linux下多網卡冗餘的實現
一、簡介
所謂多網卡冗餘就是通過工具把多張網卡綁定成一個IP地址(bond0屬於虛擬網卡)使用。這項技術在大中小企業都無比受用。如下圖:
多網卡的綁定的優點:
1、擴大伺服器的網路帶寬
2、可以有效均衡負載和提高容錯能力,避免單點失效
3、一旦發生故障,無縫切換網卡。
二、實現環境
虛擬機環境下加上本地的和添加的一共3張網卡分別是:eth0、eth1、eth2
IP:192.168.0.153/24
(同樣物理機的不過是物理添加網卡,或者是多網卡伺服器,一樣可以作綁定)
三、搭建
首先大家可以看到主機上面的幾張網卡,列出來
[root@YuanLiu-153 ~]# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:25 inet addr:192.168.0.153 Bcast:192.168.3.255 Mask:255.255.252.0 inet6 addr: fe80::20c:29ff:fe1d:7a25/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:315026 errors:0 dropped:0 overruns:0 frame:0 TX packets:160536 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:313603361 (299.0 MiB) TX bytes:12994253 (12.3 MiB) eth1 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:2F BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 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:0 (0.0 b) TX bytes:0 (0.0 b) eth2 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:39 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 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:0 (0.0 b) TX bytes:0 (0.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@YuanLiu-153 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:1d:7a:25 brd ff:ff:ff:ff:ff:ff inet 192.168.0.153/22 brd 192.168.3.255 scope global eth0 inet6 fe80::20c:29ff:fe1d:7a25/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 00:0c:29:1d:7a:2f brd ff:ff:ff:ff:ff:ff 4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 00:0c:29:1d:7a:39 brd ff:ff:ff:ff:ff:ff
下麵我們把eth0-2都綁成bond0的虛擬網卡,先去修改eth0-2的網卡配置信息
[root@YuanLiu-153 network-scripts]# cd /etc/sysconfig/network-scripts
eth0-2:
[root@YuanLiu-153 network-scripts]# cat ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none MASTER=bond0 SLAVE=yes
[root@YuanLiu-153 network-scripts]# cat ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none MASTER=bond0 SLAVE=yes
[root@YuanLiu-153 network-scripts]# cat ifcfg-eth2 DEVICE=eth2 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none MASTER=bond0 SLAVE=yes
bond0:
[root@YuanLiu-153 network-scripts]# cat ifcfg-bond0 DEVICE=bond0 ONBOOT=yes BOOTPROTO=none IPADDR=192.168.0.153 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=8.8.8.8
# DEVICE=物理設備名
IPADDR=IP地址
NETMASK=掩碼值
NETWORK=網路地址
BROADCAST=廣播地址
GATEWAY=網關地址
ONBOOT=[yes|no](引導時是否激活設備)
USERCTL=[yes|no](非root用戶是否可以控制該設備)
BOOTPROTO=[none|static|bootp|dhcp](引導時不使用協議|靜態分配|BOOTP協議|DHCP協議)
HWADDR = 你的MAC地址
有的參數並非必需。
http://blog.chinaunix.net/uid-9967220-id-1995610.html
還有其實參數,比如PEERDNS=[yes|no],如果是通過DHCP獲取IP,是否要將DNS寫入/etc/resolv.conf,應該會覆蓋原來的內容!
【註意1】
Max_bonds=2 多個bonding的情況下需要這個參數等於2代表有兩個bond0 比如:4個網卡,兩兩綁定
如果系統存在多塊網卡,eth0,eth1,eth2,eth3,我們現在希望兩兩做備份,這樣在系統就可以配置多個bonding了,需要在載入bonding的時候載入一個參數,max_bonds,比如:
modprobe bonding max_bonds=2
我們可以加入
alias bond0 bonding
options bonding mod=blance-rr miimon=100 max_bonds=2
alias bond1 bonding
options bonding mod=active-backup miimon=100 primary=eth2 max_bonds=2
多個bonding,最好加上這個參數,否則可能在網路重啟後會提示找不到BOND1之類的消息!
【註意2】
如果網卡參數里不寫MASTER=bond0和SLAVE=yes,就要執行
在/etc/rc.d/rc.local 加入如下一行(啟動時執行此行命令)
ifenslave bond0 eth0 eth1
如果寫了的話,這一步就可有可無了!我這裡都寫了!
所以網卡的配置信息完畢,下麵配置bond0模式綁定:
[root@YuanLiu-153 network-scripts]# vim /etc/modprobe.d/bonding.conf
#增加這兩條信息,相關的網卡驅動
alias bond0 bonding options bond0 miimon=120 mode=1
【bonding.conf配置文件解析以及綁定的模式】
modprobe.conf配置文件中的解釋:
miimon是用來進行鏈路檢測的。比如miimon=100,那麼系統每隔100毫秒就檢測一次鏈路的 鏈接狀態,如果一條線路不通就轉入另外一天鏈路
mode的值表示bonding的工作模式,一個有0、1、2、3、4、5、6七種模式,常用的有0、1兩種,可以根據工作模式適當的選擇:
0、(balance-rr)Round-robin policy:(平衡輪迴圈策略):傳輸數據包的順序是一次傳輸,知道最後一個傳輸完畢,此模式提供負載均衡和容錯能力(這個好像要交換機支持,不知道什麼意思), 在這種情況下,帶寬理論上是雙倍的,斷開一個網卡只是帶寬減少了
1、(active-backup)Active-backup policy:(主-備策略):只有一個設備處於活動的狀態。一個如果宕掉了則立馬有備份轉移到另外一個主設備。mac地址是外部可見的。這個模式提供了容錯能力,在這種情況下,ETH1作為備份,是NO ARP狀態的,可以使用ifconfig查看到,只有ETH0斷開,它才會接管
2、(blance-xor)XOR policy:(廣播策略):將所有數據包傳輸給所有介面。此模式提供了容錯能力
3、(blance-xor)XOR policy:(平衡策略):傳輸根據源地址布爾值選擇傳輸設備。此模式提供負載平衡和容錯能力
4、(802.3 ad)IEEE 802.3ad Dynamic link aggregation:(IEEE 802.3ad動態鏈接聚合):創建共用相同的速度和雙工設置的聚合組
5、(balance-tlb)Adaptive transmit load balancing:(適配器傳輸負載均衡):沒有特殊策略,第一個設備傳不通就用另一個設備接管第一個設備正在處理的mac地址,幫助第一個進行傳輸
6、(balance-alb)Adaptive load balancing:(適配器傳輸負載均衡):大致意思是包括mod5,bonding驅動程式截獲ARP在本地系統發送的請求,用其中之一的硬體地址覆蓋從屬設備的原地址。就像是伺服器上不同的人使用不同的硬體地址一樣(這個好像不用交換機支持)
最後執行命令生效或者重啟:
modprobe bonding
[root@YuanLiu-153 network-scripts]# service network restart 正在關閉介面 bond0: [確定] 關閉環回介面: [確定] 彈出環回介面: [確定] 彈出界面 bond0: Determining if ip address 192.168.0.153 is already in use for device bond0... [確定] [root@YuanLiu-153 network-scripts]# ifconfig -a bond0 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:25 inet addr:192.168.0.153 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe1d:7a25/64 Scope:Link UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:554253 errors:0 dropped:0 overruns:0 frame:0 TX packets:309064 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:632576726 (603.2 MiB) TX bytes:26435542 (25.2 MiB) eth0 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:25 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:554254 errors:0 dropped:0 overruns:0 frame:0 TX packets:309065 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:632576786 (603.2 MiB) TX bytes:26435776 (25.2 MiB) eth1 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:25 UP BROADCAST SLAVE MULTICAST MTU:1500 Metric:1 RX packets:0 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:0 (0.0 b) TX bytes:0 (0.0 b) eth2 Link encap:Ethernet HWaddr 00:0C:29:1D:7A:25 UP BROADCAST SLAVE MULTICAST MTU:1500 Metric:1 RX packets:0 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:0 (0.0 b) TX bytes:0 (0.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@YuanLiu-153 network-scripts]# lsmod | grep bonding bonding 128245 0 8021q 25349 1 bonding ipv6 317340 282 bonding,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
說明網卡冗餘已經起效了。
最後再把這個配置做到rc.local下,開機啟動:
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local ifensalve bond0 eth0 eth1 eth2 #添加
四、總結
如果是在物理機上面做測試是非常方便的,比如綁定4個網卡eth0-3
那麼4跟網線都接上了,然後ping著網關。你只要不是4跟網線都拔完,隨機的拔掉3根都不會影響它的連通性。
這就是冗餘容錯的效果,1根網線100M的話。插上4根就是400M的出口流量了。
註意:配置的時候看清楚參數
[上述若是有錯誤或者不明瞭的地方,希望大家指出]