在久以前我就学习了bond技术。但是只有在最近才真正的了解了一些bond的实战技术。一个bond的确实简单,但是多个bond也不难。但是有时就是有问题。先给出我的方法:
Linux网口绑定
通过网口绑定(bond)技术,可以很容易实现网口冗余,负载均衡,从而达到高可用高可靠的目的。
环境:RHEL6.1x86 64
用服务器其中的4个物理网口分别是:eth0,eth1,eth4,eth5
绑定后的虚拟口是:bond0(公网ip),bond1(心跳ip)
主数据库服务器:
服务器公网IP是:178.58.88.191
服务器心跳线ip是: 10.0.0.1
备份数据库服务器:
服务器公网ip是: 178.58.88.192
服务器心跳线ip是:10.0.0.2
---------------------------------------------------------------------------------
第一步,配置设定文件:
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=178.58.88.191
NETMASK=255.255.255.0
NETWORK=178.58.88.1
#BROADCAST广播地址
USERCTL=no
PEERDNS=no
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=MACADDR(此处的MAC地址最好填上否则会引起网卡漂移的现象)
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
PEERDNS=no
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=MACADDR(此处的MAC地址最好填上否则会引起网卡漂移的现象)
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
PEERDNS=no
-----------------------------------------------------------------------------
名词注释:
DEVICE=物理设备名
IPADDR=IP地址
NETMASK=掩码值
NETWORK=网络地址
BROADCAST=广播地址
GATEWAY=网关地址
TYPE=Ethernet (网络类型)
ONBOOT=[yes|no](引导时是否激活设备)
USERCTL=[yes|no](非root用户是否可以控制该设备)
PEERDNS=[yes|no] (如果通过 DHCP 获取 IP ,是否将 DNS 信息写入 /etc/resolv.conf (覆盖))
BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
HWADDR = 你的MAC地址HWADDR(此处的MAC地址最好填上否则会引起网卡漂移的现象)
-----------------------------------------------------------------------
第二步,修改modprobe相关设定文件,并加载bonding模块:
1.在这里,我们直接创建一个加载bonding的专属设定文件/etc/modprobe.d/bonding.conf
[root@test ~]# vi /etc/modprobe.d/bonding.conf
#追加
alias bond0 bonding
options bonding mode=0 miimon=200
2.加载模块(重启系统后就不用手动再加载了)
[root@test ~]# modprobe bonding
3.确认模块是否加载成功:
[root@test ~]# lsmod | grep bonding
bonding 100065 0
--------------------------------------------------------------------
第三步,重启一下网络,然后确认一下状况:
[root@test ~]# /etc/init.d/network restart
[root@test ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 200
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:16:36:1b:bb:74
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:16:36:1b:bb:80
[root@test ~]# ifconfig | grep HWaddr
bond0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth1 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
从上面的确认信息中,我们可以看到3个重要信息:
1.现在的bonding模式是active-backup
2.现在Active状态的网口是eth0
3.bond0,eth1的物理地址和处于active状态下的eth0的物理地址相同,这样是为了避免上位交换机发生混乱。
任意拔掉一根网线,然后再访问你的服务器,看网络是否还是通的。
注意:在rhel6中如果重启网卡出现如下错误:
[root@localhost network-scripts]# /etc/init.d/network restart
Shutting down interface bond0: [ OK ]
Shutting down interface eth2: [ OK ]
Shutting down interface eth3: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface bond0: [ OK ]
Bringing up interface bond1: Error, some other host already uses address 192.168.1.100.
[FAILED]
解决的方法是:修改/etc/sysconfig/network-scripts/ifup-eth中将如下:
if ! arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${IPADDR} ; then
echo $”Error, some other host already uses address ${IPADDR}.”
exit 1
fi
用#注释掉,然后输入
#service network restart
重启网络服务,网卡加载成功
----------------------------------------------------------
第四步,系统启动自动绑定、增加默认网关:
[root@test ~]# vi /etc/rc.d/rc.local
#追加
ifenslave bond0 eth0 eth1
route add default gw 192.168.0.1
#如可上网就不用增加路由,0.1地址按环境修改.
============================================================================
留心:前面只是2个网口绑定成一个bond0的情况,如果我们要设置多个bond口,比如物理网口eth0和eth1组成bond0,eth2和eth3组成bond1,
那么网口设置文件的设置方法和上面第1步讲的方法相同,只是/etc/modprobe.d/bonding.conf的设定就不能像下面这样简单的叠加了:
alias bond0 bonding
options bonding mode=1 miimon=200
alias bond1 bonding
options bonding mode=1 miimon=200
正确的设置方法有2种:
第一种,你可以看到,这种方式的话,多个bond口的模式就只能设成相同的了:
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=1
第二种,这种方式,不同的bond口的mode可以设成不一样:
alias bond0 bonding
options bond0 miimon=100 mode=1
install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0
仔细看看上面这2种设置方法,现在如果是要设置3个,4个,甚至更多的bond口,你应该也会了吧!
后记:简单的介绍一下上面在加载bonding模块的时候,options里的一些参数的含义:
miimon 监视网络链接的频度,单位是毫秒,我们设置的是200毫秒。
max_bonds 配置的bond口个数
mode bond模式,主要有以下几种,在一般的实际应用中,0和1用的比较多,
如果你要深入了解这些模式各自的特点就需要靠读者你自己去查资料并做实践了。
0或balance-rr 轮转策略,提供负载均衡和耐故障功能,按顺序轮流把包发给包含在bond口内的网口。
1或active-backup 主备策略,提供高耐故障功能,逻辑简单,一个处于激活状态,一个失败,另外一个自动激活。
2或balance-xor XOR策略,提供负载均衡和耐故障功能。
3或broadcast 广播策略,耐故障功能。把数据以广播的方式,发给包含在该bond口内的所有网口。
4或802.3ad IEEE 802.3ad动态链接集合。
5或balance-tlb 自动适应传输负载均衡策略。
6或balance-alb 自动适应负载均衡策略。