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。

原理那段是抄来的,见谅。