linux双网卡冗余

bond技术实现网卡绑定

概念
1
2
3
4
所谓的多网卡绑定就是将多张物理网卡逻辑上组成一个网卡,这样就可以防止一块网卡坏了网络瘫痪,也能起到提升网络带宽的作用。
把多块网卡绑定在一起,一般有两种工作模式可以选择,轮询模式和主备模式
- 轮询模式:例如把两块网卡绑定在一起,此时两块网卡都处于工作状态,它们轮流处理数据包,从而提升带宽和容错性。
- 主备模式:例如把两块网卡绑定在一起,同一时间只有一块网卡处于工作状态,只有发生故障,备用网卡才会切换到工作模式;
bond的工作模式
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
1) mode=0(balance-rr)平衡抡循环策略
- 链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口。
- 特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1…一直循环下去,直到最后一个传输完毕),此模式提供负载均衡和容错能力,但是我们知道如果一个连接或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新按要求发送,这样网络的吞吐量就会下降。
2) mode=1(active-backup)主备策略
- 只有一块网卡是active,另一块是备用的standby,所有流量都在active链路上处理,交换机配置的是捆绑的话将不能工作,因为交换机往两块网卡发包,有一半包是丢弃的。
- 特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见的,从外面来看,bond的mac地址是唯一的,以避免switch(交换机)发生混乱。此模式只提供了容错能力。由此可见此模式的优点是可以提供网络连接的高可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有N个网络接口的情况下,资源利用率为1/N。
3) mode=2(balance-xor)平衡策略
- 表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy,需要交换机配置port channel)
- 特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址XOR目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力。
4) mode=3(broadcast)广播策略
- 表示所有包从所有网络接口发出,这个不均衡,只有冗余机制,但过于浪费资源。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。特点:在每个slave接口上传输每个数据包,此模式提供了容错能力。
5) mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)
- 表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy).标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
- 特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
- 外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。
- 必要条件:
- 条件1:ethtool支持获取每个slave的速率和双工设定
- 条件2:switch(交换机)支持IEEE 802.3ad Dynamic link aggregation
- 条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式
6) mode=5(balance-tlb)适配器传输负载均衡
- 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
- 特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
- 必要条件:ethtool支持获取每个slave的速率
7) mode=6(balance-alb)适配器适应性负载均衡
- 在5的tlb基础上增加了rlb(接收负载均衡receive load balance).不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。

bond技术实现网卡绑定

准备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
前提:
1、bond技术依赖内核的bonding模块,所以需要先加载bonding模块才行
2、要使得bond能正常工作,必须安装ifenslave 工具,它将两个或更多的网络接口绑定到一个单一的通道,如果没装这个工具,具体表现为bond无法启动,一直是down的状态

# 查看是否已加载bonding模块
lsmod | grep bonding

# 加载bonding模块
sudo modprobe bonding

# 编辑配置文件,不然通过命令加载模块,重启会失效
sudo vim /etc/modules
bonding # 在配置文件中加入需要开启加载的模块

# 检查是否安装ifenslave
which ifenslave
修改配置文件实现bond技术
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
1、创建bonding的配置文件
sudo vim /etc/sysconfig/network-scripts/ifcfg-bond0
#添加相关参数
DEVICE=bond0 ## 可以根据自己的命名规则来命名,一般叫作bondX
BONDING_MASTER=yes ## 表示bond0为绑定的主设备
IPADDR=192.168.1.22 #需要做漂移的ip
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes # 开启自启动
BOOTPROTO=none # 静态地址分配
BONDING_OPTS="mode=active-backup miimon=100 primary=ens160"
#DNS1=
#DNS2=

> # BONDING_OPTS决定了 bonding 的模式 model=1(active-backup)表示是主备模式,mode=0表示为轮询模式
> # miimon=100表示系统每100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路
> # primary=ens160 指定ens160为正常时为主节点、当ens160 down掉后才由ens256继承、ens160起来后还是由ens160来工作
> #DNS需要就添加到最后


2、修改网卡的配置文件
#例如我这里将ens160和een256两个网卡加入到bond0里面去,就需要修改ens160和ens256的配置文件
ens160设置:
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens160
----------------------------------------------------
DEVICE="ens160"
ONBOOT="yes"
BOOTPROTO="none"
MASTER="bond0"
SLAVE="yes"
----------------------------------------------------

ens256设置:
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens256
----------------------------------------------------
DEVICE="ens256"
ONBOOT="yes"
BOOTPROTO="none"
MASTER="bond0"
SLAVE="yes"
-----------------------------------------------------

3、重启网络管理服务
systemctl restart network

4、查看地址:ip a
- 发现ens160和ens256网卡ip都没了(这样才是正常的)
- 多出了一个 bond0
-------------------------------------------------------------------------------------------------------------------
[root@k8s-loadbalancer2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens160: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:09:66:8f brd ff:ff:ff:ff:ff:ff
3: ens256: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:09:66:8f brd ff:ff:ff:ff:ff:ff
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:09:66:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.1.22/24 brd 192.168.1.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever
----------------------------------------------------------------------------------------------------------------------------------

5、查看bond0的详细信息:
- cat /proc/net/bonding/bond0
- Primary Slave 指网卡正常时由ens160来当主
- MII Status: up 说明网卡正常
--------------------------------------------------------------------------
[root@k8s-loadbalancer2 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: ens160 (primary_reselect always)
Currently Active Slave: ens160
MII Status: up
MII Polling Interval (ms): 50
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens256
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:09:66:99
Slave queue ID: 0

Slave Interface: ens160
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:09:66:8f
Slave queue ID: 0
----------------------------------------------------------------

6、测试
- 此时当执行:ifdown ens160 时,ens256会接管ip(192.168.1.22)
- 查看:/proc/net/bonding/bond0
- 此时是ens256来接管工作的
- 再执行 ifup ens160 再查看,发现此时是ens160来接管ip工作了
---------------------------------------------------------------

[root@k8s-loadbalancer2 ~]# 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 Active Slave: ens256
MII Status: up
MII Polling Interval (ms): 50
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens256
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:09:66:99
Slave queue ID: 0
-------------------------------------------------------------------

注意:如果本机安装了keepalive等一些虚拟ip的话、可能会产生某个被keepalive绑定的网卡被指定一个ip(vip)、此时服务器上会产生 ARP 缓存、此时要手动清理:
centos系统:sudo ip neigh flush all
ubuntu系统:sudo arp -d -i ens160 192.168.1.250 
清理完原来被keepalive绑定的网卡缓存后、将keepalive.conf配置文件中的 指定绑定的网卡改为:bond0 这个网卡即可

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
1、查看当前系统网卡信息:在终端输入:ifconfig,可以看到当前系统存在ens33、ens36两块网卡
2、创建bond虚拟网卡,命令如下:
$nmcli connection add type bond con-name bond1 ifname bond1 mode 1 ipv4.addresses 192.168.231.137/24 ipv4.method manual autoconnect yes
#type:创建的类型,选择bond类型
#con-name:链接名
#ifname:网卡名,这里bond1是虚拟出来的
#mode:bond模式,可用0-6表示
#ipv4.mehod:表示自动还是手动获取IP,manual代表手动,auto代表自动
#ipv4.address:设置IP地址
#autoconnext:是否开机自动连接


3、为bond网卡添加成员(真实网卡),命令:
$nmcli connect add type bond-slave ifname ens33 master bond1
$nmcli connect add type bond-slave ifname ens37 master bond1
#生成网卡文件:ifcfg-bond-slave-ens33、ifcfg-bond-slave-ens36
#类型为bond-slave,表示这块真实网卡属于一块附属的网卡,原有配置的属性都不能使用了
#master:表示这块网卡属于bond1这个组

4、添加完成之后,命令:nmcli connect 查询新添加的附属网卡是否启用,如未启用,需要用命令进行启用
$nmcli connect
NAME UUID TYPE DEVICE
bond1 ef494df9-6855-49a3-92b0-3f5f9b11f9e4 bond bond1
bond-slave-ens33 cfccec17-01d8-48f8-91a6-e268e7c5c4a4 ethernet ens33
bond-slave-ens36 40cd6eac-810d-489d-8557-482b2239cc84 ethernet ens36
ens33 7c0dd8e6-4308-4ac5-8841-32fb10b376a2 ethernet --


5、启动网卡:
$nmcli connect up bond-slave-ens33
$nmcli connect up bond-slave-ens36

6、查看链接信息并进行测试
$cat /proc/net/bonding/bond1
---------------------------------------------------------------
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
Primary Slave: ens33 (primary_reselect always)
Currently Active Slave: ens33
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens36
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:b3:77:46
Slave queue ID: 0

Slave Interface: ens33
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:b3:77:3c
Slave queue ID: 0
--------------------------------------------------------------------------------

7、测试:使用命令禁用正在使用的bond-slave-ens33网卡,找一台其他主机使用ping进行测试即可
$nmcli connection down bond-slave-ens33

8、常见问题
使用虚拟机进行测试时,可能会发现禁用网卡后无法ping通的问题,这时需要在bond1的虚拟网卡配置文件中添加如下参数即可
#进入bond1配置文件
$vim /etc/sysconfig/network-scripts/ifcfg-bond1
#添加一行
BONDING_OPTS="miimon=100 mode=1 fail_over_mac=1"
#miimon:链路检查时间100ms
#mode :模式为1,要与bond模式相同
#fail_over_mac=1 :mac地址跟随正常工作的网卡,当第一块网卡挂掉之后,自动将mac地址调整为第二块网卡的mac

9、删除网卡信息
$nmcli connect delete bond1 bond-slave-ens33 bond-slave-ens37

10、如果修改配置就需要重启:
$sudo systemctl restart NetworkManager
$sudo systemctl restart network

网卡的完整配置

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
ifcfg-bond1
-------------------------------------------------------------------------
BONDING_OPTS=mode=active-backup
TYPE=Bond
BONDING_MASTER=yes
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.177.201
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=bond0
UUID=ef494df9-6855-49a3-92b0-3f5f9b11f9e4
DEVICE=bond0
ONBOOT=yes
BONDING_OPTS="mode=1 miimon=100 primary=ens33 primary_reselect=always fail_over_mac=1"

#primary=ens33 指定主网卡
#mode=1 表示 active-backup 模式。
#miimon=100 检测时间
#primary_reselect=always:指示 Bonding 驱动程序总是 重新 选择主网卡。确保在主网卡出现故障或重新连接时自动切换
#fail_over_mac=1 :mac地址跟随正常工作的网卡,当第一块网卡挂掉之后,自动将mac地址调整为第二块网卡的mac

---------------------------------------------------------------------------------------------------

ifcfg-bond-slave-ens33
----------------------------------------------------------------------------------------------
TYPE=Ethernet
NAME=bond-slave-ens33
UUID=cfccec17-01d8-48f8-91a6-e268e7c5c4a4
DEVICE=ens33
ONBOOT=yes
MASTER=bond0
SLAVE=yes
-----------------------------------------------------------------------------

ifcfg-bond-slave-ens36
----------------------------------------------------------------------------------------------
TYPE=Ethernet
NAME=bond-slave-ens36
UUID=cfccec17-01d8-48f8-91a6-e268e7c5c4a4
DEVICE=ens33
ONBOOT=yes
MASTER=bond0
SLAVE=yes
-----------------------------------------------------------------------------