Linux网卡绑定与解绑

通过网口绑定(bond)技术,可以很容易实现网口冗余,负载均衡,从而达到高可用高可靠的目的。
Kernels 2.4.12及以后的版本均供bonding模块,以前的版本可以通过patch实现。
•使用以下命令确定内核是否支持 bonding:
cat /boot/config-2.X.XX-XXX.el6.x86_64 |grep -i bonding
输出:CONFIG_BONDING=m  //支持
★bond模式:
▪Mode=0(balance-rr) 表示负载分担round-robin(轮询模式),并且是轮询的方式比如第一个包走eth0,第二个包走eth1,直到数据包发送完毕。
                   和交换机的聚合强制不协商的方式配合。
     优点:流量提高一倍。
     缺点:需要接入交换机做端口聚合,否则可能无法使用。
▪Mode=1(active-backup) 表示主备模式,只有一块网卡是active,另外一块是备的standby,这时如果交换机配的是捆绑,
      将不能正常工作,因为交换机往两块网卡发包,有一半包是丢弃的。
    优点:冗余性高。
    缺点:链路利用率低,两块网卡只有1块在工作。
▪Mode=2(balance-xor)(平衡策略)
                   表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy,
                   需要交换机配置port channel)
    特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。
          其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力。
▪Mode=3(broadcast)(广播策略)
                 表示所有包从所有interface发出,这个不均衡,只有冗余机制但过于浪费资源。
                 此模式适用于金融行业等需要高可靠性的网络。需要和交换机的聚合强制不协商方式配合。
    特点:在每个slave接口上传输每个数据包,此模式提供了容错能力。
▪Mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合) 
               表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy)。
               标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的
               其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
    特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
          外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。
          需要注意的是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。
          不同的实现可能会有不同的适应性。
    必要条件:
        条件1:ethtool支持获取每个slave的速率和双工设定。
        条件2:switch(交换机)支持IEEE802.3ad Dynamic link aggregation。
        条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式。
▪Mode=5(balance-tlb)(适配器传输负载均衡) 
                   是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。
                   该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
    特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。
          如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
    必要条件:
        ethtool支持获取每个slave的速率。
▪Mode=6(balance-alb)
       在5的tlb基础上增加了rlb(接收负载均衡receiveload balance).不需要任何switch(交换机)的支持。
       接收负载均衡是通过ARP协商实现的.
    特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receiveload balance, rlb),
     而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,
     并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
      来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。
     当ARP应答从对端到达时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。
     使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,
     因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新(ARP应答)来解决,
     应答中包含他们独一无二的硬件地址,从而导致流量重新分布。当新的slave加入到bond中时,或者某个未激活的slave重新激活时,
     接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上当某个链路被重新接上,
     或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。
     下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答不会被switch(交换机)阻截。
   必要条件:
      条件1:ethtool支持获取每个slave的速率;
      条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,
             同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
▪bond模式小结:
    •mode5和mode6不需要交换机端的设置,网卡能自动聚合。mode4需要支持802.3ad。
    •mode0,mode2和mode3理论上需要静态聚合方式。但实测中0可以通过mac地址欺骗的
    方式在交换机不设置的情况下不太均衡地进行接收。
    •mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。
     而mod=6,会发现第一个口流量很高, 第2个口只占了小部分流量。
★常用的有三种
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。
▪需要说明的是如果想做成mode 0的负载均衡,仅仅设置这里options bond0 miimon=100 mode=0是不够的,
与网卡相连的交换机必须做特殊配置(这两个端口应该采取聚合方式),因为做bonding的这两块网卡
是使用同一个MAC地址.原理分析如下:
mode 0下bond所绑定的网卡的IP都被修改成相同的mac地址,如果这些网卡都被接在同一个交换机,
那么交换机的arp表里这个mac地址对应的端口就有 多 个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?
正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑 了。所以 mode0下的bond如果连接到交换机,
交换机这几个端口应该采取聚合方式(cisco称 为 ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,
聚合下的几个端口也被捆绑成一个mac地址.当然有一个回避方法:两个网卡接入不同的交换机即可。
▪mode6模式下无需配置交换机,因为做bonding的这两块网卡是使用不同的MAC地址。
下面的通过命令实现的网卡绑定,也可以借助nmtui网卡配置工具,在图形界面中手动完成。
●单网卡绑定的情况(只有一个bond0)
★Step01,配置网卡设定文件:
▪/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=XXXXXXXX
BOOTPROTO=none/static/dhcp
ONBOOT=yes
IPADDR=192.168.0.100
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255  #BROADCAST广播地址
DNS1=10.0.0.1
DNS2=10.0.0.2
GATEWAY=10.0.0.254
BONDING_OPTS="miimon=100 mode=0" //这一步也可以在下面/etc/modprobe.d/bonidng.conf里面填写。
▪/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=XXXXXXXX
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
▪/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=XXXXXXXX
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
★Step02,修改modprobe相关设定文件,并加载bonding模块:
1.创建一个加载bonding的专属设定文件/etc/modprobe.d/bonding.conf
[root@MyVM ~]# vi /etc/modprobe.d/bonding.conf
#add
alias bond0 bonding
options bonding mode=0 miimon=200
▶注意:linux网卡bonging的备份模式实验在真实机器上做完全没问题(前提是linux内核支持),
但是在vmware workstation虚拟中有问题。bond0虽然能够正常启动也能够正常使用,
只不过没有起到备份模式的效果。当使用ifdown eth0后,网络出现不通现象。
内核文档中有说明:bond0获取mac地址有两种方式,一种是从第一个活跃网卡中获取mac地址,
然后其余的SLAVE网卡的mac地址都使用该mac地址;另一种是使用fail_over_mac参数,
是bond0使用当前活跃网卡的mac地址,mac地址或者活跃网卡的转换而变。  
既然vmware workstation不支持第一种获取mac地址的方式,那么可以使用fail_over_mac=1参数,
所以这里添加fail_over_mac=1参数如下:
alias bond0 bonding
options bond0 miimon=100 mode=0 fail_over_mac=1
2.加载模块(重启系统后就不用手动再加载了)
[root@MyVM ~]# modprobe bonding
3.确认模块是否加载成功:
[root@MyVM ~]# lsmod | grep bonding
bonding XXXXXXX 0
★Step03,重启网络,确认状况:
[root@MyVM ~]# /etc/init.d/network restart
[root@MyVM ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
[root@MyVM ~]# ifconfig | grep HWaddr
bond0 Link encap:Ethernet HWaddr 00:22:46:xx:xx:xx
eth0 Link encap:Ethernet HWaddr 00:22:46:xx:xx:xx
eth1 Link encap:Ethernet HWaddr 00:22:46:xx:xx:xx
从上面的确认信息中,我们可以看到3个重要信息:
1.现在的bonding模式是active-backup
2.现在Active状态的网口是eth0
3.bond0,eth1的物理地址和处于active状态下的eth0的物理地址相同,这样是为了避免上位交换机发生混乱。
★Step04,系统启动自动绑定、增加默认网关:
[root@MyVM ~]# vi /etc/rc.d/rc.local
#add
ifenslave bond0 eth0 eth1
route add default gw 192.168.0.1
#如可上网就不用增加路由,0.1地址按环境修改.
●多网卡绑定的情况
如果要设置多个bond口,比如物理网口eth0和eth1组成bond0,eth2和eth3组成bond1,
①网口设置文件的设置方法和上面相同,
②/etc/modprobe.d/bonding.conf的设定,做如下修改。
正确的设置方法有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
•options参数的含义:
miimon :监视网络链接的频度,单位是毫秒。
max_bonds: 配置的bond口个数
mode bond模式:在一般的实际应用中,0和1用的比较多。
●实例如下:
(1),虚拟环境下,测试网卡的模式应该一致(同为桥接,host-only等)。
(2),#配置二块网卡<br>#第一块网卡
[root@MyVM ~]# vim /etc/sysconfig/network-scripts/ifcfg-enoxxxxxxx
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=enoxxxxxxx
MASTER=bond0
SLAVE=yes
<br>#第二块网卡
[root@MyVM ~]# vim /etc/sysconfig/network-scripts/ifcfg-enoyyyyyyyy
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=enoyyyyyyyy
MASTER=bond0
SLAVE=yes
<br>#配置bond网卡(默认没有,需要自己创建)
[root@MyVM ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond0
IPADDR=192.168.1.11
PREFIX=24
DNS=192.168.1.10
NM_CONTROLLED=no
(3),让内核支持网卡绑定驱动,常见的网卡绑定驱动模式有三种——mode0、mode1和mode6。
比如对于一个提供NFS或者SAMBA服务的文件服务器,以及iscsi服务的网络存储服务器,
为了保证网络的传输速率以及网络的安全性,选择mode6比较好,因为mode6平衡复杂模式能够让
两块网卡同时一起工作,当其中一块网卡出现故障后能自动备援,提供了可靠的网络传输保障,
并且不需要交换机设备支援。 
使用vim文本编辑器来创建一个网卡绑定内核驱动文件,使得bond0网卡设备能够支持绑定技术(bonding),
定义网卡绑定为mode6平衡负载模式,出现故障时自动切换时间为100毫秒:
[root@MyVM ~]# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
(4),重启网络
systemctl restart network
--------------------------------------
●centos6.x,是否需要如下操作,未做确认。
①先停止NetworkManager
service NetworkManager stop 
chkconfig NetworkManager off  
②ifcfg-bond0文件中
TYPE=UnKnown //或者Ethernet(若Networkmanager未关闭 就用unknown )
--------------------------------------
●网卡绑定解除:
①删除ifcfg-bond0,和删除/etc/modprobe.d/bonding.conf
②修改ifcfg-eth0和ifcfg-eth1为绑定前的配置
③rmmod bonding(很重要)
④service network restart

猜你喜欢

转载自www.cnblogs.com/mountain2011/p/9110926.html
今日推荐