网卡绑定技术Teaming
网络组NetWork Teaming
网络组是将多块网卡逻辑地连接到一起从而允许故障转移或者提高吞吐率的方法。
提高服务器网络可用性的一个方式是使用多个网卡
Linux 绑定驱动程序提供了一种将多个网卡聚合到一个逻辑的绑定接口的方法。
该方法是一个新的实现绑定的方法,不会影响Linux内核中的旧绑定驱动
- 网络组是将多个网卡聚合在一起的方法,从而实现冗错和提高吞吐量
- 网络组不同于旧版中bonding技术,提供更好的性能和扩展性
- 网络组由内核驱动和teamd守护进程实现.
有多种方式runner
-
broadcast (ˈbrɔːdkæst]广播 策略):传输来自所有端口的每个包
-
特点:
这种模式一个报文会复制两份往bond下的两个接口分别发送出去,当有对端交换机失效,我们感觉不到任何downtime(停机时间),但此法过于浪费资源;不过这种模式有很好的容错机制。
-
适用于拓扑中两个接口分别接入两台交换机,并且属于不同的vlan,当一边的网络出现故障不会影响服务器另一边接入的网络正常工作。而且故障过程是0丢包
-
-
roundrobin (轮转策略 (另称balance [ˈbæləns]平衡 -rr)):以轮询方式传输来自每个端口的包
- 特点:
- 从头到尾顺序的在每一个slave接口上面发送数据包,轮询方式往每条链路发送报文,基于(每一个包)per packet方式发送。服务上ping 一个相同地址:1.1.1.1 双网卡的两个网卡都有流量发出。负载到两条链路上,说明是基于per packet方式 ,进行轮询发送。
- 提供负载均衡和容错的能力,当有链路出问题,会把流量切换到正常的链路上。
- 交换机端需要配置聚合口
- 特点:
-
activebackup (主备策略):故障转移,监视链接更改并选择活动端口进行数据传输
-
特点:
一个端口处于主状态 ,一个处于从状态,所有流量都在主链路上处理,从链路不会有任何流量。当主端口down掉时,从端口接手主状态。
-
不需要交换机端支持
-
-
loadbalance (限定流量):监控流量并使用哈希函数以尝试在为包传输选择端口时达到完美均衡
-
特点:
该模式将限定流量,以保证到达特定对端的流量总是从同一个接口上发出。
-
既然目的地是通过MAC地址来决定的,因此该模式在“本地”网络配置下可以工作得很好。如果所有流量是通过单个路由器(比如 “网关”型网络配置,只有一个网关时,源和目标mac都固定了,那么这个算法算出的线路就一直是同一条,那么这种模式就没有多少意义了。),那该模式就不是最好的选择。
-
和balance-rr一样,交换机端口需要能配置为“port channel”。这模式是通过源和目标mac做hash因子来做xor算法来选路的。
-
交换机端需要配置聚合口
-
-
lacp(implements the 802.3ad Link Aggregation Control Protocol)
-
特点:
802.3ad模式是IEEE标准,因此所有实现了802.3ad的对端都可以很好的互操作。802.3ad 协议包括聚合的自动配置,因此只需要很少的对交换机的手动配置(要指出的是,只有某些设备才能使用802.3ad)。802.3ad标准也要求帧按顺序(一定程度上)传递,因此通常单个连接不会看到包的乱序。
-
缺点:标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽
-
此外,linux bonding的802.3ad实现通过对端来分发流量(通过MAC地址的XOR值),因此在“网关”型配置下,所有外出(Outgoing)流量将使用同一个设备。进入(Incoming)的流量也可能在同一个设备上设置,这依赖于对端802.3ad实现里的均衡策略。在“本地”型配置下,将通过 bond里的设备进行分发。
-
实施802.3链路聚合控制协议
- 启动网络组接口不会自动启动网络组中的port接口
- 启动网络组接口中的port接口始终会启动合作接口
- 禁用网络组接口会自动禁用网络组中的port接口
- 没有port接口的网络组接口可以启动静态IP连接
- 启用DHCP连接时,没有port接口的网络组会等待port接口的加入
-
创建网络组接口
nmcli命令可用于创建和管理组和端口接口。以下4个步骤用于创建和激活网络组接口:
- 创建组接口
- 确定组接口的IPv4和/或IPv6属性
- 分配端口接口
- 启动/关闭组接口和端口接口
#创建组接口命令格式:组接口默认使用dhcp获取IP参数
#nmcli con add type team con-name CNAME ifname INAME [configJSON]
#CNAME:连接名,INAME:接口名
#JSON指定runner方式
#格式:'{"runner": {"name": "METHOD"}}'
#METHOD可以是broadcast,roundrobin, activebackup,loadbalance, lacp
#分配端口接口命令格式:
#nmcli con add type team-slave con-name CNAME ifname INAME master TEAM
#CNAME:连接名 INAME:网络接口名 TEAM:网络组接口名
#连接名若不指定,默认为team-slave-IFACE
#启动/关闭组接口和端口接口:
nmcli dev dis INAME (开启:nmcli dev con INAME)
nmcli con up CNAME
#INAME设备名 CNAME网络组接口名或port接口
实验:创建网络组
## 实验环境为centos7.2
#0.目前服务器上的网卡信息
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens33 56512e22-aa87-4e2c-bbaf-8a02047f0895 ethernet ens33
ens37 4a8e96aa-f7d0-31dc-8be0-e32b72f6063c ethernet ens37
#1.创建网络组team0,会在/etc/sysconfig/network-scripts/目录下生成ifcfg-team0文件
[root@localhost ~]# nmcli connection add con-name team0 type team ifname team0 config '{"runner":{"name":"activebackup"}}'
#2.添加DNS、ip、网关 modify修改
[root@localhost ~]# nmcli connection modify team0 ipv4.dns 8.8.8.8
[root@localhost ~]# nmcli connection modify team0 ipv4.addresses "192.168.113.250/24"
[root@localhost ~]# nmcli connection modify team0 ipv4.gateway "192.168.113.2"
[root@localhost ~]# nmcli connection modify team0 ipv4.method manua
#3.加入组成员 team0-eth0和team-eth1
[root@localhost ~]# nmcli connection add con-name team0-eth0 type team-slave ifname ens33 master team0
[root@localhost ~]# nmcli connection add con-name team0-eth1 type team-slave ifname ens37 master team0
#4、启动
[root@localhost ~]# nmcli connection up team0
[root@localhost ~]# nmcli connection up team0-eth0
[root@localhost ~]# nmcli connection up team0-eth1
#5、查看状态
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
team0 4a2a820d-3033-4c0b-9af3-b9f504207a2b team team0
team0-eth0 b2363021-7f38-45c7-b2c6-44d66da77a6d ethernet ens33
team0-eth1 80a63ee0-fea5-47f4-8110-0046f35e0342 ethernet ens37
ens33 56512e22-aa87-4e2c-bbaf-8a02047f0895 ethernet --
ens37 4a8e96aa-f7d0-31dc-8be0-e32b72f6063c ethernet --
[root@localhost ~]# teamdctl team0 state
setup:
runner: activebackup
ports:
ens33
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: ens37 # 目前runner的是ens37
可以模拟设备接口down掉:
[root@localhost ~]# nmcli connection down team0-eth1
[root@localhost ~]# teamdctl team0 state
setup:
runner: activebackup
ports:
ens33
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
active port: ens33 # 经过几秒后会自动切到 ens33上 如果用其他机器长ping 会发现 “请求超时”几秒后自动重连