讲点1

什么是Bonding

        Bonding就是将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。当然,直接给两块网卡设置同一IP地址是不可能的。可以通过Centos系统自带服务bonding功能来实现虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。

Bonding应用方向

    网络负载均衡

对于Bonding的网络负载均衡是我们在文件服务器中常用到的,比如把三块网卡,当做一块来用,解决一个IP地址,流量过大,服务器网络压力过大的问题。对于文件服务器来说,比如NFS或SAMBA文件服务器,没有任何一个管理员会把内部网的文件服务器的IP地址弄很多个来解决网络负载的问题。如果在内网中,文件服务器为了管理和应用上的方便,大多是用同一个IP地址。对于一个百M的本地网络来说,文件服务器在多 个用户同时使用的情况下,网络压力是极大的,特别是SAMABA和NFS服务器。为了解决同一个IP地址,突破流量的限制,毕竟网线和网卡对数据的吞吐量是有限制的。如果在有限的资源的情况下,实现网络负载均衡,最好的办法就是Bonding。
    网络冗余 
对于服务器来说网络设备的稳定也是比较重要的,特别是网卡。在生产型的系统中,网卡的可靠性就更为重要了。在生产型的系统中,大多通过硬件设备的冗余来提供服务器的可靠性和安全性,比如电源。Bonding 也能为网卡提供冗余的支持。把多块网卡绑定到一个IP地址,当一块网卡发生物理性损坏的情况下,另一块网卡自动启用,并提供正常的服务,即:默认情况下只有一块网卡工作,其它网卡做备份。

Bonding的工作模式

        Mode 0 (balance-rr)

轮转(Round-robin)策略:从头到尾顺序的在每一个slave接口上发送数据包。本模式提供负载均衡和容错的能力

        Mode 1 (active-backup)

活动-备份(主备)策略:在绑定中,只有一个slave被激活。当且仅当活动的slave接口失败时才会激活其他slave。

为了避免交换机发生混乱此时绑定的MAC地址只有一个外部端口上可见

        Mode 2 (balance-xor)

平衡策略:基于指定的传输HASH策略传输数据包。缺省的策略是:(MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力

        Mode 3 (broadcast)

广播策略:在所有的slave接口上传送所有的报文。本模式提供容错能力。

        Mode 4 (802.3ad)

IEEE 802.3ad 动态链接聚合策略IEEE 802.3ad Dynamic link aggregation

特点:创建一个聚合组它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一激活聚合体下。

外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应性。

必要条件:

条件1ethtool支持获取每个slave的速率和双工设定;

条件2switch(交换机)支持IEEE 802.3ad Dynamic link aggregation;

条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式;

        Mode 5 (balance-tlb)

适配器传输负载均衡策略(Adaptive transmit load balancing

特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slaveMAC地址。

必要条件:ethtool支持获取每个slave的速率;

        Mode 6 (balance-alb)

适配器适应性负载均衡策略(Adaptive load balancing

特点:

1、该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。

2、来自服务器端接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave

3、使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上。

4、当某个链路被重新接上或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答不会被switch(交换机)所阻截。

必要条件:

1ethtool支持获取每个slave的速率;

2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个 bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave所接管;

mod=6mod=0的区别:

mod=6,先把eth0流量占满,再占eth1,…,ethX。mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6会发现第一个口流量很高,第2个口只占了小部分流量。

查看bond0状态:

cat /proc/net/bonding/bond0

关于Bonding的详细配置请参照

/usr/share/doc/kernel-doc-version/Documentation/networking/bonding.txt

配置及操作思路(先想好怎么做,别盲目下手)

步骤1、新添加一块网卡,总共两块网卡eth0、eth1

步骤2、在网卡配置文件目录下新建ifcfg-bond0配置文件,修改里面的内容为

[root@6 ~]# vim /etc/sysconfig-network-scripts/
DEVICE=bond0 (可选)
IPADDR=192.18.5.109 (可选)
PREFIX=24(可选)
BONDING_OPTS=“miimon=100 mode=1”(必填,实验模式我们选择mode=1)

步骤3、修改原网卡文件ifcfg-eth0和新建网卡配置文件eth1里面的地址修改为

DEVICE=eth0,eth1
MASTER=bond0
SLAVE=yes

步骤4、关闭NetworkManager服务并重启network服务

service NetworkManager stop
chkconfig NetworkManager off

步骤5、查看bond0状态:cat /proc/net/bonding/bond

步骤6、实际测验,把物理网卡模拟故障看配置文件和服务是否生效

步骤1

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第1张图片

步骤2

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第2张图片

步骤3

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第3张图片

到这里步骤基本算做完了,我们这里选择的Bonding的工作模式为mode1.所以我们要实现的功能是负载和容错。

其实很简单;就是用Bonding功能虚拟出来一个网卡,当物理网卡eth0,eth1其中一个故障,由bond0来自动指派其中一块网卡马上顶上去,实现网络不掉线,当然另外一块网卡是故障的你要想办法恢复就行。

步骤4

关闭chkconfig NetworkManager off 网络后台服务,因为这个服务程序在Centos6里很不稳定。给关了就行

然后如果以上配置修改完后用命令;service network restart 回车重启下服务

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第4张图片

步骤5

用cat /proc/net/bonding/bond0查看各个网卡的工作状态。

步骤6

实际测验,把物理网卡模拟故障看配置文件和服务是否生效

多网卡分组绑定

网卡的配置文件设置方法和上面选项‘配置及操作思路’相同;

指定目录下/etc/modprobe.d/bonding.conf 配置文件正确设置方法:

第一种你可以看到这种方式的话,多个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:是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路;
max_bonds:配置的bond口个数;

系统启动自动绑定、增加默认网关

[root@node1 ~]# vim /etc/rc.d/rc.local
#追加
ifenslave bond0 eth0 eth1
route add default gw 192.168.5.1

    讲点2

一块网卡定义多个IP地址(用网卡别名实现)

vim/etc/sysconfig/network-scripts/

1、复制ifcfg-eth0(静态地址)一份并命名为ifcfg-eth0:1

2、vim编辑网卡别名文件ifcfg-eth0:1

3、把DEVICE=eth0:1,后面的地址由您指定

4、保存,重启service NetworkManagerstart服务

5、ifconfig验证改过后的网卡地址信息

6、关闭服务chkconfig NetworkManageroff,开机不启动

步骤1,2,3

步骤4

wKiom1fIjGCwJcd2AAAOVweSfTo124.png

步骤5

步骤6

注意:

如果有多个地址按照以上方法,需要多少个地址就复制多少份文件并在原网卡信息后面加冒号和数字

cp ifcfg-eth0  ifcfg-eth0:1,2,3,4……

为每个设备别名生成独立的接口配置文件

一块网卡定义多个IP地址(一个接口是DHCP功能,另一个可以配置多个静态IP地址)

参考/usr/share/doc/initscripts-*/sysconfig.txt

注意:要实现此功能一定把网卡别名设置为静态,原始网卡地址配置为DHCP这样才能联网

vim/etc/sysconfig/network-scripts/

1、           修改网卡别名文件ifcfg-eth0:1,里面的地址修改为静态

2、           修改原网卡文件ifcfg-eth0,里面的地址修改为动态

3、           关闭NetworkManager服务并重启network服务

4、           ifconfig命令验证网卡配置信息

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第5张图片

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第6张图片

之前我们已经把NetworkManager服务给关闭了,所以这步省略,命令看上面。

      讲点3

Centos6.8修改网卡的配置文件信息

修改网卡的基本要求(会修改网卡配置文件)

第一步把对应的网卡名称name改成你想修改的名字

[root@6 ~]# cd /etc/udev/rules.d/70-persistent-net.rules

保存重启系统。这时是不生效的但是重启系统后网卡名字已改变

第二部修改网卡的对应配置文件

[root@6 ~]# vim/etc/sysconfig-network-scripts/eth0

第三部如果修改完毕后,不起作用;执行service network restart

因为害怕networkmanager服务有故障

CentOS 6.8 Bonding技术实现和网卡功能配置基础_第7张图片

Centos6.8的网卡配置文件说明(看图就可以)

vim/etc/sysconfig-network-scripts/eth0

修改网卡的配置文件信息手动配置静态static地址

[root@6 ~]# vim/etc/sysconfig-network-scripts/eth0

修改网卡的配置文件信息(改mac地址6.8)

[root@6 ~]# vim/etc/sysconfig-network-scripts/eth0

Centos6.8网卡配置文件丢失,手动更改方法(手动配置动态DHCP地址)

[root@6 ~]# vim/etc/sysconfig-network-scripts/eth0

验证的结果

done!!!