双网卡绑定-bond

下述操作均在centos7.6系统下亲测

1. 双网卡绑定的7种模式

一般mode=0与mode=1比较常用,mode=6负载均衡方式两块网卡都工作,不需要交换机支持,常用。

1.1 网卡负载均衡模式

网卡负载均衡模式mode=0
该模式的特点是增加了带宽,同时支持容错能力,当有某一链路出现问题时,会把所有流量切换到正常的链路上。

特点:
	所有链路处于负载均衡状态,以轮询方式向每条链路发送报文,基于per packet方式(按数据分流)发送。
	如在配置bond0的服务器ping baidu.com 两个网卡均会有流量发出,流量会负载到两条链路上,说明是基于per packet方式进行的轮训发送。
	该模式的特点是增加了带宽,同时支持容错能力,当有某一链路出现问题时,会把所有流量切换到正常的链路上。

1.2 网卡容错模式

网卡容错模式mode=1
当主端口down掉时,从端口会接手主端口的状态

特点:
	一个端口处于主状态,一个端口处于从状态,所有的流量都会在主链路上处理,从端口不会有任何流量。当主端口down掉时,从端口接手主状态

1.3 balance-xor需要交换机支持

需要交换机支持mode=2
通过源和目标mac做hash因子来做xor算法来选择链路

特点:
	该模式将限定流量,以保证到达特定对端的流量总是从同一个接口是上发出。既然目的地是通过MAC地址来决定的,因此该模式在“本地”网络配置下可以工作得很好。如果所有 流量是通过单个路由器(比如 “网关”型网络配置,只有一个网关时,源和目标mac都固定了,那么这个算法算出的线路就一直是同一条,那么这种模式就没有多少意义了。),那该模式就不 是最好的选择。和网卡的负载均衡模式一样,交换机端口需要能配置为“port channel”。
	这模式是通过源和目标mac做hash因子来做xor算法来选路的。

1.4 broadcast广播策略

广播策略mode=3
此模式需要高可靠性的网络,不允许出现任何问题。本模式提供负载均衡和容错的能力

特点
	此模式的特点是一个报文会负载两份王bond下的两个接口分别发送出去,当有对端交换机失效,我们感觉不到任何downtime,但此法过于浪费资源,在所有的slave接口上传送所有的报文。本模式提供容错能力。

1.5 IEEE 802.3ad 动态链路聚合

动态链路聚合mode=4

802.3ad模式是IEEE标准,因此所有实现了802.3ad的对端都可以很好的互操作。
802.3ad 协议包括聚合的自动配置,因此只需要很少的对交换机的手动配置(要指出的是,只有某些设备才能使用802.3ad)。
802.3ad标准也要求帧按顺序 (一定程度上)传递,因此通常单个连接不会看到包的乱序。
802.3ad也有些缺点:标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和 除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
此外,linux bonding的802.3ad实现通过对端来分发流量(通过MAC地址的XOR值),因此在“网关”型配置下,所有外出(Outgoing)流量将使用 同一个设备。
进入(Incoming)的流量也可能在同一个设备上终止,这依赖于对端802.3ad实现里的均衡策略。在“本地”型配置下,路两将通过 bond里的设备进行分发。

BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer2"      2层模式=IP

BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer2+3"   2+3层模式 =MAC+IP

BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer3+4"      3+4层模式=IP+端口

1.6 自适应传输负载均衡模式

balance-tlb自适应传输负载均衡模式mode=5

	自适应传输负载均衡:信道绑定不需要特殊的交换机支持。出口流量的分布取决于当前每个slave的负载(计算相对速度)。进口流量从当前的slave的接收。如果接收salve出错,其他的slave接管失败的slave的MAC地址继续接收。
  先决条件:
  每个slave的基本驱动支持Ehtool获取速率状态。

1.7 网卡虚拟化模式

网卡虚拟化mode=6
回复报文数第一个从端口1发第二个从端口2发,以此类推

特点:
	此模式包含了自适应传输负载均衡模式,同时加上针对IPV4流量的接收负载均衡,而且不需要任何switch(交换机)的支持。
	接收负载均衡是通过ARP协商(地址解析协议)实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
	所有端口都会收到对端的ARP请求报文,回复ARP回时,bond驱动模块会截获所发的ARP回复报文,跟进算法算到相应端口,这时会把ARP回复报文的源Mac,send源Mac都改成相应端口Mac。从抓包情况分析回复报文是第一个从端口1,第二个端口2发,以此类推。

2. bond0配置

mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。

2.1 修改两块网卡配置

# 加载bonding模块,并确认已经加载
$ modprobe --first-time bonding
$ lsmod | grep bonding
bonding               152656  0

# 进入网卡配置目录
$ cd /etc/sysconfig/network-scripts/

# 将网卡配置文件备份并删除
$ mv -f ifcfg-ens34 ifcfg-ens34.bak
$ mv -f ifcfg-ens38 ifcfg-ens38.bak

# 重新配置ens34与ens38网卡
$ vim ifcfg-ens34
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens34
MASTER=bond0
SLAVE=yes

$ vim ifcfg-ens38
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens38
MASTER=bond0
SLAVE=yes

2.2 配置bond0网卡

$ vim ifcfg-bond0
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond0
IPADDR=192.168.50.100
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=0"

2.3 bond配置文件

$ vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=0

2.4 开机自动加载bond

$ vim /etc/rc.local
modprobe bonding miimon=100 mode=0

2.5 验证

$ systemctl restart network
# 查看是否配置成功
$ ip a
3: ens34: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever


# 模拟某块网卡down
# 通过抓包来获取ping包来观察经过网卡的流量
# 一个窗口ping网关地址
$ ping 192.168.50.2

# 一个终端窗口抓取ens38去往网关的包
# 注意观察mac地址
$ tcpdump -i ens38 host 192.168.50.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens38, link-type EN10MB (Ethernet), capture size 262144 bytes
15:44:55.723646 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 1, length 64
15:44:55.723674 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 1, length 64
15:44:56.726182 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 2, length 64
15:44:56.726199 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 2, length 64
15:44:57.727318 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 3, length 64
15:44:57.727337 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 3, length 64
15:44:58.728931 IP localhost.localdomain > gateway: ICMP echo request, id 23653, seq 4, length 64
15:44:58.728945 IP gateway > localhost.localdomain: ICMP echo reply, id 23653, seq 4, length 64
# 另一块网卡同样可以抓到

# 在虚拟机中断开ens34网卡的连接
# ping 稍断即回复通信
# 注意观察mac地址
3: ens34: <NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 qdisc pfifo_fast master bond0 state DOWN group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever

3. bond1配置

mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。

3.1 修改两块网卡配置

# 进入网卡配置目录
$ cd /etc/sysconfig/network-scripts/

# 将网卡配置文件备份并删除
$ mv -f ifcfg-ens34 ifcfg-ens34.bak
$ mv -f ifcfg-ens38 ifcfg-ens38.bak

# 重新配置ens34与ens38网卡
$ vim ifcfg-ens34
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens34
MASTER=bond1
SLAVE=yes

$ vim ifcfg-ens38
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens38
MASTER=bond1
SLAVE=yes

3.2 配置bond0网卡

$ vim ifcfg-bond1
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond1
IPADDR=192.168.50.101
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=1"

3.3 bond配置文件

$ vim /etc/modprobe.d/bond1.conf
alias bond1 bonding
options bond1 miimon=100 mode=1

3.4 开机自动加载bond

$ vim /etc/rc.local
modprobe bonding miimon=100 mode=1

3.5 验证

# 重启网卡
$ systemctl restart network
# 注意观察mac地址
$ ip a
3: ens34: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever

# 查查看bond1状态
cat /proc/net/bonding/bond1
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: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:20
Slave queue ID: 0

Slave Interface: ens38
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:2a
Slave queue ID: 0

4. bond6配置

4.1 修改两块网卡配置

# 进入网卡配置目录
$ cd /etc/sysconfig/network-scripts/

# 将网卡配置文件备份并删除
$ mv -f ifcfg-ens34 ifcfg-ens34.bak
$ mv -f ifcfg-ens38 ifcfg-ens38.bak

# 重新配置ens34与ens38网卡
$ vim ifcfg-ens34
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens34
MASTER=bond6
SLAVE=yes

$ vim ifcfg-ens38
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens38
MASTER=bond6
SLAVE=yes

4.2 配置bond6网卡

$ vim ifcfg-bond6
TYPE=UnKnown
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=bond6
IPADDR=192.168.50.101
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=8.8.8.8
DNS2=223.5.5.5
BONDING_OPTS="miimon=80 mode=6"

4.3 bond配置文件

$ vim /etc/modprobe.d/bond6.conf
alias bond6 bonding
options bond6 miimon=100 mode=6

4.4 开机自动加载bond

$ vim /etc/rc.local
modprobe bonding miimon=100 mode=6

4.5 验证

# 重启网卡
$ systemctl restart network
# 注意观察mac地址
$ ip a
3: ens34: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond6 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond6 state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:2a brd ff:ff:ff:ff:ff:ff
6: bond6: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:8a:35:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.101/24 brd 192.168.50.255 scope global bond6
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe8a:3520/64 scope link 
       valid_lft forever preferred_lft forever

# 查查看bond6状态
cat /proc/net/bonding/bond6
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: ens34
MII Status: up
MII Polling Interval (ms): 80
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:20
Slave queue ID: 0

Slave Interface: ens38
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8a:35:2a
Slave queue ID: 0
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐