Linux下双网卡绑定技术实现负载均衡和失效保护

系统 1902 0

     保持服务器的高可用性是企业级 IT 环境的重要因素。其中最重要的一点是服务器网络连接的高可用性。网卡(NIC)绑定技术有助于保证高可用性特性并提供其它优势以提高网络性能。
      我们在这介绍的Linux双网卡绑定实现就是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备, 通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。其实这项技术在Sun和Cisco中早已存在,被称为Trunking和 Etherchannel技术,在Linux的2.4.x的内核中也采用这这种技术,被称为bonding。bonding技术的最早应用是在集群—— beowulf上,为了提高集群节点间的数据传输而设计的。下面我们讨论一下bonding 的原理,什么是bonding需要从网卡的混杂 (promisc)模式说起。我们知道,在正常情况下,网卡只接收目的硬件地址(MAC Address)是自身Mac的以太网帧,对于别的数据帧都滤 掉,以减轻驱动程序的负担。但是网卡也支持另外一种被称为混杂promisc的模式,可以接收网络上所有的帧,比如说tcpdump,就是运行在这个模式 下。bonding也运行在这个模式下,而且修改了驱动程序中的mac地址,将两块网卡的Mac地址改成相同,可以接收特定mac的数据帧。然后把相应的 数据帧传送给bond驱动程序处理。 
    说了半天理论,其实配置很简单,一共四个步骤:
实验的操作系统是Redhat Linux Enterprise 3.0
绑定的前提条件:芯片组型号相同,而且网卡应该具备自己独立的BIOS芯片

双网卡邦定的拓朴图(见下图)



1.编辑虚拟网络接口配置文件,指定网卡IP 
vi /etc/sysconfig/ network-scripts/ ifcfg-bond0 
[root@rhas-13 root]# cp  /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-bond0
2 #vi ifcfg-bond0 
将第一行改成 DEVICE=bond0 
# cat ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=172.31.0.13
NETMASK=255.255.252.0
BROADCAST=172.31.3.254
ONBOOT=yes
TYPE=Ethernet
这里要主意,不要指定单个网卡的IP 地址、子网掩码或网卡 ID。将上述信息指定到虚拟适配器(bonding)中即可。
[root@rhas-13 network-scripts]# cat ifcfg-eth0 
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
[root@rhas-13 network-scripts]# cat ifcfg-eth1 
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp

3 # vi /etc/modules.conf 
编辑 /etc/modules.conf 文件,加入如下一行内容,以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0 

加入下列两行 
alias bond0 bonding 
options bond0 miimon=100 mode=1 
说明:miimon是用来进行链路监测的。 比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。
   mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。
   mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份.  
bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用
4 # vi /etc/rc.d/rc.local 
加入两行 
ifenslave bond0 eth0 eth1 
route add -net 172.31.3.254 netmask 255.255.255.0 bond0 

到这时已经配置完毕重新启动机器.
重启会看见以下信息就表示配置成功了
................ 
Bringing up interface bond0 OK 
Bringing up interface eth0 OK 
Bringing up interface eth1 OK 
................

下面我们讨论以下mode分别为0,1时的情况

mode=1工作在主备模式下,这时eth1作为备份网卡是no arp的
[root@rhas-13 network-scripts]# ifconfig  验证网卡的配置信息
bond0     Link encap:Ethernet  HWaddr 00:0E:7F:25:D9:8B
          inet addr:172.31.0.13  Bcast:172.31.3.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:18495 errors:0 dropped:0 overruns:0 frame:0
          TX packets:480 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1587253 (1.5 Mb)  TX bytes:89642 (87.5 Kb)
 
eth0      Link encap:Ethernet  HWaddr 00:0E:7F:25:D9:8B
          inet addr:172.31.0.13  Bcast:172.31.3.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:9572 errors:0 dropped:0 overruns:0 frame:0
          TX packets:480 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:833514 (813.9 Kb)  TX bytes:89642 (87.5 Kb)
          Interrupt:11
 
eth1      Link encap:Ethernet  HWaddr 00:0E:7F:25:D9:8B
          inet addr:172.31.0.13  Bcast:172.31.3.255  Mask:255.255.252.0
          UP BROADCAST RUNNING NOARP SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:8923 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:753739 (736.0 Kb)  TX bytes:0 (0.0 b)
          Interrupt:15
    那也就是说在主备模式下,当一个网络接口失效时(例如主交换机掉电等),不回出现网络中断,系统会按照cat /etc/rc.d/rc.local里指定网卡的顺序工作,机器仍能对外服务,起到了失效保护的功能.

在mode=0    负载均衡工作模式,他能提供两倍的带宽,下我们来看一下网卡的配置信息
[root@rhas-13 root]# ifconfig
bond0     Link encap:Ethernet  HWaddr 00:0E:7F:25:D9:8B
          inet addr:172.31.0.13  Bcast:172.31.3.255  Mask:255.255.252.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:2817 errors:0 dropped:0 overruns:0 frame:0
          TX packets:95 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:226957 (221.6 Kb)  TX bytes:15266 (14.9 Kb)
 
eth0      Link encap:Ethernet  HWaddr 00:0E:7F:25:D9:8B
          inet addr:172.31.0.13  Bcast:172.31.3.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1406 errors:0 dropped:0 overruns:0 frame:0
          TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:113967 (111.2 Kb)  TX bytes:7268 (7.0 Kb)
          Interrupt:11
 
eth1      Link encap:Ethernet  HWaddr 00:0E:7F:25:D9:8B
          inet addr:172.31.0.13  Bcast:172.31.3.255  Mask:255.255.252.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1411 errors:0 dropped:0 overruns:0 frame:0
          TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:112990 (110.3 Kb)  TX bytes:7998 (7.8 Kb)
          Interrupt:15

      在这种情况下出现一块网卡失效,仅仅会是服务器出口带宽下降,也不会影响网络使用.




      通过查看bond0的工作状态查询能详细的掌握bonding的工作状态
[root@rhas-13 bonding]# cat /proc/net/bonding/bond0
bonding.c:v2.4.1 (September 15, 2003)
 
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
Multicast Mode: all slaves
 
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8a
 
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8b

     Linux下通过网卡邦定技术既增加了服务器的可靠性,又增加了可用网络带宽,为用户提供不间断的关键服务。用以上方法均在redhat的多个版本测试成功,而且效果良好.心动不如行动,赶快一试吧! 
参考文档:
/usr/share/doc/kernel-doc-2.4.21/networking/bonding.txt

 

[求助]请教双网卡问题!!!

作者:段誉     发表时间:2003/01/11 08:14pm

如何在一台装有Linux的机器下做双网卡绑定一个IP地址??
请大家指教,多谢!!! :em14:  :em14:  :em14:
此文章相关评论:
该文章有26个相关评论如下:(点这儿可以发表评论)
无双  发表于: 2003/01/11 08:16pm
不可能
 
无双  发表于: 2003/01/11 08:17pm
可以一个网卡绑定多个地址
但不可以多网卡绑定一个地址
 
段誉  发表于: 2003/01/11 09:14pm
一个网卡绑定多个IP我知道,我现在就想问问,为什么不能两个网卡绑定一个?有明确的说明吗?
为什么SUN/IBM的机器就可以在增加软件的情况下,双网卡绑定一个IP?我想,Linux应该也可以做到的吧,只不过我不知道而已,:(。
 
无双  发表于: 2003/01/11 09:18pm
因为arp协议原因

 
段誉  发表于: 2003/01/11 09:19pm
[这个贴子最后由段誉在 2003/01/11 09:20pm 编辑]

说说为什么,可以吗?多谢!
 
无双  发表于: 2003/01/11 09:23pm
看一看ARP协议
TCP/IP在低层要把IP转换成硬件地址
然后才可以在网络上传输

如果一个IP对应多个硬件地址
那么没有办法转换

SUN的话是用改配置文件的方法实现的
 
diag  发表于: 2003/01/11 10:59pm
BSD 可以。。。TRUK 。。
 
无双  发表于: 2003/01/11 11:06pm
可以吗
但是双网卡同IP的话两个网卡不可能同时使用
 
diag  发表于: 2003/01/11 11:36pm
应该可以。。我帮看看。。我们的那个NAS 。。就是用FREEBSD 做的。。

两个网卡做的/
 
无双  发表于: 2003/01/11 11:39pm
那把做的方法写一下吧
大家学学
 
段誉  发表于: 2003/01/12 00:57am
好啊,多谢diag,把这个写写,:)
 
xunle回来啦  发表于: 2003/01/12 01:00am
可以的,我看过相关文章,不过因为没用到,所以没在意,我也找不到那文章了
 
okaxikiss  发表于: 2003/01/12 07:50am
引用: 下面引用由[u]diag[/u]在  2003/01/11 11:36pm  发表的内容:
应该可以。。我帮看看。。我们的那个NAS 。。就是用FREEBSD 做的。。
两个网卡做的/


写出来大家学习学习嘛
 
ttyp0  发表于: 2003/01/12 10:09am
听说Intel服务器网卡两个口同一个ip连到Cisco35XX交换机全双工可以达到400M
 
depike  发表于: 2003/01/12 03:43pm
没错,intel的网卡可以实现双网卡绑定一个IP地址,但也是有要求的,具体的在Intel的站点上应该有,但我今天没找到
http://www.gx-wp.com/ycwz/internetadapter.htm
 
clic  发表于: 2003/01/12 04:06pm
bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的Bonding driver support选中就可以了。
  然后,重新编译核心,重新起动计算机,执行如下命令:
  ismod bonding
  ifconfig eth0 down
  ifconfig eth1 down
  ifconfig bond0 ipaddress
  ifenslave bond0 eth0
  ifenslave bond0 eth1
  现在两块网卡已经象一块一样工作了.这样可以提高集群节点间的数据传输.
  你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local调用,以便一开机就生效.
  bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作bonding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个口子映射为同一个虚拟接口。
 
depike  发表于: 2003/01/12 04:15pm
多谢clic,有机会一定一试
 
无双  发表于: 2003/01/12 05:05pm
不错建议精华
而写到一句话中
 
race  发表于: 2003/01/12 07:26pm
我以前关心过这个事情,当时因为LINUX网关流量不大,没实际做捆绑,还有就是不知道对交换机设置有没有要求。

将多块网卡虚拟成为一块网卡,使其具有相同的IP地址,来实现提升主机的网络吞吐量或者是提高可用性,这种技术被称作bonding。这项技术其 实在sun 和cisco中已经存在,分别称为Trunking和etherchannel技术,在Linux中,这种技术称为bonding。
bonding驱动最早来自于Donald Becker的beowulf对kernel2.0的补丁。但是已经有了很大的改进和变化,最早来自于extreme-linux和beowulf的工具已经不适用于现在版本的驱动了。
对于新版本的驱动,请参考本文最后的链结地址。
1、安装
1) 编译带有bonding driver的内核
对于最新版本的bonding驱动,使用内核2.2.18或以上版本(否则需要对内核打补丁)。
使用make menuconfig/xconfig/config来编译内核,并在"Network device support"部分选 择"Bonding driver support",这里推荐配置该驱动为模块方式,因为目前这是传递给参数给驱动并配置多个bonding设备的唯一 方法。
编译和安装新的内核和模块:
make dep;make clean;make bzImage;make modules;make modules_install;
2) 获取并安装用户管理工具
这个版本的bonding驱动需要新的ifenslave程序。来自extreme-linux和beowulf的原始工具程序不能在这里使用。 内核 2.2.18及其以上版本在Documentation/network中包含文件ifenslave.c。对于更老的内核,请参考文章最后的资源 链结部分的内容。
安装ifenslave.c:
# gcc -O2 -s -o ifenslave ifenslave.c# cp ifenslave /sbin/ifenslave
3) 配置系统
参考下一部分关于模块参数的内容。首先需要在/etc/conf.modules中添加如下内容:
alias bond0 bonding
使用标准的发布技术来定义bond0这个网络接口,例如在redhat发布中,在/etc/sysconfig/network-scripts目录中添加ifcfg-bond0文件:
DEVICE=bond0IPADDR=192.168.1.1NETMASK=255.255.255.0NETWORK=192.168.1.0BROADCAST=192.168.1.255ONBOOT=yesBOOTPROTO=noneUSERCTL=no
所有属于bond的接口动必须被定义为SLAVE或MASTER。例如,在Redhat中,如果希望定义eth0和eth1定义为属于接口bond0的一部分,那么它们的配置文件(ifcfg-eth0, ifcfg-eth1,等)间如下所示:
DEVICE=eth0USERCTL=noONBOOT=yesMASTER=bond0SLAVE=yesBOOTPROTO=none

如果管理工具支持可以重新启动网络子系统或者仅仅启动bonding设备,否则重新启动机器。(对于redhat发布,使用`ifup bond0'或`/etc/rc.d/init.d/network restart')
如果你的发布提供的管理工具不支持在网络接口配置中定义master/slave,则需要使用下面的命令手工配置bonding设备:
# /sbin/ifconfig bond0 192.168.1.1 up# /sbin/ifenslave bond0 eth0# /sbin/ifenslave bond0 eth1
当然也可以将这些命令定义为一个脚本,以方便执行。
4) 模块参数
下面的模块参数可能被传递:
mode=
可能的值为0(默认的轮转模式round robin policy),或者1(热备份模式),参考下面的HA部分来得到更多的相关信息。
miimon=
整数值,定义MII链路监测频率(单位为频率)。默认值为0,表示关闭链路监测。如果希望使用链路监测,一个合适的值为100。参考HA部分得到更多信息。
downdelay=
在发现链路故障时,这里规定的整数值定义disable一个链路的延迟(单位为毫秒)。必须是miimon的整数倍。默认值为0。参考HA部分得到更多信息。
updelay=
侦测到"link up"状态时,这里规定的整数值定义了enable一个链路的延迟。必须是miimon的整数倍。默认值为0。参考HA部分得到更多信息。
如果需要定义多个bonding设备,驱动必须被多次加载。例如,对于有两个bonding设备的情况,/etc/conf.modlues必须包含如下内容:
alias bond0 bondingalias bond1 bonding
options bond0 miimon=100options bond1 -o bonding1 miimon=100
5) 测试配置
可以通过ifconfig命令来监测配置和传输策略,例如对于轮转策略,你应该得到如下信息:
[root]# /sbin/ifconfigbond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0collisions:0 txqueuelen:0
eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0collisions:0 txqueuelen:100 Interrupt:10 Base address:0x1080
eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:100 Interrupt:9 Base address:0x1400
问题:
1. bonding会不会和SMP冲突?
不会,老的2.0.xx版本配合SMP使用会发生冲突,而新的内核不会发生问题。
2. 哪种类型的网卡可以用作bonding?
任何类型的网卡(甚至可以使用混合类型的网卡-一个Intel的therExpress PRO/100和a 3com 3c905b),甚至可以将两个Gigabit以太网卡bond在一起使用。
3. 我可以拥有多少个bonding设备?
对应于加载的一个模块,就可以拥有一个bonding设备,参考模块参数部分来了解如何实现。
4. 一个bonding设备可以有多少个salve网卡?
受限于linux可以支持的网卡数量和系统可以插接的网卡数量。
5. 当一个slave链路出现故障,会发生什么问题?
如果你的以太网卡支持MII状态监控,并且MII监测已经在驱动中被使用(参考模块参数部分内容),那么就不会出现什么不幸的结果。这个版本 的 bonding驱动能得到MII信息并且根据链路状态来enable或者disable某个slave网卡。参考HA部分得到更多信息。
所有不能报告自己的链路状态的以太驱动不能很好地处理这种情况。bonding驱动不能连续发送数据报,而导致某些数据报丢失。而重传可能会引起严重的性能问题(如果一块网卡丢失,那么可能会对TCP或UDP带来严重的性能影响)。
6. bonding能被用作高可用性项目么?
当然可以,如果使用了MII监测,并且你所有的网卡驱动都支持MII链路状态汇报。参考HA部分内容。
7. bonding能适用于哪种类型的switches/systems?
在轮转模式,它和下面支持trunking的系统能一起工作:
* Cisco 5500 series (参考EtherChannel支持相关内 容)。* SunTrunking software.* Alteon AceDirector switches / WebOS (使用 Trunks).* BayStack Switches (trunks必须被配置). 可堆叠的模块(450)能在不同的物理单元的端口中定 义* Linux bonding.
对于热备份模式下,它能和一切二层交换机工作。
8. 一个bonding设备的MAC来自于哪个网卡?
如果没有明显使用ifconfig来配置指定,bonding设备的MAC地址从它的第一个slave中得到。这个MAC地址随即被传递个所有其 他的 slave设备,这些其他的slave设备将具有这个MAC,即使第一个Slave设备被去除。只有bonding设备重起或者down了,MAC 地址才会改变。
如果希望修改MAC地址,可以使用ifconfig来设置:
# ifconfig bond0 ha ether 00:11:22:33:44:55
可以通过up/down设备,然后修改其slave的顺序来改变bonding设备的MAC地址:
# ifconfig bond0 down ; modprobe -r bonding# ifconfig bond0 .... up# ifenslave bond0 eth...
这个方法将自动从下一个将被添加的slave中得到地址。
为了恢复slave的MAC地址,需要将其从bonding设备中分离出来(`ifenslave -d bond0 eth0'),down掉 该设备(`ifconfig eth0 down'),去除模块(`rmmod 3c59x'),然后重载其以使其从其eeproms中得到其MAC地 址。若一个驱动被多个设备所拥有,那么需要将其全部down掉。另外一种方法是察看启动时该卡的MAC地址(dmesg或 tail /var/log /messages),并使用ifconfig来reset它:
# ifconfig eth0 down# ifconfig eth0 hw ether 00:20:40:60:80:A0
9. 哪些使用哪些传输模式?
轮转模式:基于slave的顺序,依次轮转通过不同网卡发送数据;
热备份模式:确保在同一时刻仅仅通过一个网卡发送数据,另外一个作为该激活卡的热备份,在激活卡出现故障时数据流马上切换到热备份卡,这种模式常常用于使用交换机的高可用性中(high availability solutions )
高可用性
为了使用bonding驱动实现高可用性,需要将该驱动编译为模块,因为目前这时传递参数给驱动的唯一方式。以后这种情况可能会改变。首先需要确 保所有的网卡支持MII链路状态报告。在Linux2.2.17及以上版本中,所有的百兆以太网和yellowfin千兆以太网都支持MII链路状态报 告。如果你的网卡驱动不支持这种技术,那么会将链路状态监测为有故障。
bonding驱动目前通过监测MII状态注册器来侦测其所有的slave链路。侦测间隔有模块参数"miimon"来定义。该值为整数值,单 位为milliseconds。100ms是一个合适的值,因为太小的值可能影响系统性能。也就是说链路发生故障以后在100ms秒以内将会被发现。
例如:
# modprobe bonding miimon=100
或在/etc/modules.conf定义如下内容:
alias bond0 bondingoptions bond0 miimon=100
目前对高可用性有两个策略,依赖于主机是否
a) 主机连接到单台主机或支持trunking的交换机b) 主机连接到多个不同的交换机上,或单个不支持trunking的交换机
1) 在单交换机或主机上的HA-负载均衡
这种模式易于配置和理解,只需要简单的配置远程设备(主机或交换机)来将数据流量分散在多个端口(trunk, etherchannel等), 并配置bonding接口。如果模块加载时指定了MII参数,MII将自动工作。可以通过去除或恢复不同的链路,然后再 log文件中察看驱动设备监测到 了哪些信息。在监测时,你也许会遇到这样的问题:如果trunk连接的所有接口都down掉以后,有些具有bug的交换机会长时间地 diable trunk。可以通过重新启动交换机来修正这些问题。
例1:主机和主机间实现倍速:
在每个主机中,运行:
# modprobe bonding miimon=100# ifconfig bond0 addr# ifenslave bond0 eth0 eth1
例 2:主机连接交换机以实现倍速:
在主机A中运行:
# modprobe bonding miimon=100# ifconfig bond0 addr # ifenslave bond0 eth0 eth1
在交换机中:
#对port1和port2设置trunking。
2) 在多个交换机或主机上的HA-负载均衡(或不支持trunking技术的单交换机情况)
这种模式更可能会出现问题,因为它依赖于这样的事实:虽然有多个端口,但是主机MAC地址只能被一个端口可见以避免混淆交换机。
如果需要知道哪个哪个端口是活动的,哪个是备份的,那就使用ifconfig。所有的备份接口设置有NOAEP标志。为了使用该模式,在加载时传递"mode=1"给模块:
# modprobe bonding miimon=100 mode=1
或者在/etc/modules.conf中添加如下内容:
alias bond0 bondingoptions bond0 miimon=100 mode=1
例1:使用多个主机和多个交换机来创建"无单故障点瓶颈"解决方案:
在这种配置下,这里有一个ISL- 交换机间连接(Inter Switch Link,可能是一个trunk),多个主机 (host1, host2 ...)都同时连接到交换机,并且多个端口连接到外部网络(port3...),每个主机中同时只有一个slave是激活 的,但是所有的链路仍然被监测 (系统能监测到活动链路的故障并启动备份链路)。
如果host1和host2具有同样的功能,并且被用在负载均衡中,那么将host1的活动接口连接到其中一个交换机而host2连接到另外一 个交换机上是一个非常不错的选择。这种系统在单个主机、交换机或者线路出问题时仍能保证工作。最糟糕可能情况是,单个交换机出现故障,其中一台主机将不可 访问,直到另外一个交换机维护的转发表过期,另外一个主机才会转换激活接口到正常的交换机上。
例 2:使用多个以太网卡连接到一个交换机,以应付NIC故障的情况,以提高可用性:
在主机A中:
# modprobe bonding miimon=100 mode=1 # ifconfig bond0 addr# ifenslave bond0 eth0 eth1
在交换机中:
# (可选地)最小化转发表过期时间
每次主机切换其活动接口,它将使用新的接口直到该接口出现故障。在这个例子中,主机受交换机转发表的过期时间影响很大。
3) 调整交换机的频率
如果交换机转换到备份接口需要花费太长的时间,一般来说都希望在当前接口发生故障的情况下立即启用备用接口。可以通过传递模块参数"downdelay"来实现减少完全disable一个接口的延迟。
当一个交换机重启以后,可能出现其端口在端口可用以前报告"link up"状态。这可能使得bonding设备使用还不可用的端口这可能通过传递模块参数"updelay"来延迟活动端口被重新可用的时间。
当一个主机和交换机重新交互以确定一个丢失的链路也会出现同样的问题。
在bonding接口丢失了其所有的slave链路的情情况下,则驱动将马上使用第一个up的接口,而不受updelay参数的限制。这样可以减少系统down的时间。
例如:
# modprobe bonding miimon=100 mode=1 downdelay=2000 updelay=5000# modprobe bonding miimon=100 mode=0 downdelay=0 updelay=5000
4) 限制
主要限制是:
只有链路状态被监控,如果交换机本身down掉了,例如不再转发数据但是链路仍然完好。则链路不会被diable。另外一个监测故障链路的方式统计一个沉重负载主机的接入数据帧数量。但是对于哪些负载较小的服务器则不大适用。
资源链结
Donald Becker的以太驱动和diag程序可以在下面的到:
- http://www.scyld.com/network/- http://cesdis.gsfc.nasa.gov/linux/drivers/ (seems to be dead now)- ftp://cesdis.gsfc.nasa.goc/pub/linux/drivers/ (seems to be dead now)
还可以在www.scyld.com得到很多关于ethernet、NWay和MII等信息。Y
对于新版本的驱动,牢的内核补丁和更新的用户空间工具可以在Willy Tarreau的网站中得到:
- http://wtarreau.free.fr/pub/bonding/- http://www-miaif.lip6.fr/willy/pub/bonding/
为了得到最新的关于Linux Kernel开发信息,请关注:
http://boudicca.tux.org/hypermail/linux-kernel/latest/
Linux2.4.x内核bonding的实现
因为bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的Bonding driver support选中就可以了。然后,重新编译核心,重新起动计算机,执行如下命令:
insmod bondingifconfig eth0 downifconfig eth1 downifconfig bond0 ipaddressifenslave bond0 eth0ifenslave bond0 eth1
现在两块网卡已经象一块一样工作了.这样可以提高集群节点间的数据传输。你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local调用,以便一开机就生效。
bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作bonding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个口子映射为同一个虚拟接口(trunking技术)。
下面是引自邮件列表的一个信,希望能对出现问题时有所帮助:
I have found a solution to another problem with the bonding driver. If you ifconfig down an enslaved eth device, the bonding driver is not notified and if there is an attempt to use the device then a crash results. I have added a one line fix to dev_close in net/core/dev.c /* if the device is a slave we should not touch it*/ if(dev-flags&IFF_SLAVE) return -EBUSY; I put it after the check to see if the interface is up. This may not be the best solution but it prevents the kernel crashes and as bond_release is not implemented there is not much point making the device release it`s self. Since I made this change and the one in my last message I have not been able to produce a crash. (here is a script which will cause the crash on 2.2.16) #!/bin/bash insmod eepro100 insmod bonding ifconfig bond0 192.168.1.2 up ifenslave bond0 eth0 ifconfig eth0 down ifconfig bond0 down ifconfig bond0 192.168.1.2 up ifconfig bond0 down Again, if someone could confirm this fix it would be good. '
文章来源:LinuxAid

 

补充楼主的原创:
    补充理由:我在按照楼主配置方法,实现了mode=1在一个交换机上的实现,但是无法实现在VLAN模式下BOND的工作。后通过交流,最后这个方法能实现创建多个bond的虚设备并来满足不同VLAN的设置。
    由于保证网络架构的灵活性的要求,每个机器都支持VLAN的802。1Q协议,通过简单配置就可以跨VLAN通信。由于VLAN的配置在 服务器中通过虚设备实现,所以在rc.local中通过ifenslave bond0 eth0 eth1 激活的方式不可行。
    具体配置:

1.编辑虚拟网络接口配置文件,指定网卡IP 
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-bond0.2(VLAN2)

修改ifcfg-eth0为
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
eth1同上述配置,只需要修改DEVICE=eth0为DEVICE=eth1

ifcfg-bond0的配置
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

修改ifcfg-bond0.2
也只需要修改DEVICE=eth0为DEVICE=bond0.2,其他配置采用本来的eth0的配置就可以。

如果有其他VLAN,可以再加。

2、 # vi /etc/modules.conf 
编辑 /etc/modules.conf 文件,加入如下一行内容,以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0 
  
加入下列两行 
alias bond0 bonding 
options bond0 miimon=100 mode=1 
说明见楼主的说明

3、添加VLAN=yes到/etc/sysconfig/network中

4、最关键一步,修改/sbin/ifup
找到# Ethernet 802.1Q VLAN support这一行
修改下面的几行:
if echo ${DEVICE} | LANG=C egrep -v '(:)' | LANG=C egrep -q 'eth[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?' ; then
修改为
if echo ${DEVICE} | LANG=C egrep -v '(:)' | LANG=C egrep -q '(eth|bond)[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?' ; then

VID="`echo ${DEVICE} | \
            LANG=C egrep 'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
            修改为
VID="`echo ${DEVICE} | \
            LANG=C egrep '(eth|bond)[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
            
        PHYSDEV="`echo ${DEVICE} | \
            LANG=C egrep 'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
修改为
        PHYSDEV="`echo ${DEVICE} | \
            LANG=C egrep '(eth|bond)[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$' | \
            
这样就大功告成了,重新启动或者services network restart以后,注意看messages是否成功,或者看ifconfig -a

 

 

Linux下双网卡绑定技术实现负载均衡和失效保护


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论