在RHEL 7 之前,网卡绑定常用的是bonding模块,在RHEL7开始,支持使用team作网卡绑定,但在RHEL7中,bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。
0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb
常用的有三种模式
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。
mode=4 需要支持802.3ad。
mode5和mode6不需要交换机端的设置,网卡能自动聚合,因为做bonding的这两块网卡是使用不同的MAC地址。
mode=0(balance-rr)(平衡抡循环策略)
链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口,思科叫port channel。
特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接
或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降
mode=1(active-backup)(主-备份策略)
这个是主备模式,只有一块网卡是active,另一块是备用的standby,所有流量都在active链路上处理,交换机配置的是捆绑的话将不能工作,因为交换机往两块网卡发包,有一半包是丢弃的。
特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。
此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N
mode=2(balance-xor)(平衡策略)
表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy,需要交换机配置port channel)
特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力
mode=3(broadcast)(广播策略)
表示所有包从所有网络接口发出,这个不均衡,只有冗余机制,但过于浪费资源。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。
特点:在每个slave接口上传输每个数据包,此模式提供了容错能力
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模式
mode=5(balance-tlb)(适配器传输负载均衡)
是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
必要条件:
ethtool支持获取每个slave的速率
mode=6(balance-alb)(适配器适应性负载均衡)
在5的tlb基础上增加了rlb(接收负载均衡receive load balance).不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的.
特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。
使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。
当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上
当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答 不会被switch(交换机)阻截。
必要条件:
条件1:ethtool支持获取每个slave的速率;
条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量。
[root@rac1 ~]# modprobe bonding
[root@rac1 ~]# lsmod |grep bonding
[root@rac1 ~]# modinfo bonding
filename: /lib/modules/4.1.12-94.3.9.el7uek.x86_64/kernel/drivers/net/bonding/bonding.ko
author: Thomas Davis, tadavis@lbl.gov and many others
description: Ethernet Channel Bonding Driver, v3.7.1
version: 3.7.1
license: GPL
alias: rtnl-link-bond
srcversion: F8D6873B85C4EE219C56662
depends:
intree: Y
vermagic: 4.1.12-94.3.9.el7uek.x86_64 SMP mod_unload modversions
signer: Oracle CA Server
sig_key: 87:3F:B2:2B:C5:C1:07:C3:48:F2:D8:5F:43:D7:D7:ED:5D:62:3C:98
sig_hashalgo: sha512
[root@rac1 network-scripts]# vi /etc/modprobe.d/bonding.conf
--给新创建的bonding.conf中写入:
alias bond0 bonding
options bonding miimon=100 mode=1
--// miimon 表示每间隔多少毫秒(ms)监控一次bond0
--// mode 表示要创建的bond0网卡的负载模式
[root@rac1 network-scripts]# cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<EOF
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=114.114.114.114
IPV6INIT=no
USERCTL=no
EOF
[root@rac1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
--取消此配置文件中的IP相关设置
[root@rac1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
--取消此配置文件中的IP相关设置
--//重新加载bonding模块,如果修改了bonding.conf之后,需要重新加载
# modprobe -r bonding
--//重启网络
# service restart network
--//验证bonding状态
# cat /proc/net/bonding/bond0
在系统” /sys/class/net/bond/bonding/* ” 目录下,可以单独设置关于bonding的参数。(修改这些参数前,需要停用bonding网卡)
# ifconfig down bond0
# echo 1000 > /sys/class/net/bond/bonding/miimon
# echo 6 > /sys/class/net/bond/bonding/mode
# echo balance-alb > /sys/class/net/bond/bonding/mode
--// 其中mode可以设置为以下数字或字符:
0 for balance-rr
1 for active-backup
2 for balance-xor
3 for broadcast
4 for 802.3ad
5 for balance-tlb
6 for balance-alb
可以使用类似RHEL 6中的,直接修改ifcfg配置文件做bonding,也可以使用NetworkManager工具配置bonding。
RHEL 7开始,bonding已弃用了/etc/modprobe.d/bonding.conf和/etc/modprobe.conf配置bonding
与6的相同
# systemctl stop NetworkManager
# systemctl disable NetworkManager
# systemctl status NetworkManager
# vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=bond --//RHEL7中与6的参数不同,必须为bond
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
IPADDR=192.168.0.1
PREFIX=24
GATEWAY=192.168.0.254
DNS=114.114.114.114
BONDING_OPTS="miimon=100 mode=1"
# vi /etc/sysconfig/network-scripts/ifcfg-ens192
NAME=ens192
DEVICE=ens192
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
MASTER=bond0
SLAVE=yes
# vi /etc/sysconfig/network-scripts/ifcfg-ens210
NAME=ens210
DEVICE=ens210
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
MASTER=bond0
SLAVE=yes
# modprobe -r bonding
# systemctl restart network
# cat /proc/net/bonding/bond0
# nmcli device
# nmcli connection show
# nmcli connection delete ens192
# nmcli connection delete ens224
# nmcli connection show
# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens192 ipv4.addresses 192.168.201.231/24
# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens192 ipv4.method manual ipv4.addresses 192.168.201.232/24 ipv4.gateway 192.168.201.254
--//如果使用第二个语句创建bond0,就可以不需要使用下文“7.修改bond0网卡参数”
# nmcli connection add type bond-slave ifname ens192 con-name bond0-ens192 master bond0
# nmcli connection add type bond-slave ifname ens224 con-name bond0-ens224 master bond0
# nmcli connection show --active
# nmcli connection modify bond0 ipv4.method manual --如果不修改此项,则bond0网卡因为bootproto 参数为DHCP而无法UP
# nmcli connection modify bond0 ipv4.gateway 192.168.201.254
如果bond0及其子接口有未激活的,手动激活。
# nmcli connection up bond0-ens192
# nmcli connection up bond0-ens224
# nmcli connection up bond0
# cat /proc/net/bonding/bond0
# nmtui
–//nmtui待完善
联合或合并网络连接,以提供具有较高吞吐量的本地连接或冗余的方式可称为“频道绑定”、“以太网绑定”、“端
口聚合”、“频道成组”、“NIC 成组”、“链接合并” 等等。这个最初在 Linux 内核中应用的概念泛指“绑定”。现使
用网络成组(Network Teaming)代表这个概念的最新应用。这不会影响现有的绑定驱动程序,网络成组会作
为备选方法提供,且不会替换 Red Hat Enterprise Linux 7 中的绑定。
网络成组或成组旨在通过提供小内核驱动程序,以便使用不同的方法应用这个概念,实现数据包流的快速处理,并让各种用户空间应用程序在用户空间执行各种任务。该驱动程序有一个应用程序编程接口(API),即“成组 Netlink API”,可使用该接口进行 Netlink 通讯。用户空间程序库使用这个 API 与该驱动程序通讯。库指的是 “lib”,可用来进行成组 Netlink 通讯及 RT Netlink 信息在用户空间的换行。
该守护进程通过使用附加代码(即 “运行程序”)采用负载平衡及 active-backup 逻辑(比如轮询)。通过使用这个方式分离代码,可方便网络成组对负载平衡及冗余要求的扩展及延伸解决方案。例如:使用 teamd 编写自定义运行程序应用新的逻辑可相对简单,即使 teamd 为自选程序,用户仍可编写其自己的应用程序以便使用 libteam。
teamdctl 提供一个用来控制使用 D-bus 运行 teamd 实例的工具。它可为 teamd D-Bus API 提供 D-Bus 换行程序。默认情况下,teamd 使用 Unix 域套接字(Unix Domain Socket)进行侦听和通讯,但仍监控 D-Bus。这样做是保证能够在没有 D-Bus 或者尚未载入 D-Bus 的环境中使用 teamd。例如:引导 teamd 链接时不一定载入 D-Bus。可在运行时使用 teamdctl 工具读取配置、连接监控程序状态、端口状态检查及变更、添加和删除端口以及将端口状态在 active 和 backup 状态间切换。
# yum install -y teamd
[root@localhost ~]# nmcli conn show
NAME UUID TYPE DEVICE
ens33 701ebac7-b4c5-44ac-9707-022b7ec7973f ethernet ens33
Wired connection 1 9a8854d6-36b3-3afe-adb9-fa2cf8916e03 ethernet ens34
Wired connection 2 0e11da32-2ab3-3041-9fc0-432788a1852c ethernet ens37
[root@localhost ~]# nmcli conn add type team con-name cteam0 ifname iteam0 config '{"runner":{"name":"activebackup"}}'
Connection 'cteam0' (83c35d77-69b3-42ec-8fcb-8375d47ec3dd) successfully added.
[root@localhost ~]# nmcli conn show
NAME UUID TYPE DEVICE
ens33 701ebac7-b4c5-44ac-9707-022b7ec7973f ethernet ens33
Wired connection 1 9a8854d6-36b3-3afe-adb9-fa2cf8916e03 ethernet ens34
Wired connection 2 0e11da32-2ab3-3041-9fc0-432788a1852c ethernet ens37
cteam0 83c35d77-69b3-42ec-8fcb-8375d47ec3dd team iteam0
nmcli conn add type team 的语法:
nmcli conn add type team con-name CNAME ifname IFNAME [config JSON]
JSON (JavaScript Object Notation)语法格式:‘{“runner”:{“name”:“METHOD”}}’
METHOD 是以下的其中一个:broadcast、activebackup、roundrobin、loadbalance 或者 lacp。
[root@localhost ~]# nmcli conn add type team-slave con-name cteam0-port1 ifname ens34 master cteam0
[root@localhost ~]# nmcli conn add type team-slave con-name cteam0-port2 ifname ens37 master cteam0
要启用成组,必须首先激活这些子端口.
[root@localhost ~]# nmcli conn show
NAME UUID TYPE DEVICE
cteam0 83c35d77-69b3-42ec-8fcb-8375d47ec3dd team iteam0
cteam0-port1 2b5c185c-7dad-435e-9658-2f5f2729be53 ethernet ens34
cteam0-port2 49d7309d-0223-4c8f-aa51-8813d4c05563 ethernet ens37
ens33 701ebac7-b4c5-44ac-9707-022b7ec7973f ethernet ens33
Wired connection 1 9a8854d6-36b3-3afe-adb9-fa2cf8916e03 ethernet --
Wired connection 2 0e11da32-2ab3-3041-9fc0-432788a1852c ethernet --
[root@localhost ~]# nmcli connection modify cteam0 ipv4.addresses "192.168.0.110/24" ipv4.method manual
[root@localhost ~]# nmcli connection modify cteam0 ipv4.gateway "192.168.0.1"
[root@localhost ~]# nmcli connection up cteam0-port1
[root@localhost ~]# nmcli connection up cteam0-port2
[root@localhost ~]# nmcli connection up cteam0
[root@localhost ~]# nmcli connection modify cteam0 team.config '{"runner":{"name":"activebackup"},"link_watch":{"name":"ethtool"}}'
[root@localhost ~]# teamdctl iteam0 state view
setup:
runner: activebackup
ports:
ens34
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
ens37
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
active port: ens34
[root@localhost ~]# nmcli connection down cteam0-port1
Connection 'cteam0-port1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/21)
[root@localhost ~]# teamdctl iteam0 state view
setup:
runner: activebackup
ports:
ens37
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
active port: ens37
......
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=4ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=17ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=9ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=11ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
192.168.0.110 的 Ping 统计信息:
数据包: 已发送 = 71,已接收 = 71,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 3ms,最长 = 39ms,平均 = 5ms
#默认team接口的配置:
[root@localhost ~]# nmcli conn add type team con-name cteam0 ifname iteam0
team.config: --
team.notify-peers-count: 0 (disabled)
team.notify-peers-interval: 0 (default)
team.mcast-rejoin-count: 0 (disabled)
team.mcast-rejoin-interval: 0 (default)
team.runner: roundrobin
team.runner-hwaddr-policy: --
team.runner-tx-hash: --
team.runner-tx-balancer: --
team.runner-tx-balancer-interval: -1
team.runner-active: no
team.runner-fast-rate: no
team.runner-sys-prio: -1
team.runner-min-ports: -1
team.runner-agg-select-policy: --
team.link-watchers: --
在 /etc/sysconfig/network-scripts/ 目录中创建一个team主接口的配置文件,配置参考如下:
文件名:ifcfg-cteam0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0
TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}"
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
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=cteam0
UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
DEVICE=iteam0
ONBOOT=yes
DEVICETYPE=Team
IPADDR=192.168.0.110
PREFIX=24
文件名:ifcfg-cteam0-port1
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0-port1
NAME=cteam0-port1
UUID=2b5c185c-7dad-435e-9658-2f5f2729be53
DEVICE=ens34
ONBOOT=yes
TEAM_MASTER_UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
TEAM_MASTER=iteam0
DEVICETYPE=TeamPort
文件名:ifcfg-cteam0-port2
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0-port2
NAME=cteam0-port2
UUID=49d7309d-0223-4c8f-aa51-8813d4c05563
DEVICE=ens37
ONBOOT=yes
TEAM_MASTER_UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
TEAM_MASTER=iteam0
DEVICETYPE=TeamPort
子接口的配置中可以加 优先级参数
TEAM_PORT_CONFIG='{"prio": 100}'
其中:prio的取值范围是 -32767 到 32767 之间
prio默认为0.
# ifup cteam0
# ip link show