1. LACP 到底是什么,为什么网络工程师绕不开它
做网络这行,时间久了你会发现一个尴尬的现实:单条链路永远不够用。不管你是接服务器、接核心交换机,还是做出口设备的HA,总会碰到带宽打满、链路单点故障这种让人头疼的问题。加带宽吧,换万兆光模块、换光缆,钱花了一大把;不加吧,业务高峰期卡顿、丢包,老板和业务部门的投诉电话一个接一个。
我最早被LACP“教育”是在一次机房迁移的深夜——两台接入交换机做堆叠,上联核心的两条万兆光缆因为误插到了同一个静态聚合组里,结果不仅没有实现带宽叠加,反而因为Hash算法和硬件表项冲突导致部分流量直接不通。当时被我师傅骂了一顿,然后他把我拉到一边,丢给我一句话:“你以后做链路捆绑,能走LACP就别手搓静态聚合,协议帮你做的事比你想象的多得多。”
LACP全称是Link Aggregation Control Protocol,也就是链路聚合控制协议。它属于IEEE 802.3ad标准的一部分(后来并入了IEEE 802.1AX),核心作用就两个字:协商。它通过设备之间互相发送LACPDU报文,来自动决定哪几条物理链路可以捆绑成一个逻辑链路,从而增加带宽、提高可靠性。相比手工静态聚合,LACP最大的价值在于:链路状态发生变化时,协议能自动感知、自动收敛,不需要人为干预。
这篇文章就是把我这些年碰到的LACP相关问题、踩过的坑和排查思路整理出来。不管你是刚入行的新人,还是在机房摸爬滚打多年的老油条,只要你的环境里涉及交换机互联、服务器双网卡绑定、防火墙双机热备,这篇文章都会对你有用。我会尽量把原理讲得接地气,把配置步骤拆到可以直接抄作业的程度。
2. 链路聚合的核心机制,弄懂这几个点才算真入门
2.1 LACPDU和协商过程,协议在底层做了什么
LACP之所以叫“控制协议”,核心在于它有专门的协商报文,叫LACPDU(Link Aggregation Control Protocol Data Unit)。这个报文默认是组播发送的,目的MAC地址是固定的01:80:C2:00:00:02,发送周期有两种模式:慢速模式每30秒发一次,快速模式每1秒发一次。
协商的大致过程是这样的:交换机端口启用LACP后,端口会进入“主动协商”状态,向对端发送LACPDU。对端收到报文后,会把自己的系统优先级、系统MAC、端口优先级、端口号、操作Key等信息回传给发送方。双方都收到对方的参数后,会各自计算哪些端口可以聚合成一个LAG(Link Aggregation Group)。
这里有个非常关键的细节:LACP协商不是一次性的,而是一个持续过程。只要聚合组里有端口状态变化,比如某条链路down了、某个端口被拔掉了,LACP会立刻通过LACPDU把这个变化同步给对端,然后双方重新计算聚合成员。这也是LACP比静态聚合安全的核心原因——协议在持续看护成员链路的状态。
2.2 Actor和Partner,LACP状态机里的两个角色
很多人看LACP的调试信息看不懂,就是因为没理解Actor和Partner这套概念。简单说,任何一个LACP端口在逻辑上都有两个角色:
- Actor(本方):本设备自己在该端口上的LACP参数,包含本端系统优先级、系统MAC、端口优先级、端口号、操作Key等。
- Partner(对端):对端设备通过LACPDU报过来的参数,实际上是本端“看到的”对端信息。
当你在命令行敲show lacp internal和show lacp neighbor的时候,internal看的是Actor状态,neighbor看的就是Partner状态。两个角色的参数会进行一个比对:系统ID(优先级+MAC)小的优先,端口优先级小的优先,如果都一样再比端口号。这套比较规则决定了谁是聚合组的“权威”——哪台设备的参数被采纳,以及端口在聚合组里的顺序。
打个通俗的比方:Actor是你自己填的报名表,Partner是对面递过来的名片。两边先把名片换一换,然后按一套统一的规则排座次,谁坐前面谁坐后面一目了然。如果没有这套可比较的数值,两台设备各自说了算,聚合组就乱套了。
2.3 Key值、系统优先级、端口优先级,选主备到底靠什么
LACP协商里几个关键参数,我逐个拆开讲,这些都是考试爱考、工作必用的点。
系统优先级:默认是32768,取值范围0到65535,数值越小优先级越高。这个参数在主备设备协商中起着决定性作用。两台设备互联的时候,系统ID(优先级和MAC的组合)更小的一方会作为聚合的主动方,负责决定哪些端口加入聚合。如果两个系统的优先级相等,就继续比较系统MAC,MAC小的优先。这就是为什么两台设备配置完全一样也能顺利协商的原因——MAC是唯一的。
操作Key:这个参数是设备本地概念,用于标识一组端口具有相同的聚合能力。比如同样是千兆口、同样的双工模式、同样的速率,它们的Key就可能一样。只有Key值相同的端口才能被聚合在一起。不同速率、不同介质类型的端口Key不一样,所以LACP天然不会把千兆口和万兆口捆绑成一个聚合组,除非你做了特殊配置。
端口优先级:默认也是32768,数值越小越优先。当一个聚合组里现有成员物理能力足够,但出现了端口数量超过硬件限制或者物理链路不稳定的情况,端口优先级就派上用场了。LACP聚合组最大成员数通常是8个或16个(不同厂商有差异),当超过上限时,优先级高的端口被保留,优先级低的会被踢出聚合组。另外在配置LACP端口为standby(备份成员)时,这个参数也决定谁当备份。
2.4 慢速分发与快速分发,该用哪个模式
LACP有两种工作模式,实际部署时候需要想清楚再选:
慢速分发(Slow):LACPDU发送间隔30秒,超时时间90秒。好处是协议报文少,占用的带宽和控制面资源极小,适合物理链路质量好、不需要频繁感知故障的场景。缺点是链路故障感知速度慢,一台设备上聚合组某条链路挂了,最坏情况下要等90秒才被对端发现,业务受影响的时间比较长。
快速分发(Fast):LACPDU发送间隔1秒,超时时间3秒。链路状态感知速度快了一个数量级,适合对切换时间有要求的场景,比如服务器双网卡绑定、核心交换机之间的互联。代价是控制报文的频率高了30倍,但说实话LACPDU报文很小,即便1秒一次对设备CPU和带宽的占用也完全可以忽略。
我的习惯是:核心设备间互联用Fast模式,接入设备到终端设备(比如服务器)双方支持的话也用Fast。只有链路质量极好且不要求收敛速度的内网环境才会用Slow模式。很多初级工程师在配置交换机的时候只写了mode active就完事,没注意还应该配合lacp rate fast,导致故障出现后切换时间长达一分钟,业务早就超时了。
3. 从交换机到服务器,一套完整的LACP配置实操
3.1 配置前的准备工作和硬性要求
在做LACP配置之前,有几个前提条件必须满足,否则后面全是坑:
第一,参与聚合的端口速率和双工模式必须一致。哪怕有一端是千兆自适应、另一端强制千兆全双工,虽然协商能成功,但会造成带宽分配不均,甚至引起端口频繁up/down,这是LACP配置里最常见的“隐形炸弹”。
第二,所有成员端口必须属于同一VLAN或同为Trunk口。如果其中一个口是Access口,另一个是Trunk口,它们即便在配置层面被加到了同一个聚合组,数据转发也会出问题。我遇到过某同事把两个上联口一个配成Access VLAN 10,一个配成Trunk,导致对端交换机学不到MAC,全网广播风暴差点打挂核心。
第三,聚合组的成员端口上不能配置任何独占性功能,比如IP地址、DHCP Snooping信任口、端口安全、风暴控制里的单独限速等。这些功能要配置的话,应该配置到逻辑口(如Eth-Trunk、Port-Channel)上,而不是物理口上。否则LACP虽然可以协商成功,但数据面会按物理口各自的策略转发,与聚合组的逻辑冲突。
3.2 华为交换机配置实例(千万别漏了模式)
华为的设备上,LACP聚合口的逻辑接口叫Eth-Trunk。我以两台交换机堆叠后上联核心的典型场景为例:
# 逻辑口创建,这里要注意:华为V200R003之后版本的Eth-Trunk接口支持直接配置为LACP模式 interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 10 20 30 mode lacp-static # LACP静态模式,即主动协商模式 lacp preempt enable # 使能LACP抢占,恢复的链路可以重新加入聚合组 lacp preempt delay 10 # 抢占延迟10秒,防止链路震荡导致频繁切换 # 物理口加入聚合组 interface GigabitEthernet0/0/1 eth-trunk 1 interface GigabitEthernet0/0/2 eth-trunk 1注意,华为的LACP模式分两种:lacp-static和lacp-dynamic。lacp-static是静态LACP,需要双方都配置才能协商成功;lacp-dynamic是动态LACP,只要一方配置为active,另一方配置为passive也能协商。生产环境里我强烈建议两边都配置成lacp-static,因为这样角色明确、状态可控。lacp-dynamic常用于和一些老设备、非标设备对接,兼容性更好,但也更容易出现协商失败。
还有一点容易漏:华为交换机默认的LACP报文发送模式是Slow,如果想修改为Fast,需要在系统视图下配置:
lacp rate fast这个命令是全局生效的,设备上所有LACP聚合口都会变成1秒发送LACPDU。如果要单独针对某个接口配置,需要进入接口视图执行lacp rate fast。
3.3 思科交换机配置实例(Nexus和IOS略有差异)
思科设备上,LACP聚合口的逻辑接口叫Port-Channel。以传统的IOS交换机为例:
interface Port-channel1 switchport trunk encapsulation dot1q switchport mode trunk switchport trunk allowed vlan 10,20,30 interface GigabitEthernet0/1 channel-group 1 mode active interface GigabitEthernet0/2 channel-group 1 mode active关键的命令是channel-group 1 mode active。Cisco的LACP模式有三个:active(主动)、passive(被动)、on(强制/不协商)。on模式其实就是静态聚合,不走LACP协商,如果两端都是on也可以工作,但失去了协议感知能力。生产环境请务必用active模式。
Nexus系列的命令稍有不同,比如:
interface Ethernet1/1 channel-group 1 mode active interface Ethernet1/2 channel-group 1 mode active interface port-channel1 switchport mode trunkNexus还支持一种称为“vPC”的跨设备链路聚合方案,比传统的STP阻塞一端要优雅得多。但vPC本身不属于LACP的范畴,它是在LACP之上做了一个双活网关扩展,这里不展开。只说一点:如果交换机之间做vPC Peer-Link互联,建议用lacp mode active、lacp rate fast组合,同时把成员端口分散在两台设备上,后端服务器用双网卡分别接到两个不同设备上,这样任何一个单点故障都不影响业务。
3.4 Linux服务器双网卡bonding配置(mode=4就是LACP)
大部分互联网公司的服务器是Linux,双网卡绑定是最常见的LACP使用场景。Linux bonding驱动一共支持7种模式(mode 0到6),其中mode=4(802.3ad)就是动态链路聚合,需要交换机侧启用LACP才能协商成功。
我用CentOS/RHEL系的NetworkManager配置方式举个例子。首选在交换机上把接服务器的两个端口绑成LACP聚合组,然后在服务器上:
nmcli connection add type bond con-name bond0 ifname bond0 mode 802.3ad nmcli connection add type ethernet con-name bond0-port1 ifname eno1 master bond0 nmcli connection add type ethernet con-name bond0-port2 ifname eno2 master bond0 nmcli connection modify bond0 ipv4.addresses 192.168.1.10/24 nmcli connection modify bond0 ipv4.gateway 192.168.1.1 nmcli connection modify bond0 ipv4.method manual nmcli connection up bond0关键点在于mode 802.3ad,以及bond的xmit_hash_policy参数。这个参数决定了数据包在两条物理链路上怎么分配。常见的策略有三个:
- layer2:按MAC地址做Hash,同一对源目MAC的流量固定走同一条链路,配置最简单,但遇到一个大流量会话(比如视频传输)时只能跑一条链路。
- layer2+3:按MAC和IP地址做Hash,比layer2均匀一些,适合一般业务。
- layer3+4:按IP和端口做Hash,可以做到比较精细的负载分担,缺点是对某些特殊协议(如果包含分片报文)可能因为Hash不均导致重排,对性能反而有影响。
实际生产里,如果业务流量大多是TCP/UDP长连接,我建议设为layer3+4,可以让两条链路都跑起来。如果业务全是广播或组播为主,比如视频监控流,那么Hash策略影响不大,重点看组播是否走单条链路。
配置好bond后,在交换机上敲show lacp neighbor,正常情况下能看到对端(服务器)的两个端口都在聚合组里,状态是BNDL(Bundled)。如果在交换机上看到状态是DETACHED或WAIT,那就是协商失败,需要优先排查服务器bond配置和交换机LACP模式是否匹配。
3.5 一整套场景实战:交换机堆叠+服务器双网卡LACP
我把一个典型的小型数据中心接入场景串起来演示一下。需求是:两台服务器做业务双机热备,每台服务器配双千兆网卡,通过两台接入交换机(做堆叠)上联核心。核心要求带宽叠加和链路冗余。
交换机侧(堆叠环境下):
interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 100 200 mode lacp-static lacp preempt enable lacp preempt delay 15 # 把堆叠里不同成员交换机的端口加进同一聚合组 interface GigabitEthernet1/0/1 eth-trunk 1 interface GigabitEthernet2/0/1 eth-trunk 1服务器侧,CentOS系统bond配置:
# 编辑 /etc/sysconfig/network-scripts/ifcfg-bond0 BONDING_OPTS="mode=802.3ad miimon=100 xmit_hash_policy=layer3+4"这里有一个容易被忽略的点:如果交换机做了堆叠,服务器网卡ab两条线最好分别接到堆叠里的不同物理交换机上,这样才能真正避免单点故障。如果两台物理交换机不做堆叠而是独立运行,那么服务器双网卡接两台交换机就不叫LACP了,需要走M-LAG或者vPC这类跨设备链路聚合协议,否则交换机会因为环路而阻塞端口,这个问题我在后面的故障排查里会再讲。
4. 常见故障排查与避坑实录
4.1 链路聚合协商失败的排查步骤
LACP协商失败的场景特别多,我总结了一套我自己一直在用的排查顺序,循着这个顺序走,基本能定位90%的问题。
第一步,物理层排查。先看光纤模块收发光功率是否在正常范围,用display interface(华为)或show interface(思科)看物理口状态是否up。很多协商失败本质上是光路问题,LACP只是背了锅。物理口如果频繁up/down,LACPDU自然发不出去也收不回来,协商永远不会成功。
第二步,确认对端设备状态。用display lacp neighbor或show lacp neighbor看能否看到对端的Actor参数。如果能看到,说明LACPDU已经通了,问题大概率出在参数不匹配上;如果完全看不到,说明LACPDU在中间就断了,要查VLAN放行、光路、中间设备是否透传、端口模式。
第三步,对比两端参数。重点看系统优先级、系统MAC、端口优先级、操作Key是否匹配。华为的display eth-trunk 1 verbose会把actor和partner的详细参数列出来,思科用show etherchannel 1 detail。我在旁边见过太多人把两端配置成一样的IP、一样的VLAN,却忽略了操作Key不一致,导致LACP始终聚合不起来。
第四步,检查模式匹配。一端是active、另一端是passive没问题;两端都是active没问题;一端active、另一端on(静态聚合)无法协商;两端都是passive无法协商。很多入门者总以为“LACP是自动协商的,插上就能用”,忘记了主动侧和被动侧的模式搭配原则。
4.2 模式不匹配:最常见也是最难排查的坑
先给一个典型场景:交换机侧配置了mode active(主动),和一台老服务器网卡自带的LACP驱动对接。服务器网卡驱动默认的是被动模式,理论上能协商成功。但实际却协商不了,抓包发现LACPDU有发有收,状态机却一直停在WAIT状态。
后来查到这个服务器网卡驱动对LACP的实现有问题,它在收到对方LACPDU后,不会主动发送本端的Actor信息,除非驱动显式配置成active模式。这就是实现不标准造成的协商失败。这种问题光靠配置层面很难解决,最终方案是给服务器网卡驱动装上最新版补丁,或者在交换机上把这两个端口改成静态聚合(华为的mode lacp-static无法解决,需要改成手工聚合,即mode manual),绕开协商过程。
另外一个经常被忽视的模式坑是:同一台设备上多个物理端口组合成一个聚合组时,不能允许其中一部分端口是Trunk、另一部分是Access。很多配置工程师图省事,往Eth-Trunk里加新成员时直接把接口默认VLAN的模式带进去了,导致同一个聚合组内既有Trunk口又有Access口。这种状态LACP协商大概率能成功,但业务流量却会全部走不通,因为逻辑口的VLAN处理跟物理口的实际模式对不上。
4.3 误接线和环路风险:LACP聚合组的安全边界
LACP虽然能自动协商,但它只对已加入聚合组的端口进行控制,没法防止你把人家的线插错位置。最典型的事故是:两台核心交换机之间既要跑三层路由又要跑二层LACP互联,结果运维同学把其中一条互联光纤插到了错误的槽位上,导致对端的LACP聚合组里混入了一个不属于本聚合组的端口,于是一瞬间出现了环路。
这种故障的排查难点在于,LACP本身没有报错,聚合组状态也是正常的,但网络广播风暴起来了。后来我用华三设备的display link-aggregation verbose看聚合组成员时发现,其中一个端口的Partner MAC竟然和另外几个端口都不一样——它连的根本不是同一台对端设备。这就是LACP聚合组内端口与对端设备逐一对应的基本要求被打破了。
所以我要强烈建议:LACP聚合组里的每一个物理端口,必须是对端同一台设备的物理端口。如果两台设备之间的互联有多条链路要聚合,请确认每一根线都是插在两台设备正确的互联口上。再强调一遍,LACP无法防止逻辑上错误的物理连接,只能防止物理链路down掉后逻辑口无法感知。
4.4 和虚拟化平台相关的LACP连接问题
现在服务器虚拟化太普及了,虚拟机交换机和物理交换机的LACP对接问题也很多。VMware ESXi的标准交换机(vSwitch)和分布式交换机(vDS)都支持LACP,但有一个大坑:vDS的LACP只支持主动模式,并且需要ESXi 6.0及以上版本,同时需要在vCenter里配置LACP聚合组。如果你只配了物理交换机的LACP,没有在vDS侧配置,就会一直看到对端物理交换机上报partner不匹配。
另外,虚拟化平台的LACP和物理网卡驱动有很强的依赖关系。我遇到过一台戴尔服务器,iDRAC里把两个网口同时启用了PXE和iSCSI,结果Linux bond在引导阶段和交换机的LACP协商中断,导致服务器启动后IP地址无法配置。迁移在线业务的时候,这种问题折腾最久。排查手段是先用ethtool确认两个网口的物理速率和双工模式一致,再检查BIOS里网卡是否启用了类似“MAC地址随机化”或“NIC Teaming”的选项,禁用掉虚拟化层自带的网卡绑定功能,只保留LACP一层。
4.5 问题排查速查表
下面这张表是我日常干活时经常参照的,遇到问题先对号入座,能省下很多排查时间。
| 故障现象 | 可能原因 | 首选排查动作 |
|---|---|---|
| LACPDU收不到,协商不成功 | 光路断、VLAN未放行、中间防火墙拦截组播 | display lacp neighbor确认对端参数,检查光模块光功率 |
| 收到LACPDU但状态卡在WAIT | 模式不匹配、Key值不一致、对端实现不标准 | 对比actor和partner参数,检查两端模式 |
| 聚合组up但业务流量不通 | 端口模式(Access/Trunk)不一致、逻辑口VLAN配置错误 | 检查Eth-Trunk下的VLAN配置和成员口模式 |
| 聚合后流量总走一条链路 | Hash策略不合适、单会话大流量 | 调整xmit_hash_policy为layer3+4,确认对端Hash一致性 |
| 链路down后恢复慢 | LACPDU超时时间过长(Slow模式) | 全局启用lacp rate fast,将超时缩短到3秒 |
| 与虚拟机平台对接失败 | vDS LACP未配置或版本过老 | 升级ESXi到6.0+,在vDS设置启用LACP |
| 聚合组成员偶发被踢出 | 端口优先级冲突、物理链路不稳定 | 检查端口up/down记录,调整端口优先级或更换光模块 |
4.6 经验总结:几个我从坑里爬出来的细节
最后聊几个不是文档里会写、但实战中一定会碰到的细节。
第一个是LACP和STP的配合问题。聚合组在初始协商的瞬间,STP是感知不到端口已经聚合的。如果交换机配置了RSTP或MSTP,在LACP尚未完成协商前,物理口可能会被STP置于Blocking状态,导致LACPDU发不出去。遇到聚合组一段时间后自动恢复、但刚插线时协商失败的情况,可以先检查STP状态。
第二个是交换机上LACP成员端口和硬件表项的关系。聚合组成员数量超过硬件支持上限时,底层芯片可能只在部分成员口上建立哈希表项,剩下的成员口虽然LACP状态是BNDL,但实际不走流量。所以别只看协议状态,要测一下流量是不是真的在两三条链路上都平均分布。用display load-sharing(华为)或show etherchannel load-balance(思科)可以确认实际负载分担的情况。
第三个是协商成功后改变成员端口优先级。比如想人为指定某条链路作为主链路、其他链路作为备份,可以通过调低主链路的端口优先级来实现。但是注意,修改了优先级后,如果不对聚合组执行一次shutdown/undo shutdown,新规则不一定立即生效。这种时候别傻等,手动重启一下成员端口最直接。
第四个是关于LACP的抢占功能。华为设备默认lacp preempt disable,意思是当主链路恢复后,不会主动抢回原主链路的位置。如果你希望恢复的链路立刻回到主用状态,需要显式配置lacp preempt enable。但这里牵涉到一个工程判断:如果主链路物理状态不稳定,经常up/down,配置抢占反而会引发频繁切换,影响业务。所以抢占功能不是越多越好,要根据你的物理链路质量来定。
5. 最后再分享一个小技巧
说实话,LACP不是新协议,也不是什么高深技术,但它就是能让你在网络出问题的时候少挨几次骂。我把踩过这么多坑之后最重要的三个经验放在这里,当是个人心得也好,当是给后来者的提醒也好:
第一,配置LACP之前永远先看物理层。光路不行、模块老化、网卡驱动版本太旧,这些问题不是LACP能解决的,但LACP会第一个背锅。
第二,无论设备多高端、协议多自动化,上线前一定要做一次成员端口拔插测试。把聚合组里的物理链路一根根拔掉再插回,确认交换机状态和服务器网卡都能快速收敛。这个操作花不了十分钟,但能把潜在的单点故障暴露在业务割接之前。
第三,团队协作时,把两端的LACP参数整理成一张表格再配置,系统优先级、端口优先级、模式、超时时间、Hash策略全部列清楚。我在每一次割接前都会这样做,这张表不只是配置依据,更是后续故障排查时的第一手参考。
如果你在配置LACP的过程中也遇到过什么匪夷所思的问题,欢迎一起交流。网络这个行当,越往深处走,越会发现“协议搞定一切”是个错觉,能够把协议用对、用好、用出经验来,才是真正的本事。