了解Team
联合或合并网络连接,以提供具有较高吞吐量的本地连接或冗余的方式可称为“频道绑定”、“以太网绑定”、“端
口聚合”、“频道teaming”、“NIC teaming”、“链路聚合” 等等。最初在 Linux 内核中应用的此概念泛指“bonding”。现使用Network Teaming代表这个概念的最新应用。这不会影响现有的bonding驱动程序,bonding会作为备选方法提供,且不会替换 Red Hat Enterprise Linux 7 中的bonding。
注
对于模式 4 LACP Team模式,需要配置交换机来聚合链路。 有关更多详细信息,请参阅
https://www.kernel.org/doc/Documentation/networking/bonding.txt
Team旨在通过提供小内核驱动程序,以便使用不同的方法应用这个概念,实现数据包流的快速处理,并让各种用户空间应用程序在用户空间执行各种任务。该驱动程序有一个应用程序编程接口(API),即“Team Netlink API”,可使用该接口进行 Netlink 通讯。用户空间程序库使用这个 API 与该驱动程序通讯。库指的是 “lib”,可用来进行Team Netlink 通讯及 RT Netlink 信息在用户空间的封装。同时还提供应用程序守护进程teamd 使用 libteam 库。teamd 的实例可控制Team驱动程序中的实例。该守护进程通过使用附加代码(即 runners)采用负载平衡及 active-backup 逻辑(比如轮询)。通过使用这个方式分离代码,可方便Network Teaming 对负载平衡及冗余要求的扩展及延伸解决方案。例如:使用 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 状态间切换。
Team Netlink API 通信使用 Netlink 信息与用户空间应用程序通讯。用户空间库 libteam 不会直接与这个 API互动,但会使用 libnl 或 teamnl 与驱动程序 API 互动。
总之,不会直接配置或控制内核中运行的Team驱动程序实例。所有配置均采用用户空间应用程序完成,比如
teamd 程序。然后该程序会根据需要指向内核驱动程序。
注
在network teaming的上下文中,术语port也称为slave。 直接使用 teamd 时首选port,而使用 NetworkManager 时使用 slave 来引用创建组的接口。
了解主接口及从属接口的默认行为
使用 NetworkManager 守护进程控制teamed的端口接口时,特别是发现错误时,请记住以下要点:
-
启动主接口不会自动启动端口接口。
-
启动端口接口总是会启动主接口。
-
停止主接口总是会停止端口接口。
-
没有端口的主机可启动静态 IP 连接。
-
没有端口的主机在启动 DHCP 连接时会等待端口。
-
添加附带载波的端口后,使用 DHCP 连接的主机会等待端口完成连接。
-
添加不附带载波的端口后,使用 DHCP 连接的主机会让端口继续等待。
警告
不支持对使用线缆但没有网络交换机的连接进行teaming操作。如果没有网络交换机,在此论述的这个故障转移机制就无法工作。详情请查看 Red Hat 知识库文章《为什么在使用交叉线缆的直接连接中不支持绑定?》
Team和Bond对比
Team和Bond功能对比
功能 | Bond | Team |
---|---|---|
多播 Tx 策略 | 是 | 是 |
轮询 Tx 策略 | 是 | 是 |
active-backup Tx 策略 | 是 | 是 |
LACP (802.3ad) 支持 | 是(仅适用于 passive) | 是 |
基于哈希字符的 Tx 策略 | 是 | 是 |
用户可设定哈希功能 | 否 | 是 |
Tx 负载平衡支持(TLB) | 是 | 是 |
LACP 哈希端口选择 | 是 | 是 |
用于 LACP 支持的负载平衡 | 否 | 是 |
Ethtool 链接监控 | 是 | 是 |
ARP 链接监控 | 是 | 是 |
NS/NA (IPv6) 链接监控 | 否 | 是 |
端口启动/断开延迟 | 是 | 是 |
端口优先权及粘性(“主要”选项加强) | 否 | 是 |
根据端口链接进行独立监控的设置 | 否 | 是 |
多链接监控设置 | 有限监控 | 是 |
无锁 Tx/Rx 路径 | 无 (rwlock) | 有 (RCU) |
VLAN 支持 | 是 | 是 |
用户空间运行时控制 | 有限监控 | 全面控制 |
用户空间逻辑 | 否 | 是 |
延展性 | 困难 | 容易 |
模块设计 | 否 | 是 |
性能开销 | 低 | 非常低 |
D-Bus 接口 | 否 | 是 |
多设备堆叠 | 是 | 是 |
使用 LLDP 进行零配置 | 否 | (计划中) |
NetworkManager 支持 | 是 | 是 |
了解TEAM守护进程及“RUNNERS”
Team守护进程 teamd 使用 libteam 控制team驱动中的一个实例。该team驱动实例添加硬件设备驱动程序实例以构成网络链路“team”。该team驱动为内核的其它部分提供网络口,比如 team0。文档中会为由team驱动实例创建的接口按顺序命名,比如 team0、team1 等等。这样便于理解,但可使用其它名称。所有teaming 方法通用的逻辑由teamd实现;不同负载分享及备份方法中特有的功能,比如轮询,则是由不同的代码单位,也称“runners”实现。因为类似 “模块” 和 “模式” 等词语有与内核相关的特别含义,所以选择“runners”代表这些代码单元。用户可在 JSON 形式的配置文件中指定runner,然后就会在创建实例时将其代码编译到teamd 实例中。runner不是插件,因为runner的代码是在创建该程序时编译到teamd 中。如果需要,可以将代码创建为teamd 的插件。
在撰写本文时可用以下runners。
-
broadcast(可将数据传送到所有端口)
-
round-robin(可按顺序将数据传送到所有端口)
-
active-backup(使用一个端口或链路,而其它端口或链路保留作为备份)
-
loadbalance(使用主动 Tx 负载平衡及基于 BPF 的 Tx 端口选择程序)
-
lacp(实现 802.3ad 链路聚合控制协议)
此外还可使用以下链路监控程序:
-
ethtool(Libteam lib 使用 ethtool 监视链路状态变化)。若没有在配置中指定其它链路监控程序,则默认使用该程序。
-
arp_ping(使用 arp_ping 程序监控使用 ARP 数据包的远端硬件地址状态。)
-
nsna_ping(来自 IPv6 Neighbor Discovery 协议的 Neighbor Advertisements 和 Neighbor Solicitation 用于监控邻居接口的存在)
在代码中没有限制来阻止一个特定的链路监控程序与一个特定的runner一起使用,但是当使用lacp runner时,ethtool是唯一推荐的链路监控程序。
安装Team守护进程
默认不会安装Team守护进程 teamd。要安装 teamd,请作为 root 运行以下命令:
~]# yum install teamd
将bond转化为team
可使用 bond2team 工具将现有bond配置文件转换为team配置文件。它可将 ifcfg 格式的bond配置文件转换为 ifcfg 或 JSON 格式的team配置文件。注:重命名后可能会破坏与原来的接口名称关联的防火墙规则、别名接口及其它信息,因为这个工具只更改 ifcfg 文件,其它什么都不会做。
请运行以下命令查看命令格式示例:
~]$ bond2team --examples
会在以 /tmp/bond2team.XXXXXX/ 开头的目录中创建新文件,其中 XXXXXX 是随机字符串。创建新配置文件后,请将旧的bond文件移动到备份文件夹中,然后将新文件移动到/etc/sysconfig/network-scripts/ 目录下。
例 将bond转化为team
请作为 root 运行以下命令将当前的 bond0 配置转换为team ifcfg:
~]# /usr/bin/bond2team --master bond0
注:这样会保留名称bond0。要使用新名称保存该配置,请使用 –rename 选项,如下:
~]# /usr/bin/bond2team --master bond0 --rename team0
添加 –json 选项输出 JSON 格式文件,而不是 ifcfg 文件。有关 JSON 格式示例请查看teamd.conf(5) man page。
例 将bond转化为team并指定文件路径
要将 bond0 配置转换为team ifcfg,并手动指定 ifcfg 文件路径,请作为 root 运行以下命令:~]# /usr/bin/bond2team --master bond0 --configdir /path/to/ifcfg-file
添加 –json 选项输出 JSON 格式文件,而不是 ifcfg 文件。
例 使用 Bond2team 生成team配置
可使用 bond2team 工具并附加一组bond参数列表创建team配置。例如:~]# /usr/bin/bond2team --bonding_opts "mode=1 miimon=500"
还可以如下方式在命令行中提供端口:
~]# /usr/bin/bond2team --bonding_opts "mode=1 miimon=500 primary=eth1 \ primary_reselect-0" --port eth1 --port eth2 --port eth3 --port eth4
详情请查看 bond2team(1) man page。
选择作为team端口使用的接口
请运行以下命令查看可用接口:
~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:6a:02:8a brd ff:ff:ff:ff:ff:ff
3: em2: <BROADCAST,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:9b:6d:2a brd ff:ff:ff:ff:ff:ff
在可用接口中确定适合添加到team中的接口,然后执行 “选择team配置方法”。
选择Tean配置方法配置方法
要使用命令行工具 nmcli 创建team,请按照 “使用 nmcli 配置team” 操作。
要使用team守护进程teamd 创建网络team,请按照 “使用 teamd 创建网络team” 操作。
要使用配置文件创建网络 team ,请按照 “使用 ifcfg 文件创建team” 操作。
使用命令行配置网team
使用 nmcli 配置网team
运行以下命令查看系统中的可用设备:
~]$ nmcli connection show
NAME UUID TYPE DEVICE
eth1 0e8185a1-f0fd-4802-99fb-bedbb31c689b 802-3-ethernet --
eth0 dfe1f57b-419d-4d1c-aaf5-245deab82487 802-3-ethernet --
要查看系统上可用的设备:
~]$ nmcli device status
DEVICE TYPE STATE CONNECTION
virbr0 bridge connected virbr0
ens3 ethernet connected ens3
请运行以下命令使用名称 team-ServerA 创建新的team接口:
~]$ nmcli connection add type team ifname team-ServerA
Connection 'team-ServerA' (b954c62f-5fdd-4339-97b0-40efac734c50)
successfully added.
NetworkManager 会将其内部参数 connection.autoconnect 设定为 yes,这样就不会将给出
ipv4.method 的 IP 地址设定为 auto。NetworkManager 还会将配置写入 /etc/sysconfig/network-
scripts/ifcfg-team-ServerA,其中会将对应的 ONBOOT 设定为 yes,并将 BOOTPROTO 设定为dhcp。
注:再次启用该接口前,NetworkManager 不会意识到对 ifcfg 文件的手动更改。
请运行以下命令查看其它分配的值:
~]$ nmcli con show team-ServerAconnection.id: team-ServerAconnection.uuid: b954c62f-5fdd-4339-97b0-40efac734c50connection.interface-name: ServerAconnection.type: teamconnection.autoconnect: yes…[output truncated]
因为没有指定任何 JSON 配置文件,所以采用默认值。有关team JSON 参数及其默认值的详情,请查看teamd.conf(5) man page。注:该名称衍生自接口名称,在接口名称的前面添加类型。另外还可使用 con-name 选项指定一个名称,如下:
~]$ nmcli connection add type team con-name Team0 ifname ServerBConnection 'Team0' (5f7160a1-09f6-4204-8ff0-6d96a91218a7) successfully add
运行以下命令查看刚刚配置的team接口:
~]$ nmcli con showNAME UUID TYPE DEVICEteam-ServerA b954c62f-5fdd-4339-97b0-40efac734c50 team ServerAeth1 0e8185a1-f0fd-4802-99fb-bedbb31c689b 802-3-ethernet --eth0 dfe1f57b-419d-4d1c-aaf5-245deab82487 802-3-ethernet - -Team0 5f7160a1-09f6-4204-8ff0-6d96a91218a7 team ServerB
运行以下格式的命令更改为team分配的名称:
nmcli con mod old-team-name connection.id new-team-name
要为现有team载入team配置文件,请使用以下格式的命令:
nmcli connection modify team-name team.config JSON-config
可将team配置文件指定为 JSON 字符串,或提供包含该配置的文件名。该文件名可包括路径。两种情况都会在team.config 属性中保存 JSON 字符串。如果是 JSON 字符串,请使用单引号将字符串括起来,并将整个字符串粘贴到命令行中。
运行以下格式的命令检查 team.config 属性:
nmcli con show team-name | grep team.config
例如,要设置允许指定一个或多个链接监控程序的 team.link-watchers 属性,请按以下格式输入命令:
nmcli connection modify team-name team.link-watchers "name=ethtool delay-up=5,
name=nsna_ping target-host=target.host"
需要的link-watchers用逗号隔开,属于同一个link-watcher的属性用空格隔开。
要设置 team.runner 和 team.link-watchers 属性,请按以下格式输入命令:
nmcli connection modify team-name team.runner activebackup team.link-watchers
"name=ethtool delay-up=5, name=nsna_ping target-host=target.host"
这相当于将 team.config 属性设置为相应的 JSON 字符串:
nmcli connection modify team-name team.config '{"runner": {"name": "activebackup"},
"link_watch": [{"name": "ethtool", "delay_up": 5},{"name": "nsna_ping", "target_host ":"target.host"}]'
运行以下命令在 Team0 中添加名为 Team0-port1 的接口 eth0:
~]$ nmcli con add type team-slave con-name Team0-port1 ifname eth0 master Team0
Connection 'Team0-port1' (ccd87704-c866-459e-8fe7-01b06cf1cffc) successfully added.
同样,可使用以下命令添加另一个名为 Team0-port2 的接口 eth1:
~]$ nmcli con add type team-slave con-name Team0-port2 ifname eth1 master Team0
Connection 'Team0-port2' (a89ccff8-8202-411e-8ca6-2953b7db52dd) successfully added.
写入时,nmcli 只支持以太网接口。要启用team,必须首先激活这些端口,如下:
~]$ nmcli connection up Team0-port1
Connection successfully activated (D-Bus active path:
/org/freedesktop/NetworkManager/ActiveConnection/2)
~]$ nmcli connection up Team0-port2
Connection successfully activated (D-Bus active path:
/org/freedesktop/NetworkManager/ActiveConnection/3)
可通过激活这些端口验证是否已激活team接口,如下:
~]$ ip link
3: Team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
link/ether 52:54:00:76:6f:f0 brd ff:ff:ff:ff:ff:f
另外还可使用命令启用该接口组,如下:
~]$ nmcli connection up Team0
Connection successfully activated (D-Bus active path:
/org/freedesktop/NetworkManager/ActiveConnection/4)
使用 teamd创建team
注意
使用 teamd 创建的配置不会持久,因此应按照 “使用 nmcli 配置team” 或 “使用 ifcfg 文件创建team” 中规定的步骤创建team接口。
要创建team,作为team端口或链路接口的虚拟接口需要一个 JSON 格式的配置文件。快捷的方法是复制示例配置文件,然后使用有 root 授权的编辑器进行编辑。请输入以下命令列出可用示例配置文件:
~]$ ls /usr/share/doc/teamd-*/example_configs/
activebackup_arp_ping_1.conf activebackup_multi_lw_1.conf loadbalance_2.conf
activebackup_arp_ping_2.conf activebackup_nsna_ping_1.conf loadbalance_3.conf
activebackup_ethtool_1.conf broadcast.conf random.conf
activebackup_ethtool_2.conf lacp_1.conf roundrobin_2.conf
activebackup_ethtool_3.conf loadbalance_1.conf roundrobin.conf
请使用以下命令查看包含的文件之一,比如 activebackup_ethtool_1.conf,请输入一下命令:
~]$ cat /usr/share/doc/teamd-*/example_configs/activebackup_ethtool_1.conf
{
"device": "team0",
"runner": {
"name": "activebackup"
},
"link_watch": {
"name": "ethtool"
},
"ports": {
"eth1": {
"prio": -10,
"sticky": true
},
"eth2": {
"prio": 100
}
}
}
创建工作配置目录保存 teamd 配置文件。例如:作为普通用户输入以下格式的命令:
~]$ mkdir ~/teamd_working_configs
将选择的文件复制到工作目录中,并根据需要进行编辑。例如:可使用以下命令格式:
~]$ cp /usr/share/doc/teamd-*/example_configs/activebackup_ethtool_1.conf \
~/teamd_working_configs/activebackup_ethtool_1.conf
要编辑该文件以适应实际的环境(例如更改作为team端口的接口),请打开要编辑的文件,如下:
~]$ vi ~/teamd_working_configs/activebackup_ethtool_1.conf
进行必要的更改并保存文件。有关使用 vi 编辑器或使用首选编辑器的详情,请查看 vi(1) man page。
需注意在该team内作为端口使用的接口不得处于 active 状态,就是说将其添加到team设备时,它们必须处于 “down” 状态。运行以下命令检查其状态:
~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 52:54:00:d5:f7:d4 brd ff:ff:ff:ff:ff:ff
3: em2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 52:54:00:d8:04:70 brd ff:ff:ff:ff:ff:ff
在该示例中可以看到要使用的两个接口都处于 “UP” 状态。
请作为 root 用户,使用以下命令格式禁用接口:
~]# ip link set down em1
根据需要在每个接口中执行这个操作。
要创建基于配置文件的team接口,请作为 root 用户进入可使用的配置目录(在这个示例中为
teamd_working_configs):
~]# cd /home/userteamd_working_configs
然后运行以下格式的命令:
~]# teamd -g -f activebackup_ethtool_1.conf -d
Using team device "team0".
Using PID file "/var/run/teamd/team0.pid"
Using config file
"/home/user/teamd_working_configs/activebackup_ethtool_1.conf"
-g 选项用于显示 debug 信息,-f 选项用于指定要载入的配置文件,-d 选项可让该进程中启动后作为守护进程运行。有关其它选项的详情请查看 teamd(8) man page。
请作为 root 用户使用以下命令检查team接口状态:
~]# teamdctl team0 state
setup:
runner: activebackup
ports:
em1
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
em2
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
runner:
active port: em1
作为 root 用户,使用以下命令在team接口 team0 中应用一个地址:
~]# ip addr add 192.168.23.2/24 dev team0
运行以下命令检查team接口的 IP 地址:
~]$ ip addr show team0
4: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 16:38:57:60:20:6f brd ff:ff:ff:ff:ff:ff
inet 192.168.23.2/24 scope global team0
valid_lft forever preferred_lft forever
inet6 2620:52:0:221d:1438:57ff:fe60:206f/64 scope global dynamic
valid_lft 2591880sec preferred_lft 604680sec
inet6 fe80::1438:57ff:fe60:206f/64 scope link
valid_lft forever preferred_lft forever
作为 root 用户,使用以下命令激活该team接口,或使其处于 “up” 状态:
~]# ip link set dev team0 up
作为 root 用户,使用以下命令暂时取消激活team接口,或使其处于 “down” 状态:
~]# ip link set dev team0 down
作为 root 用户,使用以下命令终止或杀死team守护进程的实例:
~]# teamd -t team0 -k
使用 -k 选项指定要杀死与设备 team0 关联的守护进程实例。其它选项请查看 teamd(8) man page。
运行以下命令获得 teamd 命令行选项帮助信息:
~]$ teamd -h
此外,请查看 teamd(8) man page。
使用 ifcfg 文件创建网team
要 ifcfg 文件创建网络team,在 /etc/sysconfig/network-scripts/ 目录中创建一个文件,如下:
DEVICE=team0
DEVICETYPE=Team
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.11.1
PREFIX=24
TEAM_CONFIG='{"runner": {"name": "activebackup"}, "link_watch": {"name":"ethtool"}}'
这样可为该team创建接口,换句话说这就是主接口。
要创建属于 team0 成员的端口,请在 /etc/sysconfig/network-scripts/ 目录中创建一个或多个文
件,如下:
DEVICE=eth1
HWADDR=D4:85:64:01:46:9E
DEVICETYPE=TeamPort
ONBOOT=yes
TEAM_MASTER=team0
TEAM_PORT_CONFIG='{"prio": 100}'
根据要求添加与上述接口类似的其它端口接口,修改 DEVICE 和 HWADDR 字段使其与端口(网络设备)匹配。如果未根据 prio 指定端口优先级,则默认为 0。该数值可为负数和正数,范围在 -32,767 到 +32,767之间。
使用 HWADDR 指令指定硬件或 MAC 地址会影响设备命名过程。
作为 root 运行以下命令启用team:
~]# ifup team0
运行以下命令查看team:
~]$ ip link show
使用 iputils 在 team中添加端口
作为 root,使用 ip 实用程序运行以下命令,在team team0 中添加端口 em1:
~]# ip link set dev em1 down
~]# ip link set dev em1 master team0
根据需要添加其它端口。team驱动程序会自动启用这些端口。
使用 teamnl 列出team成员端口
作为 root 使用 teamnl 实用程序,运行以下命令查看或列出team中的成员端口:
~]# teamnl team0 ports
em2: up 100 fullduplex
em1: up 100 fullduplex
使用 teamnl 配置成team选项
作为 root 使用 teamnl 实用程序,运行以下命令查看或列出当前可用选项:
~]# teamnl team0 options
要将team配置为使用 active-backup 模式,作为 root 运行以下命令:
~]# teamnl team0 setoption mode activebackup
使用iputils 在team中添加地址
作为 root 使用 ip 实用程序,运行以下命令在team接口 team0 中添加地址:
~]# ip addr add 192.168.252.2/24 dev team0
使用iputils 在team中激活接口
作为 root,使用 ip 实用程序,运行以下命令激活接口,或在team中 “启用” 接口:
~]# ip link set team0 up
使用 teamnl 查看team的 active port 选项
作为 root,使用 teamnl 实用程序,运行以下命令查看或列出team中的 activeport 选项:
~]# teamnl team0 getoption activeport
0
使用 teamnl 设置team的 activeport 选项
作为 root,使用 teamnl 实用程序,运行以下命令在team中设置 activeport 选项:
~]# teamnl team0 setoption activeport 5
作为 root,使用以下命令检查team端口选项变更:
~]# teamnl team0 getoption activeport
5
使用 teamnl 控制teamd
可使用控制工具 teamdctl 查询运行的 teamd 实例,以获取统计或配置信息。
作为 root 使用以下命令查看team team0 的当前状态:
~]# teamdctl team0 state view
要了解更详细的信息,请运行:
~]# teamdctl team0 state view -v
运行以下命令获取 team0 的完整 JSON 格式状态转储(对机器处理有帮助):
~]# teamdctl team0 state dump
运行以下命令获取 team0 的 JSON 格式配置转储:
~]# teamdctl team0 config dump
运行以下命令查看作为team team0 一部分的端口 em1 配置:
~]# teamdctl team0 port config dump em1
向team中添加端口
作为 root 运行以下命令在team team0 中添加端口 em1:
~]# teamdctl team0 port add em1
重点
如果直接使用teamdctl来添加slave端口,则必须将slave端口设置为down。否则,teamdctl team0 port add em1命令将失败。
从team中删除端口
作为 root 运行以下命令,从team team0 中删除接口 em1:
~]# teamdctl team0 port remove em1
将配置应用于team中的成员端口
要将JSON格式配置应用于team team0中的成员端口em1,作为 root 运行以下格式的命令::
~]# teamdctl team0 port config update em1 JSON-config-string
其中 JSON-config-string 是 JSON 格式文本中的字符串文本配置。这样就可使用提供的 JSON 格式字符串更
新端口配置。用来配置端口的有效 JSON 字符串示例类似如下:
{
"prio": -10,
"sticky": true
}
使用单引号括起 JSON 配置字符串,并忽略换行符号。
注:会覆盖旧的配置,同时会将省略的选项重置为默认值。有关team守护进程控制工具命令示例,请查看
teamdctl(8) man page。
查看team中端口的配置
要复制team team0 中端口 em1 的配置,作为 root 运行以下命令:
]# teamdctl team0 port config dump em1
这会将该端口的 JSON 格式配置转储为标准输出。
验证Team的网络配置冗余
网络冗余是指将设备用于备份目的,以防止特定系统发生故障或从中恢复的过程。以下过程描述了如何验证Team的网络配置冗余:
-
从team接口Ping目标IP。例如:
~]# ping -I team0 DSTADDR
-
查看处于 active模式的接口:
~]# teamdctl team0 state setup: runner: activebackup ports: enp1s0 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 enp2s0 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 runner: active port: enp1s0
enp1s0是 active接口。
-
设置active slave接口down:
~]# ip link set enp1s0 down
-
检查backup接口是否up:
~]# teamdctl team0 state setup: runner: activebackup ports: enp1s0 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 enp2s0 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 runner: active port: enp2s0
现在enp2s0是 active接口。
-
检查你是否仍然可以从team接口ping目的IP:
~]# ping -I team0 DSTADDR
配置 teamd runners
runners是创建实例时编译到team连接守护进程中的代码单元。
配置 broadcast runner
要配置 broadcast runner,作为 root 使用编辑器,在team JSON 格式配置文件中添加以下内容:
{
"device": "team0",
"runner": {
"name": "broadcast"
},
"ports": {
"em1": {
},
"em2": {
}
}
}
详情请查看 teamd.conf(5) man page。
配置 random runner
Random runner与 roundrobin 运行程序行为类似。
要配置 random runner,请作为 root 使用编辑器,在team JSON 格式配置文件中添加以下内容:
{
"device": "team0",
"runner": {
"name": "random"
},
"ports": {
"em1": {
},
"em2": {
}
}
}
详情请查看 teamd.conf(5) man page。
配置 Round-robin runner
要配置 roundrobin runner,作为 root 使用编辑器在team JSON 格式配置文件中添加以下内容
{
"device": "team0",
"runner": {
"name": "roundrobin"
},
"ports": {
"em1": {
},
"em2": {
}
}
}
round-robin 的最基本配置。
详情请查看 teamd.conf(5) man page。
配置 active-backup runner
active-backup runner可使用所有链路监控程序确定team中链路的状态。以下任意示例都可添加到team JSON 格式配置文件中:
{
"device": "team0",
"runner": {
"name": "activebackup"
},
"link_watch": {
"name": "ethtool"
},
"ports": {
"em1": {
"prio": -10,
"sticky": true
},
"em2": {
"prio": 100
}
}
}
本例中使用带有ethtool作为链路监控程序的active-backup runner。端口em2优先级高。sticky标志确保如果em1 变为active 状态,只要链接保持up,它就保持active 状态。
{
"device": "team0",
"runner": {
"name": "activebackup"
},
"link_watch": {
"name": "ethtool"
},
"ports": {
"em1": {
"prio": -10,
"sticky": true,
"queue_id": 4
},
"em2": {
"prio": 100
}
}
}
本示例配置添加了队列 ID 4。它使用 active-backup runner,将 ethtool 作为链路监控程序。端口 em2 有较高的优先权。但sticky标志可保证如果 em1 变为active 状态,只要链路处于up状态,它就会处于 active 状态
要使用ethtool作为链路监控程序并应用延迟来配置active-backup runner,请使用root 使用编辑人员,将以下内容添加到team JSON格式配置文件中:
{
"device": "team0",
"runner": {
"name": "activebackup"
},
"link_watch": {
"name": "ethtool",
"delay_up": 2500,
"delay_down": 1000
},
"ports": {
"em1": {
"prio": -10,
"sticky": true
},
"em2": {
"prio": 100
}
}
}
这本例中使用带有ethtool作为链路监控程序的active-backup runner。端口em2优先级高。sticky标志确保如果em1 变为active 状态,只要链接保持up,它就保持active 状态。链路变化不会立即计入该runner,但会应用延迟。
详情请查看 teamd.conf(5) man page。
配置 loadbalance runner
该runner可用于两种负载平衡,即active和passive负载平衡。在active模式中,通过使用最新流量统计不断进行流量再平衡,以便尽可能平均分配流量。在passive模式中,流量会在可用链路之间随机分配。鉴于较低的处理开销,这样有速度优势。在高流量应用程序中通常首选此方式,因为流量通常由多个要在可用链路间随机分配的流组成,使用这种方式时,无需 teamd 介入即可完成负载分布。
要为passive传输(Tx)负载平衡配置 loadbalance runner,作为 root 在team JSON 格式配置文件中添加以下内容:
{
"device": "team0",
"runner": {
"name": "loadbalance",
"tx_hash": [
"eth",
"ipv4",
"ipv6"
]
},
"ports": {
"em1": {
},
"em2": {
}
}
}
配置基于哈希的passive传输(Tx)负载平衡。
要为active传输(Tx)负平衡配置 loadbalance runner,作为 root 在team JSON 格式配置文件中添加以下内容:
{
"device": "team0",
"runner": {
"name": "loadbalance",
"tx_hash": [
"eth",
"ipv4",
"ipv6"
],
"tx_balancer": {
"name": "basic"
}
},
"ports": {
"em1": {
},
"em2": {
}
}
}
使用basic负载均衡器的active传输(Tx)负载均衡配置。
详情请查看 teamd.conf(5) man page。
配置 LACP (802.3ad) runner
要使用 ethtool 作为链路监控程序配置 LACP runner,作为 root 用户在team JSON 格式配置文件中添加以下内容:
{
"device": "team0",
"runner": {
"name": "lacp",
"active": true,
"fast_rate": true,
"tx_hash": [
"eth",
"ipv4",
"ipv6"
]
},
"link_watch": {
"name": "ethtool"
},
"ports": {
"em1": {
},
"em2": {
}
}
}
用于连接到支持链路聚合控制协议(LACP)的对等方的配置。LACP runner应该使用ethtool来监控链路的状态。请注意,只有ethtool可以用于链路监控,因为使用 arp_ping 时,该链路可能永远无法激活。原因是必须首先建立该链路,也只有在建立链路后,数据包(包括 ARP)方可通过。使用 ethtool 可防止此类情况,因为它单独监控每一个链路层。
使用这个runner 可能会以 loadbalance ruuner类似的方式进行active负载平衡。要启用active传输(Tx)负载均衡,请添加以下内容:
"tx_balancer": {
"name": "basic"
}
详情请查看 teamd.conf(5) man page。
配置链路状态监控
以下为可用的链路状态监控方法。要采用其中之一,需以 root权限在team JSON 格式配置文件中
添加 JSON 格式字符串。
配置Ethtool进行链路状态监控
要在激活链路之后到通知runner之前到时间段内添加或编辑现有延迟(单位:毫秒),可按照如下方法操作:
"link_watch": {
"name": "ethtool",
"delay_up": 2500
}
要在断开链路后到通知runner前添加或编辑现有延迟(单位:毫秒),可按照如下方法操作:
"link_watch": {
"name": "ethtool",
"delay_down": 1000
}
配置ARP Ping用于链路状态监控
team守护进程 teamd 会向链路远端的地址发送 ARP REQUEST,以确定该链路是否处于连接状态。这个方法与 arping 程序的功能相同,但不会使用该实用程序。
准备一个包含 JSON 格式新配置的文件,类似如下:
{
"device": "team0",
"runner": {
"name": "activebackup"
},
"link_watch": {
"name": "arp_ping",
"interval": 100,
"missed_max": 30,
"source_host": "192.168.23.2",
"target_host": "192.168.23.1"
},
"ports": {
"em1": {
"prio": -10,
"sticky": true
},
"em2": {
"prio": 100
}
}
}
该配置使用 arp_ping 作为链路监控程序。missed_max 选项是最多可允许的丢失回复数(比如 ARP 回
复)。可与 interval 选项一同使用,以决定将链路报告为断开前的总时间长度。
要为team端口 em2 从包含 JSON 配置的文件中载入新配置,作为 root 运行以下命令:
~]# teamdctl port config update em2 JSON-config-file
需注意会覆盖旧配置,同时会将省略的选项重置为默认值。有关team守护进程控制工具命令示例,请查看
teamdctl(8) man page。
配置IPv6 NA/NS链路状态监控
{
"device": "team0",
"runner": {
"name": "activebackup"
},
"link_watch": {
"name": "nsna_ping",
"interval": 200,
"missed_max": 15,
"target_host": "fe80::210:18ff:feaa:bbcc"
},
"ports": {
"em1": {
"prio": -10,
"sticky": true
},
"em2": {
"prio": 100
}
}
}
要配置发送 NS/NA 数据包的间隔,请添加或编辑以下内容:
"link_watch": {
"name": "nsna_ping",
"interval": 200
}
该数值为正数(单位:毫秒)。可与 missed_max 选项一同使用,以决定将链路状态报告为断开前的总时间长度。
要配置将链路状态报告为断开前最多可丢失的 NS/NA 数据包数,请添加或编辑以下内容:
"link_watch": {
"name": "nsna_ping",
"missed_max": 15
}
最多可丢失的 NS/NA 回复数。如果超过这个数值,则会将该链路状态报告为断开。missed_max 选项是允许丢失回复(比如 ARP 回复)的最大数值。它可与 interval 选项一同使用,以决定报告链路断开前的总时间长度。
要配置解析为 IPv6 地址(即 NS/NA 数据包的目标地址)的主机名,请添加或编辑以下内容:
"link_watch": {
"name": "nsna_ping",
"target_host": "MyStorage"
}
“target_host” 选项包含要转换为 IPv6 地址的主机名,会将该地址作为 NS/NA 数据包的目标地址使用。可在主机名中使用 IPv6 地址。
详情请查看 teamd.conf(5) man page。
配置端口选择覆盖
物理端口传输的帧一般由team驱动程序内核部分选择,而不是由用户或系统管理员决定。输出端口由所选team模式(teamd runner)策略选择。但在实现较为复杂的策略时,偶尔将某些类型的传出流量指向某些物理
接口有帮助。默认情况下,team驱动程序可识别多队列,并在启动该驱动程序时创建 16 个队列。如果需要更多或较少的队列,可在创建team驱动程序实例时,使用 Netlink 属性 tx_queues 更改这个数值。
可使用端口配置选项 queue_id 配置端口的队列 ID,如下:
{
“queue_id”: 3
}
这些队列 ID 可以与 tc 实用程序结合使用,以配置多队列队列规则和过滤器,以偏向在某些端口设备上传输的某些流量。 例如,如果使用上述配置并希望强制绑定到 192.168.1.100 的所有流量使用team中的 enp1s0 作为其输出设备,请以以下格式以 root 身份发出命令:
~]# tc qdisc add dev team0 handle 1 root multiq
~]# tc filter add dev team0 protocol ip parent 1: prio 1 u32 match ip dst \
192.168.1.100 action skbedit queue_mapping 3
此机制覆盖runner选择逻辑,以便将流量绑定到具体端口,该机制适用于所有runner。
配置基于 BPF 的 Tx 端口选择程序
loadbalance 和 LACP runner使用数据包哈希为网络流量排序。这个哈希计算机制是基于伯克利数据包过滤器(BPF)代码。BPF 代码是用来生成哈希,而不是决定传出数据包的策略。哈希长度为 8 字节,有 256 种变体。就是说很多不同的套接字缓冲(SKB)可有相同的哈希,并因此将流量传递给同一链路。使用短哈希是将流量分入不同 stream 的快速方法,以便在多个链路间取得平衡负载。在passive模式中,只使用哈希决定应该向那个端口发送流量。在active模式中,runner将继续创新将哈希分配给不同的端口,以达到最佳平衡状态。
以下片段类型或字符串可用于数据包 Tx 哈希计算:
-
eth — 使用源和目标 MAC 地址。
-
vlan — 使用 VLAN ID。
-
ipv4 — 使用源和目标 IPv4 地址。
-
ipv6 — 使用源和目标 IPv6 地址。
-
ip — 使用源和目标 IPv4 和 IPv6 地址。
-
l3 — 使用源和目标 IPv4 和 IPv6 地址。
-
tcp — 使用源和目标 TCP 端口。
-
udp — 使用源和目标 UDP 端口。
-
sctp — 使用源和目标 SCTP 端口。
-
l4 — 使用源和目标 TCP、UDP 和 SCTP 端口。
可通过在负载平衡runner中添加如下格式的一行使用这些字符串:
“tx_hash”: [“eth”, “ipv4”, “ipv6”]
。示例请参考 “配置 loadbalance runner”。