Linux网络管理之多网卡绑定
一、bonding介绍
在企业Linux服务器管理里中,服务器的可靠性、可用性以及I/O速度都非常重要,保持服务器的高可用和安全性是生产环境的重要指标,其中最重要的一点是服务器网络连接的高可用性。通常我们会把重要的服务器做主备,其目的在于当主服务器宕机,备份服务器马上接管其主服务器的工作,从而实现服务的连续,不至于服务的停用。还有一种情况,我们会给服务器做负载均衡,当一个服务器对外提供服务,接收到用户请求太多,会导致服务器宕机,这个时候我们用主备显得力不从心,怎么办呢,这个时候我们就需要考虑把原来访问一台服务器的流量,分别用很多台服务器来分担,这样一来把原来一台服务器承受的压力分别用很多台服务器来承担。我们知道一张物理网卡的网络吞吐量是有限的,当服务器上的网卡吞吐量达到上限,这个时候就算性能再好的服务器我们访问它都会感觉慢,这时我们就需要考虑增大网卡的网络吞吐量。一张网卡不够用,我们用两张,三张,很多张。虽然很多张网卡同时对外提供服务是可以解决吞吐量的问题,但是新的问题又产生了,用户怎么知道我们其他网卡上的ip呢?通常情况我们的都是以一个ip对外服务,(当然也有多个ip对外服务,一个域名对外服务,后台可能是多个IP),用户只知道一个ip或者域名,那我们虽然装了很多张网卡,但直接使用好像是达不到我们理想的效果。有没有一种技术将很多张网卡虚拟成一个大的网卡,就有点类似于LVM磁盘管理一样,可以把很多张网卡整合成一张,然后来提高网卡的性能呢?诶,有的,bonding就有这样的功能。它可以将多张网卡绑定同一IP地址对外提供服务,可实现高可用或负载均衡。我们都知道两张网卡或多张网卡设置同一IP地址是不可以的,但bonding可以,它的底层工作原理就是通过虚拟一块网卡对外提供连接,物理网卡的MAC地址都会被修改成相同的MAC地址。这样一来就实现了提高网卡的性能的同时也有冗余的网卡。
二、bonding工作模式
bonding的工作模式有七种,其中有三种是最为常用
Mode 0 (balance-rr)轮转策略:这种模式就是从头到尾顺序的在每一个slave接口上发送数据包,它提供了网卡的负载均衡和容错的能力
mode 1 (active-backup) 活动-备份策略:这种模式只有一个slave被激活,当且仅当活动的slave接口失败时才会激活其他slave,为了避免交换机发生混乱,此时绑定的MAC地址只有一个外部端口上可见
mode 3(broadcast)广播策略:这种模式在所有的slave接口上传送所有的报文,提供容错能力。
注意:active-backup、balance-tlb 和 balance-alb 模式不需要交换机的任何特殊配置。其他绑定模式需要配置交换机以便整合链接。如:Cisco 交换机需要在模式 0、2 和 3 中使用 EtherChannel,但在模式4中需要 LACP和EtherChannel
三、bonding实现 mode 0 并测试
1)查看系统是否加载了bonding模块
1
2
[root@test-centos7-node1 ~]# lsmod|grep bonding
[root@test-centos7-node1 ~]#
说明:如果你的系统执行了lsmod命令 没有过滤到bonding相关的内容,说明你的系统没有加载bonding模块
2)加载bonding模块
1
2
3
4
5
[root@test-centos7-node1 ~]# lsmod|grep bonding
[root@test-centos7-node1 ~]# modprobe bonding
[root@test-centos7-node1 ~]# lsmod |grep bonding
bonding 145728 0
[root@test-centos7-node1 ~]#
说明:通常情况下内核版本2.4以后都是默认支持bonding模块,无需手动编译
3)备份原有的网卡配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@test-centos7-node1 test]# ls /etc/sysconfig/network-scripts/
ifcfg-ens33 ifdown-ippp ifdown-sit ifup-bnep ifup-plusb ifup-TeamPort
ifcfg-ens36 ifdown-ipv6 ifdown-Team ifup-eth ifup-post ifup-tunnel
ifcfg-lo ifdown-isdn ifdown-TeamPort ifup-ippp ifup-ppp ifup-wireless
ifdown ifdown-post ifdown-tunnel ifup-ipv6 ifup-routes init.ipv6-global
ifdown-bnep ifdown-ppp ifup ifup-isdn ifup-sit network-functions
ifdown-eth ifdown-routes ifup-aliases ifup-plip ifup-Team network-functions-ipv6
[root@test-centos7-node1 test]# cp /etc/sysconfig/network-scripts/{ifcfg-ens33,ifcfg-ens33.bak}
[root@test-centos7-node1 test]# cp /etc/sysconfig/network-scripts/{ifcfg-ens36,ifcfg-ens36.bak}
[root@test-centos7-node1 test]# ls /etc/sysconfig/network-scripts/
ifcfg-ens33 ifdown ifdown-isdn ifdown-Team ifup-bnep ifup-plip ifup-sit init.ipv6-global
ifcfg-ens33.bak ifdown-bnep ifdown-post ifdown-TeamPort ifup-eth ifup-plusb ifup-Team network-functions
ifcfg-ens36 ifdown-eth ifdown-ppp ifdown-tunnel ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
ifcfg-ens36.bak ifdown-ippp ifdown-routes ifup ifup-ipv6 ifup-ppp ifup-tunnel
ifcfg-lo ifdown-ipv6 ifdown-sit ifup-aliases ifup-isdn ifup-routes ifup-wireless
[root@test-centos7-node1 test]#
4)创建bonding配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@test-centos7-node1 test]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=YES
BOOTPROTO=static
IPADDR=192.168.0.33
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
BONDING_OPTS="miimon=100 mode=0"
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"/etc/sysconfig/network-scripts/ifcfg-bond0" [New] 8L, 141C written
[root@test-centos7-node1 test]#
说明:band0相对于原来的物理网卡它也是一块网卡,我们可以像配置物理网卡一样配置,但它又区别于物理网卡,它是一张虚拟的网卡,我们除了配置ip地址信息之外,还需要配置它工作的模式,以及心跳检测时间,其中miimon 是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路。
5)修改物理网卡配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@test-centos7-node1 test]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
[root@test-centos7-node1 test]# cat /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36
DEVICE=ens36
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
[root@test-centos7-node1 test]#
说明:把原有的配置ip信息去掉,把BOOTPROTO修改成none,然后新加MASTER=bond0,SLAVE=yes即可
6)重启网络服务并测试
说明:重启网络服务我用的crt会一直卡在哪里,原因是我们重新配置了IP地址。我们可用crt重新连接新配的地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@test-centos7-node1 test]# ip a s
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 00:0c:29:f2:82:0c brd ff:ff:ff:ff:ff:ff
3: ens36: mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether 00:0c:29:f2:82:0c brd ff:ff:ff:ff:ff:ff
5: bond0: mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:f2:82:0c brd ff:ff:ff:ff:ff:ff
inet 192.168.0.33/24 brd 192.168.0.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fef2:820c/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
[root@test-centos7-node1 test]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: ens33
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f2:82:0c
Slave queue ID: 0
Slave Interface: ens36
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:f2:82:16
Slave queue ID: 0
[root@test-centos7-node1 test]#
说明:可看到两张物理网卡和bond0的MAC都变成一样了,况且两张物理网卡上没有任何ip地址,bond0上是我们刚才配置的ip地址,说明我们配置的bond0已经可以使用了。当然我们也可以看/proc/net/bonding/bond0来查看bond的详细信息,其中可以看到两块物理网卡都从属bond0,band0的工作模式是load balancing。此模式实现了网卡的负载均衡和容错,我们可任意断开一个物理网卡,其网络服务不断开。测试的话可选择下载一个大文件来测试。
下载http://192.168.0.99/bigfile 文件测试
1)使用bond0 两物理网卡负载均衡来下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@test-centos7-node1 test]# time wget http://192.168.0.99/bigfile
--2020-01-10 10:33:48-- http://192.168.0.99/bigfile
Connecting to 192.168.0.99:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5211422720 (4.9G)
Saving to: ‘bigfile’
100%[============================================================>] 5,211,422,720 57.2MB/s in 93s
2020-01-10 10:35:21 (53.6 MB/s) - ‘bigfile’ saved [5211422720/5211422720]
real 1m32.961s
user 0m0.502s
sys 0m21.582s
[root@test-centos7-node1 test]#
说:可看到下载一个4.9G的大文件,用bond0下载平均下载速度是53.6MB/S
2)不使用bond0下载,恢复两物理网卡,让其都是用不同的IP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[root@test-centos7-node1 ~]# ls /etc/sysconfig/network-scripts/
ifcfg-ens33 ifdown-ippp ifdown-TeamPort ifup-isdn ifup-TeamPort
ifcfg-ens33.bak ifdown-ipv6 ifdown-tunnel ifup-plip ifup-tunnel
ifcfg-ens36 ifdown-isdn ifup ifup-plusb ifup-wireless
ifcfg-ens36.bak ifdown-post ifup-aliases ifup-post init.ipv6-global
ifcfg-lo ifdown-ppp ifup-bnep ifup-ppp network-functions
ifdown ifdown-routes ifup-eth ifup-routes network-functions-ipv6
ifdown-bnep ifdown-sit ifup-ippp ifup-sit
ifdown-eth ifdown-Team ifup-ipv6 ifup-Team
[root@test-centos7-node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.0.10
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
[root@test-centos7-node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36
DEVICE=ens36
ONBOOT=yes
IPADDR=192.168.0.20
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
[root@test-centos7-node1 ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f2:82:0c brd ff:ff:ff:ff:ff:ff
inet 192.168.0.10/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
3: ens36: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f2:82:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.20/24 brd 192.168.0.255 scope global ens36
valid_lft forever preferred_lft forever
5: bond0: mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether e6:e0:29:24:b5:e1 brd ff:ff:ff:ff:ff:ff
[root@test-centos7-node1 ~]# time wget http://192.168.0.99/bigfile
--2020-01-10 10:42:55-- http://192.168.0.99/bigfile
Connecting to 192.168.0.99:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5211422720 (4.9G)
Saving to: ‘bigfile’
100%[=================================================>] 5,211,422,720 63.6MB/s in 2m 48s
2020-01-10 10:45:43 (29.6 MB/s) - ‘bigfile’ saved [5211422720/5211422720]
real 2m48.065s
user 0m0.823s
sys 1m6.360s
[root@test-centos7-node1 ~]#
说明:可看到不使用bond0 下载平均速度是29.6MB/S
四、bonding实现 mode 1 并测试
前面的网卡配置文件备份,这里就不在演示,同上面的一样,这里只需要修改bond0 的配置文件,将其mode=0 修改成mode=1 ,物理网卡的配置文件同上面的一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@test-centos7-node1 ~]# ip a l
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether e6:e0:29:24:b5:e1 brd ff:ff:ff:ff:ff:ff
3: ens36: mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000
link/ether e6:e0:29:24:b5:e1 brd ff:ff:ff:ff:ff:ff
5: bond0: mtu 1500 qdisc noqueue state UP qlen 1000
link/ether e6:e0:29:24:b5:e1 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.33/24 brd 192.168.0.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::e4e0:29ff:fe24:b5e1/64 scope link
valid_lft forever preferred_lft forever
[root@test-centos7-node1 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Acti