網卡bond是通過把多張網卡綁定為一個邏輯網卡,實現本地網卡的冗余,帶寬擴容和負載均衡。在應用部署中是一種常用的技術,我們公司基本所有的項目相關服務器都做了bond,這里總結整理,以便待查。
bond模式:
- Mode=0(balance-rr) 表示負載分擔round-robin,和交換機的聚合強制不協商的方式配合。
- Mode=1(active-backup) 表示主備模式,只有一塊網卡是active,另外一塊是備的standby,這時如果交換機配的是捆綁,將不能正常工作,因為交換機往兩塊網卡發包,有一半包是丟棄的。
- Mode=2(balance-xor) 表示XOR Hash負載分擔,和交換機的聚合強制不協商方式配合。(需要xmit_hash_policy)
- Mode=3(broadcast) 表示所有包從所有interface發出,這個不均衡,只有冗余機制...和交換機的聚合強制不協商方式配合。
- Mode=4(802.3ad) 表示支持802.3ad協議,和交換機的聚合LACP方式配合(需要xmit_hash_policy)
- Mode=5(balance-tlb) 是根據每個slave的負載情況選擇slave進行發送,接收時使用當前輪到的slave
- Mode=6(balance-alb) 在5的tlb基礎上增加了rlb。
5和6不需要交換機端的設置,網卡能自動聚合。4需要支持802.3ad。0,2和3理論上需要靜態聚合方式
但實測中0可以通過mac地址欺騙的方式在交換機不設置的情況下不太均衡地進行接收。
常用的有三種
mode=0:平衡負載模式,有自動備援,但需要”Switch”支援及設定。
mode=1:自動備援模式,其中一條線若斷線,其他線路將會自動備援。
mode=6:平衡負載模式,有自動備援,不必”Switch”支援及設定。
需要說明的是如果想做成mode 0的負載均衡,僅僅設置這里options bond0 miimon=100 mode=0是不夠的,與網卡相連的交換機必須做特殊配置(這兩個端口應該采取聚合方式),因為做bonding的這兩塊網卡是使用同一個MAC地址.從 原理分析一下(bond運行在mode 0下):
mode 0下bond所綁定的網卡的IP都被修改成相同的mac地址,如果這些網卡都被接在同一個交換機,那么交換機的arp表里這個mac地址對應的端口就有 多 個,那么交換機接受到發往這個mac地址的包應該往哪個端口轉發呢?正常情況下mac地址是全球唯一的,一個mac地址對應多個端口肯定使交換機迷惑 了。所以 mode0下的bond如果連接到交換機,交換機這幾個端口應該采取聚合方式(cisco稱 為 ethernetchannel,foundry稱為portgroup),因為交換機做了聚合后,聚合下的幾個端口也被捆綁成一個mac地址.我們 的解 決辦法是,兩個網卡接入不同的交換機即可。
mode6模式下無需配置交換機,因為做bonding的這兩塊網卡是使用不同的MAC地址。
Linux網口綁定
通過網口綁定(bond)技術,可以很容易實現網口冗余,負載均衡,從而達到高可用高可靠的目的。前提約定:
2個物理網口分別是:eth0,eth1
綁定后的虛擬口是:bond0
服務器IP是:192.168.0.100
第一步,配置設定文件:
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.0.100
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
#BROADCAST廣播地址
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
第二步,修改modprobe相關設定文件,並加載bonding模塊:
1.在這里,我們直接創建一個加載bonding的專屬設定文件/etc/modprobe.d/bonding.conf
[root@test ~]# vi /etc/modprobe.d/bonding.conf
#追加
alias bond0 bonding
options bonding mode=0 miimon=200
2.加載模塊(重啟系統后就不用手動再加載了)
[root@test ~]# modprobe bonding
3.確認模塊是否加載成功:
[root@test ~]# lsmod | grep bonding
bonding 100065 0
第三步,重啟一下網絡,然后確認一下狀況:
[root@test ~]# /etc/init.d/network restart
[root@test ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
……
[root@test ~]# ifconfig | grep HWaddr
bond0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth1 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
從上面的確認信息中,我們可以看到3個重要信息:
1.現在的bonding模式是active-backup
2.現在Active狀態的網口是eth0
3.bond0,eth1的物理地址和處於active狀態下的eth0的物理地址相同,這樣是為了避免上位交換機發生混亂。
任意拔掉一根網線,然后再訪問你的服務器,看網絡是否還是通的。
第四步,系統啟動自動綁定、增加默認網關:
[root@test ~]# vi /etc/rc.d/rc.local
#追加
ifenslave bond0 eth0 eth1
route add default gw 192.168.0.1
#如可上網就不用增加路由,0.1地址按環境修改.
------------------------------------------------------------------------
留心:前面只是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口個數
mode bond模式,在一般的實際應用中,0和1用的比較多。
二、通過虛擬機進行測試,驗證bond效果:
1、綁定兩塊網卡
一般生產環境是必須要保證7*24小時不間斷提供網絡傳輸服務的,使用網卡綁定技術不僅能夠提高網卡帶寬的傳輸速率,還能在其中一塊網卡出現故障時,依然能夠保證網絡正常使用。簡單來說,假設咱們對兩塊網卡實施了綁定技術,這樣在正常工作中它們會共同傳輸數據,使得網絡傳輸的速度變得更快,但只要其中有一塊網卡突然出現了故障,另外一塊網卡便會在0.1秒內自動頂替上去,保證數據傳輸不會中斷。
第1步:在虛擬機中額外添加1塊網卡設備,請一定要保證兩塊網卡都處在同一個網卡模式下,如圖所示,相同網卡模式的設備才可以做網卡綁定實驗,否則這兩塊網卡本身就是不能互相傳送數據的。
設置兩塊網卡設備為相同的網卡模式
2、通過vim文本編輯器來配置網卡設備的綁定參數,網卡綁定的理論很類似於RAID磁盤陣列組,咱們需要先逐個對參與網卡綁定的設備進行“初始設置”,這些原本獨立的網卡設備不需要再有自己的IP地址等信息,讓它們支持網卡綁定設備就可以了,然后還需要將綁定后的設備取名為bond0,將IP地址等信息填寫進去,這樣當用戶訪問到相應服務的時候,實際上就是由這兩塊網卡設備共同的在提供服務。
#配置二塊網卡
#第一塊網卡 [root@linux ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno16777736 MASTER=bond0 SLAVE=yes
#第二塊網卡 [root@linux ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno33554968 MASTER=bond0 SLAVE=yes
#配置bond網卡(默認沒有,需要自己創建) [root@linux ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=bond0 IPADDR=192.168.10.10 PREFIX=24 DNS=192.168.10.1 NM_CONTROLLED=no
3、讓內核支持網卡綁定驅動,常見的網卡綁定驅動模式有三種——mode0、mode1和mode6。比如對於一個提供NFS或者SAMBA服務的文件服務器來講,如果只能提供百兆網絡的最大傳輸速率,但同時下載用戶又特別多的情況下,那么網絡壓力一定是極大的,又比如是一個提供iscsi服務的網絡存儲服務器,在生產環境中網卡的可靠性是極為重要的,這種情況下就必須同時能夠保證網絡的傳輸速率以及網絡的安全性,因此比較好的選擇就是mode6方案了,因為mode6平衡復雜模式能夠讓兩塊網卡同時一起工作,當其中一塊網卡出現故障后能自動備援,提供了可靠的網絡傳輸保障,並且不需要交換機設備支援。
使用vim文本編輯器來創建一個網卡綁定內核驅動文件,使得bond0網卡設備能夠支持綁定技術(bonding),同時定義網卡綁定為mode6平衡負載模式,且當出現故障時
自動切換時間為100毫秒:
[root@linux ~]# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
4、重啟網絡服務后網卡綁定操作即可順利成功,正常情況下只有bond0網卡才會有IP地址等信息
[root@linux ~]# systemctl restart network [root@linux ~]# ifconfig bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500 inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::20c:29ff:fe9c:637d prefixlen 64 scopeid 0x20<link> ether 00:0c:29:9c:63:7d txqueuelen 0 (Ethernet) RX packets 700 bytes 82899 (80.9 KiB) RX errors 0 dropped 6 overruns 0 frame 0 TX packets 588 bytes 40260 (39.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500 ether 00:0c:29:9c:63:73 txqueuelen 1000 (Ethernet) RX packets 347 bytes 40112 (39.1 KiB) RX errors 0 dropped 6 overruns 0 frame 0 TX packets 263 bytes 20682 (20.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno33554968: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500 ether 00:0c:29:9c:63:7d txqueuelen 1000 (Ethernet) RX packets 353 bytes 42787 (41.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 325 bytes 19578 (19.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
咱們可以在本地主機執行ping 192.168.10.10的命令來檢查網絡連通性,然后突然在虛擬機硬件配置中隨機移除一塊網卡設備,能夠非常清晰的看到網卡 切換的過程(最多有1個數據丟包)。 [root@linux ~]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.109 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.102 ms 64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.066 ms ping: sendmsg: Network is unreachable 64 bytes from 192.168.10.10: icmp_seq=5 ttl=64 time=0.065 ms 64 bytes from 192.168.10.10: icmp_seq=6 ttl=64 time=0.048 ms 64 bytes from 192.168.10.10: icmp_seq=7 ttl=64 time=0.042 ms 64 bytes from 192.168.10.10: icmp_seq=8 ttl=64 time=0.079 ms ^C --- 192.168.10.10 ping statistics --- 8 packets transmitted, 7 received, 12% packet loss, time 7006ms rtt min/avg/max/mdev = 0.042/0.073/0.109/0.023 ms
備注:在CentOS系統上面默認沒有ifconfig命令,可以通過yum安裝
yum install net-tools -y