查看: 439|回复: 2

Linux下双网卡绑定技术实现负载均衡

 关闭 [复制链接]

签到天数: 2089 天

连续签到: 1 天

[LV.Master]伴坛终老IIII

发表于 2009-2-23 10:24 | 显示全部楼层 |阅读模式
Linux下双网卡绑定技术实现负载均衡.txt

保持服务器的高可用性是企业级 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作为备份网卡是noarp的

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 M etric: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
Interrupt:15

那也就是说在主备模式下,当一个网络接口失效时(例如主交换机掉电等),不回出现网络中断,系统会按照cat /etc/rcd/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
问题:
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技术)。
PCOS系统下载站:http://zhuangji.wang

签到天数: 2089 天

连续签到: 1 天

[LV.Master]伴坛终老IIII

 楼主| 发表于 2009-2-23 10:24 | 显示全部楼层

Linux下双网卡绑定技术实现负载均衡

Linux下双网卡绑定技术实现负载均衡.txt

保持服务器的高可用性是企业级 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作为备份网卡是noarp的

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 M etric: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
Interrupt:15

那也就是说在主备模式下,当一个网络接口失效时(例如主交换机掉电等),不回出现网络中断,系统会按照cat /etc/rcd/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
问题:
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技术)。
PCOS系统下载站:http://zhuangji.wang

签到天数: 2089 天

连续签到: 1 天

[LV.Master]伴坛终老IIII

 楼主| 发表于 2009-2-23 10:24 | 显示全部楼层

Linux下双网卡绑定技术实现负载均衡

Linux下双网卡绑定技术实现负载均衡.txt

保持服务器的高可用性是企业级 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作为备份网卡是noarp的

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 M etric: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
Interrupt:15

那也就是说在主备模式下,当一个网络接口失效时(例如主交换机掉电等),不回出现网络中断,系统会按照cat /etc/rcd/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
问题:
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技术)。
PCOS系统下载站:http://zhuangji.wang

本版积分规则