Linux Team

了解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互动,但会使用 libnlteamnl 与驱动程序 API 互动。

总之,不会直接配置或控制内核中运行的Team驱动程序实例。所有配置均采用用户空间应用程序完成,比如
teamd 程序。然后该程序会根据需要指向内核驱动程序。

在network teaming的上下文中,术语port也称为slave。 直接使用 teamd 时首选port,而使用 NetworkManager 时使用 slave 来引用创建组的接口。

了解主接口及从属接口的默认行为

使用 NetworkManager 守护进程控制teamed的端口接口时,特别是发现错误时,请记住以下要点:

  1. 启动主接口不会自动启动端口接口

  2. 启动端口接口总是会启动主接口

  3. 停止主接口总是会停止端口接口

  4. 没有端口的主机启动静态 IP 连接

  5. 没有端口的主机在启动 DHCP 连接时会等待端口。

  6. 添加附带载波的端口后,使用 DHCP 连接的主机会等待端口完成连接。

  7. 添加不附带载波的端口后,使用 DHCP 连接的主机会让端口继续等待。

警告
不支持对使用线缆但没有网络交换机的连接进行teaming操作。如果没有网络交换机,在此论述的这个故障转移机制就无法工作。详情请查看 Red Hat 知识库文章《为什么在使用交叉线缆的直接连接中不支持绑定?

Team和Bond对比

Team和Bond功能对比

功能BondTeam
多播 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 地址设定为 autoNetworkManager 还会将配置写入 /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.runnerteam.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的网络配置冗余:

  1. 从team接口Ping目标IP。例如:

    ~]# ping -I team0 DSTADDR
    
  2. 查看处于 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接口。

  3. 设置active slave接口down:

    ~]# ip link set enp1s0 down
    
  4. 检查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接口。

  5. 检查你是否仍然可以从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”。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值