1.前言 双网卡负载均衡其实很早就在linux内核里面实现了,我见到的最早的版本是2.2.10的内核。不过那个时候还没要作为缺省功能编译到内核里面去,如果你需要这个功能你需要编译内核,然后选中bonding相关选项。我最早使用了bonding是在我最毕业设计时,在iSCSI技术里面加入了bonding技术。
通过测试发现对于小数据包的传送,单网卡比双网卡要快,这当然也是正常的,只有在大数据传送的情况下,它才能显示优势,比如流媒体文件的传输。2.4.x以后的内核就把bonding技术作为缺省功能编译进去了,而且还加入了路径切换的功能,那就更加完美了。
2.测试环境
硬件:CPU Celeron 766MHz MEM 92M (100MHz)
网卡:D-LINK,Realtalk
软件:OS Fedora Core 2 (2.6.5-1.358)
3.配置过程
其实在linux里面配置双网卡负载均衡和路径切换很简单,只需要修改或增加一些配置文件就可以了。
a)首先配置/etc/modules.conf文件,添加下面的信息
alias bond0 bonding
options bond0 miimon=100 mode=1
第一行的意思我想大家都很明白,就是增加一个设备驱动的别名,真正的驱动名字是bonding.ko
第二上是驱动加载时的参数,这里解释一下
“miimon=100”,表示链路检测的时间间隔,单位是毫秒。
“mode=1”,这里表示双网卡bond的模式,目前官方发布的模式有0,1,2,3,4,5,6共7种,我们一般常用的是0,1两种。
这里分别介绍
0表示round-robin模式,它从第一块有效的网卡传输资料,知道最后一块。它提供了负载均衡和容灾的功能
1表示active-backup模式,表示每次只有一个网卡是激活和有数据传输的,其它网卡处于backup状态,一旦激活的网卡链路出现问题,backup状态的网卡就会激活成为active状态这种模式提供了容灾的功能,但是没有负载均衡的功能。
b)配置bond0的配置文件
#cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.10.254
NETMASK=255.255.255.0
NETWORK=192.168.10.0
BROADCAST=192.168.10.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
BOOTPROTO=none
#cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
BOOTPROTO=none
c)起动并测试 ok,你现在可以起动你的配置文件了,不过在起动之前,先看看有没有加载bonding内核模块(使用lsmod命令),如果没有,那就加载它,使用下面的命令
modprobe bonding
然后使用下面的命令重新起动网络
/etc/init.d/networkd restart
在使用ifconfig命令看看结果,如果你能看到下面类似的输出,那就配置没有问题了
#ifconfig
bond0 Link encap:Ethernet HWaddr 00:1A:34:56:91:BE
inet addr:192.168.10.254 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:2620 errors:0 dropped:0 overruns:0 frame:0
TX packets:1352 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:259480 (253.3 Kb) TX bytes:292208 (285.3 Kb)
eth0 Link encap:Ethernet HWaddr 00:1A:34:56:91:BE
inet6 addr: fe80::21a:34ff:fe56:91be/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:1218 errors:0 dropped:0 overruns:0 frame:0
TX packets:613 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:118905 (116.1 Kb) TX bytes:132632 (129.5 Kb)
Interrupt:11 Base address:0x9000
eth1 Link encap:Ethernet HWaddr 00:1A:34:56:91:BE
inet6 addr: fe80::21a:34ff:fe56:91be/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:1402 errors:0 dropped:0 overruns:0 frame:0
TX packets:741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:140575 (137.2 Kb) TX bytes:161196 (157.4 Kb)
Interrupt:12 Base address:0xd000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:82 errors:0 dropped:0 overruns:0 frame:0
TX packets:82 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5700 (5.5 Kb) TX bytes:5700 (5.5 Kb)
你还可以通过下面的命令来查看bond0的基本信息
#more /proc/net/bonding/bond0
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:1a:34:56:91:be
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0a:eb:82:da:ab
下面我们测试一下路径切换,准备一台机器,采用ping的方式看链路情况。 然后在测试的机器上随便拔掉一根网线,看看情况,我的机器的情况是大约8秒的样子链路切换了,如果全部拔掉,然后随便插入一根网线,大约需要10秒的时间恢复链路。
4.后记 这个测试我在04年的12月份做过测试,不过是在我的笔记本上测试的,一块网卡是8139的,另外一块是讯驰的无线网卡,记过发现起动bond0时会死机。我不知道是不是无线网卡和有线网卡不能做这样的操作,不过我可以肯定的是如果即使这样bond0能起来,把链路切换到无线网卡上时,肯定会失败,因为无线网卡加入时需要验证。不过我想做这些配置应该是在服务器上,还没有谁在服务器上配置两个无线网卡吧!