Linux 网卡绑定在RHEL 7 之前,网卡绑定常用的是bonding模块,在RHEL7开始,支持使用team作网卡绑定,但在RHEL7中,bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。Linux网卡绑定模式介绍模式简介0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4
Linux 网卡绑定
在RHEL 7 之前,网卡绑定常用的是bonding模块,在RHEL7开始,支持使用team作网卡绑定,但在RHEL7中,bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。
Linux网卡绑定模式介绍
模式简介
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个口只占了小部分流量。
RHEL 6 网卡绑定操作
验证bonding模块
[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
创建bonding模块配置
[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网卡的负载模式
创建bonding网卡配置文件
[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
独立修改bonding参数
在系统” /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 7网卡绑定操作(bonding)
可以使用类似RHEL 6中的,直接修改ifcfg配置文件做bonding,也可以使用NetworkManager工具配置bonding。
RHEL 7开始,bonding已弃用了/etc/modprobe.d/bonding.conf和/etc/modprobe.conf配置bonding
验证bonding模块
与6的相同
方式1:使用修改配置文件的方式
- 禁用NetworkManager服务
# systemctl stop NetworkManager # systemctl disable NetworkManager # systemctl status NetworkManager
- 创建bond0网卡配置文件
# 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
方式2:使用nmcli工具的方式
- 查看物理网卡信息
# nmcli device
- 查看网卡连接信息
# nmcli connection show
- 删除已有connection的物理网卡信息
# nmcli connection delete ens192 # nmcli connection delete ens224 # nmcli connection show
- 创建绑定网卡bond0 并设置IP地址
# 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网卡参数”
- 创建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
- 修改bond0网卡参数
# 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
- 查看bond0状态
# cat /proc/net/bonding/bond0
方式3:视图nmtui工具
# nmtui
nmtui参考链接
–//nmtui待完善
RHEL 7网卡绑定(Team)
了解网络成组
联合或合并网络连接,以提供具有较高吞吐量的本地连接或冗余的方式可称为“频道绑定”、“以太网绑定”、“端
口聚合”、“频道成组”、“NIC 成组”、“链接合并” 等等。这个最初在 Linux 内核中应用的概念泛指“绑定”。现使
用网络成组(Network Teaming)代表这个概念的最新应用。这不会影响现有的绑定驱动程序,网络成组会作
为备选方法提供,且不会替换 Red Hat Enterprise Linux 7 中的绑定。
- team驱动
网络成组或成组旨在通过提供小内核驱动程序,以便使用不同的方法应用这个概念,实现数据包流的快速处理,并让各种用户空间应用程序在用户空间执行各种任务。该驱动程序有一个应用程序编程接口(API),即“成组 Netlink API”,可使用该接口进行 Netlink 通讯。用户空间程序库使用这个 API 与该驱动程序通讯。库指的是 “lib”,可用来进行成组 Netlink 通讯及 RT Netlink 信息在用户空间的换行。
- teamd守护进程
该守护进程通过使用附加代码(即 “运行程序”)采用负载平衡及 active-backup 逻辑(比如轮询)。通过使用这个方式分离代码,可方便网络成组对负载平衡及冗余要求的扩展及延伸解决方案。例如:使用 teamd 编写自定义运行程序应用新的逻辑可相对简单,即使 teamd 为自选程序,用户仍可编写其自己的应用程序以便使用 libteam。
- teamctl管理工具
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 状态间切换。
安装teamd daemon
# yum install -y teamd
方式1:使用nmcli配置网络成组
- 查看当前的网络连接信息
[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
- 创建team网络接口
[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。
- 为cteam0接口添加物理子接口
[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 --
- 为team接口配置IP等
[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
- 修改team接口的 team.config配置
[root@localhost ~]# nmcli connection modify cteam0 team.config '{"runner":{"name":"activebackup"},"link_watch":{"name":"ethtool"}}'
- 测试team网卡连通性
- 在服务器侧分别断开只其中一个物理接口的线缆或者down掉接口,测试与team网卡的连通性。
- 当前team网卡状态
[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
- down掉当前主网卡
[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
- 然后重新up主网卡,然后down掉另一个网卡,测试。
- 测试结果
...... 来自 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
- 不加任何config参数的配置如下
#默认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: --
方式2:使用ifcfg配置文件创建team组
在 /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