防伪码:没有相当程度的孤独是不可能有内心的平和。
1、概述
随着技术的发展,四张及以上的千兆以太网卡(NIC)已经变成了服务器的标配。而在生产环境中,为了保证Linux服务器的网络稳定,会对服务器的多张网卡通过绑定一个IP的方式来实现网卡的热备冗余,增强网络的高可用和提升网络吞吐,避免业务中断。
Linux的多网卡绑定功能使用的是内核中的"bonding"模块,主流Linux发行版本的内核均包含此模块。
网卡绑定的模式(mode)共有七种(0~6) :bond0、bond1、bond2、bond3、bond4、bond5、bond6
其中常用的有三种:
mode=0:round robin,平衡负载模式,有自动备援,且增加了带宽,能够大幅提升服务器的网络吞吐(I/O),但需要交换机支持。
mode=1:active-backup,主-备份策略,一张网卡处于活动状态 ,另一张处于备份状态,所有流量都在主链路上处理。而且该模式下的网卡MAC地址是外部可见得,从外面看来,bond的MAC地址是唯一的,从而避免交换机发生混乱。该模式只提供了容错能力,而没有负载功能。优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N。
mode=6:平衡负载模式,有自动备援,且增加了带宽,不需要交换机支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
2、mode=1测试
2.1 测试环境
主机名 | IP | 系统 |
test-01 | 192.168.10.51 | CentOS release 6.9 (Final) |
本次测试通过VMware Workstation模拟。
2.2 添加网卡
在【虚拟机设置】中添加网络适配器。
查看网卡是否添加:
[root@test-01~]#ifconfig-a eth0Linkencap:EthernetHWaddr00:0C:29:66:30:36 inetaddr:192.168.10.51Bcast:192.168.10.255Mask:255.255.255.0 inet6addr:fe80::20c:29ff:fe66:3036/64Scope:Link UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1 RXpackets:91errors:0dropped:0overruns:0frame:0 TXpackets:76errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:9813(9.5KiB)TXbytes:11278(11.0KiB) eth1Linkencap:EthernetHWaddr00:0C:29:66:30:40 BROADCASTMULTICASTMTU:1500Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0(0.0b)TXbytes:0(0.0b) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:65536Metric:1 RXpackets:80errors:0dropped:0overruns:0frame:0 TXpackets:80errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:5360(5.2KiB)TXbytes:5360(5.2KiB)
2.3 创建bond
[root@test-01~]#cd/etc/sysconfig/network-scripts/ [root@test-01network-scripts]#cpifcfg-eth0ifcfg-bond0 [root@test-01network-scripts]#vimifcfg-bond0 DEVICE=bond0 TYPE=Ethernet ONBOOT=on NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.10.51 GATEWAY=192.168.10.2 NETMASK=255.255.255.0 DNS1=223.5.5.5
修改eth0:
[root@test-01network-scripts]#vimifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=on BOOTPROTO=none MASTER=bond0 SLAVE=yes
修改eth1:
[root@test-01network-scripts]#vimifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=on BOOTPROTO=none MASTER=bond0 SLAVE=yes
说明:MASTER=bond0和SLAVE=yes这两行参数主要是用于系统service network restart后自动启用。
2.4 模块加载
[root@test-01network-scripts]#echo"aliasbond0bonding">>/etc/modprobe.d/dist.conf [root@test-01network-scripts]#echo"optionsbond0mode=1miimon=100">>/etc/modprobe.d/dist.conf
:miimon是用来监测链路的,单位是ms(毫秒),即系统每100ms监测一次链路连接状态,若有一条链路不通就转入另一条链路。mode=1表示fault-tolerance (提供冗余功能)。
2.5 重启网卡
[root@test-01~]#servicenetworkrestart
bond0、eth0和eth1的MAC地址均变成之前eth0的MAC地址。
[root@test-01network-scripts]#ifconfig bond0Linkencap:EthernetHWaddr00:0C:29:66:30:36 inetaddr:192.168.10.51Bcast:192.168.10.255Mask:255.255.255.0 inet6addr:fe80::20c:29ff:fe66:3036/64Scope:Link UPBROADCASTRUNNINGMASTERMULTICASTMTU:1500Metric:1 RXpackets:33errors:0dropped:0overruns:0frame:0 TXpackets:31errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:2508(2.4KiB)TXbytes:3486(3.4KiB) eth0Linkencap:EthernetHWaddr00:0C:29:66:30:36 UPBROADCASTRUNNINGSLAVEMULTICASTMTU:1500Metric:1 RXpackets:971errors:0dropped:0overruns:0frame:0 TXpackets:686errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:91772(89.6KiB)TXbytes:103730(101.2KiB) eth1Linkencap:EthernetHWaddr00:0C:29:66:30:36 UPBROADCASTRUNNINGSLAVEMULTICASTMTU:1500Metric:1 RXpackets:14errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:872(872.0b)TXbytes:0(0.0b) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:65536Metric:1 RXpackets:80errors:0dropped:0overruns:0frame:0 TXpackets:80errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:5360(5.2KiB)TXbytes:5360(5.2KiB)
3、mode=1验证
3.1 断开eth0测试
宿主机ping192.168.10.51测试:
ping-t192.168.10.51
默认连接的Slave是eth0,当断开eth0,观察到bond已经切换到eth1:
[root@test-01~]#cat/proc/net/bonding/bond0 EthernetChannelBondingDriver:v3.7.1(April27,2011) BondingMode:fault-tolerance(active-backup) PrimarySlave:None CurrentlyActiveSlave:eth1 MIIStatus:up MIIPollingInterval(ms):100 UpDelay(ms):0 DownDelay(ms):0 SlaveInterface:eth0 MIIStatus:up Speed:1000Mbps Duplex:full LinkFailureCount:1 PermanentHWaddr:00:0c:29:66:30:36 SlavequeueID:0 SlaveInterface:eth1 MIIStatus:up Speed:1000Mbps Duplex:full LinkFailureCount:1 PermanentHWaddr:00:0c:29:66:30:40 SlavequeueID:0
在宿主机上观察到ping有一次丢包:
正在Ping192.168.10.51具有32字节的数据: 来自192.168.10.51的回复:字节=32时间=1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 请求超时。 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64
3.2 断开eth1测试
同理,重新连接eth0,断开eth1,bond切换到eth0:
[root@test-01~]#cat/proc/net/bonding/bond0 EthernetChannelBondingDriver:v3.7.1(April27,2011) BondingMode:fault-tolerance(active-backup) PrimarySlave:None CurrentlyActiveSlave:eth0 MIIStatus:up MIIPollingInterval(ms):100 UpDelay(ms):0 DownDelay(ms):0 SlaveInterface:eth0 MIIStatus:up Speed:1000Mbps Duplex:full LinkFailureCount:1 PermanentHWaddr:00:0c:29:66:30:36 SlavequeueID:0 SlaveInterface:eth1 MIIStatus:down Speed:Unknown Duplex:Unknown LinkFailureCount:2 PermanentHWaddr:00:0c:29:66:30:40 SlavequeueID:0
切换的时候也丢了一次包:
来自192.168.10.51的回复:字节=32时间=1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 请求超时。 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 请求超时。 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64 来自192.168.10.51的回复:字节=32时间<1msTTL=64
4、mode=6测试
4.1 配置
配置方法和mode=1差不多。
在mode=1的基础上修改/etc/sysconfig/network-scripts/ifcfg-bond0
echo"BONDING_OPTS='miimon=100mode=6'">>/etc/sysconfig/network-scripts/ifcfg-bond0
将mode=1改为mode=6:
sed-i's#mode=1#mode=6#g'/etc/modprobe.d/dist.conf
重启网卡:
servicenetworkrestart
4.2 验证
再次查看网卡信息,eth1网卡的MAC地址都变成了原来的了:
[root@test-01~]#ifconfig bond0Linkencap:EthernetHWaddr00:0C:29:66:30:36 inetaddr:192.168.10.51Bcast:192.168.10.255Mask:255.255.255.0 inet6addr:fe80::20c:29ff:fe66:3036/64Scope:Link UPBROADCASTRUNNINGMASTERMULTICASTMTU:1500Metric:1 RXpackets:3922errors:0dropped:0overruns:0frame:0 TXpackets:3710errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:354254(345.9KiB)TXbytes:288643(281.8KiB) eth0Linkencap:EthernetHWaddr00:0C:29:66:30:36 UPBROADCASTRUNNINGSLAVEMULTICASTMTU:1500Metric:1 RXpackets:3734errors:0dropped:0overruns:0frame:0 TXpackets:3517errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:337074(329.1KiB)TXbytes:270629(264.2KiB) eth1Linkencap:EthernetHWaddr00:0C:29:66:30:40 UPBROADCASTSLAVEMULTICASTMTU:1500Metric:1 RXpackets:188errors:0dropped:0overruns:0frame:0 TXpackets:193errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:17180(16.7KiB)TXbytes:18014(17.5KiB) loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:65536Metric:1 RXpackets:83errors:0dropped:0overruns:0frame:0 TXpackets:83errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:0 RXbytes:5646(5.5KiB)TXbytes:5646(5.5KiB)
Bonding Mode也变成了adaptive load balancing:
[root@test-01~]#cat/proc/net/bonding/bond0 EthernetChannelBondingDriver:v3.7.1(April27,2011) BondingMode:adaptiveloadbalancing PrimarySlave:None CurrentlyActiveSlave:eth0 MIIStatus:up MIIPollingInterval(ms):100 UpDelay(ms):0 DownDelay(ms):0 SlaveInterface:eth0 MIIStatus:up Speed:1000Mbps Duplex:full LinkFailureCount:0 PermanentHWaddr:00:0c:29:66:30:36 SlavequeueID:0 SlaveInterface:eth1 MIIStatus:down Speed:Unknown Duplex:Unknown LinkFailureCount:0 PermanentHWaddr:00:0c:29:66:30:40 SlavequeueID:0
mode=6的主备冗余功能和mode=1一样,就不重复验证了。
mode=6负载均衡的工作机制是先占满eth0网卡的网络,再使用eth1的网络。