我们距离双线双活的完美方案越来越近了。在上文的链路聚合方案中,服务器和交换机之间的多条线路可以虚拟成一条,唯一的不足是故障检测比较复杂,MII Monitoring 和 ARP Monitoring 都不够完美。有什么办法,可以在出现问题的时候,让无论是交换机还是服务器都能快速发现问题并进行切换呢?
目前的健康检查手段,MII Monitoring 太短,不足以检查到线路的问题;ARP Monitoring 太长,连对端服务器的问题也会触发。最好的检测距离就是服务器到交换机之间,这样不多也不少。
按照这个思路,可以让交换机和服务器之间实现类似 keepalive 的机制,当任意一方的任意一条线路发现对面不再存活,就不使用这条线继续发送数据,就可以做到更加准确的健康检查机制。
LACP (Link Aggregation Control Protocol) 就是这样一种协议。
IEEE 802.3ad 定义了链路聚合,但是链路聚合可以认为是一种实现而不是协议,它的兼容性很高,不同的厂商可以自己实现链路聚合功能。在上一篇文章中,我们没有使用 LACP 协议,也看到了链路聚合正常工作。802.3ad 一个是定义了链路聚合,另一个就是定义了 LACP 协议。LACP 协议做了两件事情:
- 健康检查,可以自动发现问题执行切换;
- 可以自己协商链路聚合,减少手动配置的内容;
健康检查是通过 LACP 协议参与的两端(交换机和服务器),互相发送 LACPDU,这是一个二层的数据帧,只会存在于网线的两端,不会被转发。如果能收到对方发送的 LACPDU,说明线路健康,如果连续3个 LACPDU 都没收到,就不从这条线路发送数据了。LACP 发送 LACPDU 的 rate 有两种,一种是 fast, 每 1s 发送一个,这样在线路挂的时候,需要 3 个包的时间,就是 3s 恢复。另一种是 slow,每 30s 发送一个,出现问题的时候需要 90s 时间恢复。
第二个功能更加实用。读者可能觉得,配置多一点没有什么问题呀,只要我们使用自动化来代替手动配置就可以。但是事实上,这个功能远不止节省了配置。
LACP 协议有两种模式,mode active
和 mode passive
:
- active 模式下,设备会通过线路发送 LACPDU(LACP 协议的包),不管对方有没有开启 LACP 协议;
- passive 模式下,设备不会发送 LACPDU,除非收到了对方发过来的 LACPDU;
Active 不代表建立了链路聚合,要完成链路聚合,双方至少有一方得是 active 模式才行,如果两端都收到了对方的 LACPDU 就可以协商建立起来链路聚合。
这种自动协商的链路聚合第一个优点就是配置很少,要多加一根线的时候,插上线,LACP 协议就可以开始自动协商。
第二个优点就是可以阻止错误,这点非常重要。机房部署的时候,经常遇到线路接错的情况(不要惊讶,这太常见了)。
考虑下面这种情况,交换机 1 和 2 做了链路聚合,服务器网口 A 和 B 做了链路聚合,配置正确,但是机房人员在接线的时候接错了,服务器 B 口应该连接交换机端口 2,却连接了端口 5.
如果是静态配置的链路聚合,交换机和服务器都不会知道线路接错的情况,服务器会通过 A 和 B 发送数据,交换机这边就会出现 MAC flapping 问题。交换机也可能通过 2 端口把应该发给这台服务器的数据发送到错误的地方去。
这是一个灾难性的问题,因为程序会表现异常而不是直接报网络错误,很难排查。可以类似我们在写程序的时候,我们喜欢程序直接出错挂掉,而不是没有错误但是逻辑有 BUG。又如,我们宁可数据库出问题,也不想数据库没问题但是数据全错了。
而如果使用 LACP 协议的话,交换机从 1 号端口和 5 号端口发送过来的 LACPDU 会有不一样的 system id
,在服务器侧,就会发现对方的两个端口不属于同一个 Link Aggration Group (LAG), 于是协商失败,就无法完成链路聚合,在服务器侧就会只选择使用一条线进行发送。同理,交换机也不会认为自己的 1 号和 5 号能完成链路聚合,这时候会选择断开一条线。LACP 协商会让两端断开同一条线,所以最终这种情况是依然可以通信,但是只有一条线能工作。问题非常明确,我们直接去排查为什么带宽不正确,进而排查 LACP 链路聚合状态即可。
802.3ad 模式实验 (mode 4)
我们使用的拓扑结构如下,还是和之前的一样:
使用默认的配置很简单,还是和之前的配置一样,只不过 mode 使用 802.3ad
这个名字。
因为 LACP 协议是在 802.3ad 中定义的,所以 Linux 中的配置直接用了 802.3ad 作为 mode,意思就是完全使用 802.3ad 中定义的链路聚合,也意味着开启了 LACP 协议。
1 2 3 4 5 6 7 |
ip link add bond0 type bond mode 802.3ad ip link set eth0 down ip link set eth1 down ip link set eth0 master bond0 ip link set eth1 master bond0 ip link set bond0 up ip add add 192.168.1.10/24 dev bond0 |
查看 ip link,和之前的静态链路聚合是一样的。
1 2 3 4 5 6 7 8 9 |
root@ubuntu-5:/$ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 52:51:0e:de:05:04 brd ff:ff:ff:ff:ff:ff 99: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 52:51:0e:de:05:04 brd ff:ff:ff:ff:ff:ff 100: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 52:51:0e:de:05:04 brd ff:ff:ff:ff:ff:ff |
查看 bonding 信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
root@ubuntu-5:/$cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v5.15.0-94-generic Bonding Mode: IEEE 802.3ad Dynamic link aggregation Transmit Hash Policy: layer2 (0) MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Peer Notification Delay (ms): 0 802.3ad info LACP active: on LACP rate: slow Min links: 0 Aggregator selection policy (ad_select): stable System priority: 65535 System MAC address: 52:51:0e:de:05:04 Active Aggregator Info: Aggregator ID: 1 Number of ports: 2 Actor Key: 5 Partner Key: 22 Partner Mac Address: aa:bb:cc:80:01:00 ... |
可以看到默认的模式是 active
. 即 Linux 总是尝试与对面进行 LACP 协商。这样的话,我们在交换机侧配置成 active 或者 passive 都是可以的。
交换机配置很简单,我们直接对这两个端口配置成一个 channel-group,模式是 active 或者 passive。
1 2 |
interface range e0/0-1 channel-group 22 mode active |
现在线路已经完成链路聚合了,我们抓包可以看到,两端都在定期发送 LACPDU,结构长这样子:
除了 LACP,还有一个协议支持自动协商链路聚合:PAgP(Port Aggregation Protocol)。这个是思科的专有协议。思科设计很多优秀的协议,很多开放网络协议就是参考了思科的协议而设计的。PAgP 在 1990s 就出现了,LACP 在 2000 才标准化。但是,像链路聚合这种事情,很多场景是运行在多个厂商的设备之间,私有协议很难普及。如今大部分几乎见不到 PAgP 了,思科设备之间运行的一般也是 LACP。
802.3ad 模式近乎完美,数据中心使用的 bonding 模式基本上都是 802.3ad 模式了。我们花了这么篇幅介绍了没有在使用的方案,好像是研究了一些没有用的东西,其实不是。后面我们在介绍 VRRP,HSRP 等更高级的内容的时候,读者会发现,原理还是 ARP,MAC 地址表这些东西,所以这个系列的内容是由简入难,对后面的内容理解是有帮助的。另外,像 MikroTik 这种基于 Linux 的路由器,其内置的链路聚合就是 Linux 的 bonding,所以配置这个路由器就是配置我们熟悉的 bonding,有时候可以灵活运用这些 bonding 模式。
到本文我们有能够自动协商的链路聚合,但是距离「完美」还差一步。我们发现,现在在服务器这儿是高可用了,但无论是链路聚合,还是 LACP 自动协商的链路聚合,都有一个限制——就是两条线必须连接到相同的交换机,这样一来交换机就成了一个单点。在没有链路聚合之前,我们的 bonding 方案 (active-backup, balance-tlb, balance-tlb) 还支持插到多个交换机上呢!需要交换机使用链路聚合的 bonding 模式 (balance-xor, balance-rr, 802.3ad) 只能接到一台交换机上。下篇文章我们来讨论如何解决交换机的单点问题。
Until next time!
参考资料:
- Load Balancing Algorithms, 1998
- Link Aggregation Control Protocol – Update, Tony Jeffre, 1998
- Understanding the Link Aggregation Control Protocol (LACP)
数据中心网络高可用技术系列
- 数据中心网络高可用技术:序
- 数据中心网络高可用技术之从服务器到交换机:active-backup
- 数据中心网络高可用技术之从服务器到交换机:balance-tlb 和 balance-alb
- 数据中心网络高可用技术之从服务器到交换机:链路聚合 (balance-xor, balance-rr, broadcast)
- 数据中心网络高可用技术之从服务器到交换机:802.3 ad
- 数据中心网络高可用技术之从交换机到交换机:MLAG, 堆叠技术
- 数据中心网络高可用技术之从服务器到网关:VRRP
期待啊,毕竟在IDC时代,睡不着觉多是因为怕交换机掉链子
下一期会在交换机上做高可用,就可以睡好觉了。
总算讲到 LACP 和双 TOR 了,太不容易了
哈哈哈,我也没想到光 bond 会啰嗦这么多。
Pingback: 数据中心网络高可用技术之从交换机到交换机:MLAG, 堆叠技术 | 卡瓦邦噶!
大佬 请教一个lacp问题 有一台主机组了lacp bonding后连接到了一个傻瓜交换机,并且只有一个成员口接线。proc下唯一接线的成员口状态actor churn state为none. peer churn state为churned。这种是主机侧协商成功了吗 此时是能正常发包的吗?感谢大佬(因为没有物理设备权限,所以没有自己验证)
应该不是吧。首先只有一个成员扣接线,那么无论有没有 bonding 都是一样的,只有一根线而已。其次对面是傻瓜交换机,不会发送 LACPDU,不可能协商成功的。收发包应该是正常的,当作没有 LACP 来用。
感谢大佬 最近的系列对我帮助很大 催更!
好的,很高兴对你有帮助!拿起键盘再写一篇。