linux 双网卡绑定(bonding)实现故障转移
=========================================================================================
原理:
Linux双网卡绑定实现就是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。其实这项技术在Sun和Cisco中早已存在,被称为Trunking和Etherchannel技术,在Linux的2.4.x的内核中也采用这这种技术,被称为bonding。bonding技术的最早应用是在集群——beowulf上,为了提高集群节点间的数据传输而设计的。bonding需要从网卡的混杂(promisc)模式说起。在正常情况下,网卡只接收目的硬件地址(MAC Address)是自身Mac的以太网帧,对于别的数据帧都滤掉,以减轻驱动程序的负担。但是网卡也支持另外一种被称为混杂promisc的模式,可以接收网络上所有的帧,比如说tcpdump,就是运行在这个模式下。bonding也运行在这个模式下,而且修改了驱动程序中的mac地址,将两块网卡的Mac地址改成相同,可以接收特定mac的数据帧。然后把相应的数据帧传送给bond驱动程序处理。直接给两块网卡设置同一IP地址是不可能的。Kernels 2.4.12及以后的版本均供bonding模块,以前的版本可以通过patch实现。
=========================================================================================
硬件环境:
CentOS release 5.6 (Final)虚拟机2台(一台做配置,一台测试)
需要配置的虚拟机拥有三块网卡:eth0、eth1、eth2(其中eth1的IP地址为10.18.5.85,eth0、eth2的IP地址为192.168.1.2)
测试机IP为:10.18.5.52
虚拟机中需要做的配置:85的eth2以及测试机的eth0接入方式均为桥接,eth0、eth2为host-only模式
=========================================================================================
1、编辑虚拟网络接口配置文件,指定网卡IP
假设eth1是对外服务的网卡,已经调试好网络;eth2是与eth0实现故障转移的网卡。
# cd /etc/sysconfig/network-scripts/
# vi ifcfg-bond0
bond0的信息如下
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=10.18.5.85
USERCTL=no
BONDING_OPTS="mode=1 primary=eth2 miimon=100"
#mode指定了bond0的工作模式,常用的是0和1,0表示负载均衡方式,1表示主从方式,可根据需要自行配置。常用的为0,1两种。mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份。bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用。miimon是用来进行链路监测的。比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路。
2、配置eth网卡
这里我偷个懒,把自己配置文件贴出来。
eth0:
[root@click365_test1 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=yes
eth2:
[root@click365_test1 network-scripts]# cat ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=yes
3、加载模块,让系统支持bonding
默认情况下,内核已支持bonding,只需要简单修改/etc/modprobe.conf 这个配置文档就可以了:添加两行
alias bond0 bonding
#options bond0 miimon=100 mode=1(由于我已经在bond0中定义了工作模式,所以直接注释掉)
4、在测试机上添加到bond0的路由
我直接写的是永久路由,当然也可以添加一条临时路由。
[root@click365-test2 ~]# cat /etc/rc.d/rc.local
route add 192.168.1.2 gw 10.18.5.85 dev eth0
5、重启
reboot或者service network restart 都可以。
=========================================================================================
测试:
测试主要依赖于ping命令的检查,以及/proc/net/bonding/bond0的内容。
1、85上bond0的状态
由于我在bond0中指定了处于active状态的是eth2,如下:
[root@click365_test1 network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.4.0-1 (October 7, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth2 (primary_reselect always)
Currently Active Slave: eth2
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:ac:8c
Slave Interface: eth2
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:ac:a0
2、由52上直接ping配置机的bond0
[root@click365-test2 ~]# ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.248 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.297 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.212 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.291 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.278 ms
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3996ms
rtt min/avg/max/mdev = 0.212/0.265/0.297/0.033 ms
3、down掉配置机上的eth2,看eth0是否接管过去,并且仍然可以ping通
配置机:
[root@click365_test1 network-scripts]# ifdown eth2
[root@click365_test1 network-scripts]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:0C:29:AB:AC:8C
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:20280 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1899237 (1.8 MiB) TX bytes:288 (288.0 b)
eth0 Link encap:Ethernet HWaddr 00:0C:29:AB:AC:8C
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:20280 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1899237 (1.8 MiB) TX bytes:288 (288.0 b)
Interrupt:193 Base address:0x2000
eth1 Link encap:Ethernet HWaddr 00:0C:29:AB:AC:96
inet addr:10.18.5.85 Bcast:10.18.5.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:53926 errors:0 dropped:0 overruns:0 frame:0
TX packets:6569 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6384535 (6.0 MiB) TX bytes:690927 (674.7 KiB)
Interrupt:193 Base address:0x2080
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:51 errors:0 dropped:0 overruns:0 frame:0
TX packets:51 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5060 (4.9 KiB) TX bytes:5060 (4.9 KiB)
[root@click365_test1 network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.4.0-1 (October 7, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:ab:ac:8c
此时可以很清楚的看到,eth2已经down掉,bond0仅有eth0工作。
测试机:
[root@click365-test2 ~]# ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=2.46 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.336 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.278 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.262 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.307 ms
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.262/0.730/2.468/0.869 ms
至此,测试OK,当然按照我的配置,启动eth2以后,处于active的仍然会是eth2。
原理那段是抄来的,见谅。
转载于:https://blog.51cto.com/hammerfall/949679