centos7双网卡绑定bond

1.bond简介

生产环境必须提供 7×24 小时的网络传输服务。借助于网卡绑定技术,不仅 可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正 常提供网络服务。假设我们对两块网卡实施了绑定技术,这样在正常工作中它们会共同传输 数据,使得网络传输的速度变得更快;而且即使有一块网卡突然出现了故障,另外一块网卡 便会立即自动顶替上去,保证数据传输不会中断。

bond模式:

1. Mode=0(balance-rr) 表示负载分担round-robin,和交换机的聚合强制不协商的方式配合。
2. Mode=1(active-backup) 表示主备模式,只有一块网卡是active,另外一块是备的standby,这时如果交换机配的是捆绑,将不能正常工作,因为交换机往两块网卡发包,有一半包是丢弃的。
3. Mode=2(balance-xor) 表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy)
4. Mode=3(broadcast) 表示所有包从所有interface发出,这个不均衡,只有冗余机制...和交换机的聚合强制不协商方式配合。
5. Mode=4(802.3ad) 表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy)
6. Mode=5(balance-tlb) 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave
7. 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地址

2.配置bond

以双网卡为例

2.1.配置两块网卡配置信息

[root@myx01/etc/sysconfig/network-scripts]$ cat ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=start
ONBOOT=yes
DEVICE=eth0
MASTER=bond0
SLAVE=yes
[root@myx01/etc/sysconfig/network-scripts]$ cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=start
ONBOOT=yes
DEVICE=eth1
MASTER=bond0
SLAVE=yes

2.2.配置bond网卡信息

[root@myx01/etc/sysconfig/network-scripts]$ cat ifcfg-bond0 
TYPE=Ethernet
BOOTPROTO=start
ONBOOT=yes
DEVICE=bond0
IPADDR=10.0.0.8
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS=114.114.114.114

2.3.配置内核网卡驱动模式

[root@myx01~]$ cat /etc/modprobe.d/bond.conf 
alias bond0 bonding
options bonding mode=6 miimon=100

2.4.重启网卡

[root@myx01~]$ systemctl restart network

2.5.查看bond是否生效

[root@myx01~]$ ifconfig
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500
        inet 10.0.0.8  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe77:2f9  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:77:02:f9  txqueuelen 1000  (Ethernet)
        RX packets 5614  bytes 445291 (434.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10968  bytes 839876 (820.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:0c:29:77:02:f9  txqueuelen 1000  (Ethernet)
        RX packets 1786  bytes 141747 (138.4 KiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 2990  bytes 199518 (194.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:0c:29:77:02:03  txqueuelen 1000  (Ethernet)
        RX packets 1665  bytes 126697 (123.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4022  bytes 308860 (301.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 447  bytes 91147 (89.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 447  bytes 91147 (89.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@myx01~]$ ping -c4 baidu.com
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=24.9 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=128 time=25.1 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=128 time=25.3 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=4 ttl=128 time=24.9 ms

--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 24.936/25.115/25.349/0.252 ms

3.自动化配置bond脚本

使用方式:sh boun.sh 网卡模式 IP地址

[root@localhost]# cat bound.sh
#!/bin/bash
#设置多网卡bond,实现网卡的高可用,提升网卡带宽
#此脚本需要传入两个参数 $1为bond模式  $2为boundIP地址

#判断传入的参数是否为2个
if [  $# = 2 ] ; then			
	#定义主机上网卡的名称变量
	NAME1=ens32
	NAME2=ens36

#定义要写入网卡配置文件的网络参数
	IPADDR=$2
	NETMASK=255.255.255.0
	GATEWAY=192.168.1.2
	DNS=223.5.5.5
else
	echo "脚本使用错误!!!!
        	格式为:$PWD/$0 [ 0-6 ] ipaddr
	例如:
        	$PWD/$0 网卡模式 192.168.1.100"
	exit 1;
fi

#生成bond配置文件
echo "alias bond0 bonding
options bonding mode=$1 miimon=100 " > /etc/modprobe.d/bonding.conf

#判断第一个网卡是否存在,如果存在就生成第一个网卡的配置文件
if [ ! -z $NAME1 ] ;then
	echo "DEVICE=$NAME1
	BOOTPROTO=none
	MASTER=bond0
	SLAVE=yes" > /etc/sysconfig/network-scripts/ifcfg-$NAME1
fi

#判断第二个网卡是否存在,如果存在就生成第二个网卡的配置文件
if [ ! -z $NAME2 ] ;then
	echo "DEVICE=$NAME2
	BOOTPROTO=none
	MASTER=bond0
	SLAVE=yes" > /etc/sysconfig/network-scripts/ifcfg-$NAME2
fi

#生成bond配置文件
echo "DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=$IPADDR
NETMASK=$NETMASK
GATEWAY=$GATEWAY
DNS1=$DNS " >/etc/sysconfig/network-scripts/ifcfg-bond0

#重启网络服务
systemctl  disable NetworkManager
systemctl  stop NetworkManager
modprobe -r bonding
modprobe  bonding
service network restart

#打印网络信息
echo "IPADDR=$IPADDR
NETMASK=$NETMASK
GATEWAY=$GATEWAY
DNS1=$DNS "