4. 链路聚合(EtherChannel)深度配置:LACP与PAgP协议对比、负载均衡算法选择与调优、跨设备链路聚合(vPC/M-LAG)配置与高可用性设计

链路聚合,说白了就是把多条物理链路捆成一条逻辑链路。你想想看,一根千兆网线带宽不够,两根呢?三根呢?但直接插上去不配置,STP 会帮你堵住冗余链路,反而更慢。EtherChannel 就是解决这个问题的。

我刚开始接触这个技术时,总觉得不就是把线插上、配个组嘛。直到有一次在数据中心割接,因为负载均衡算法选错了,导致一条链路跑满、其他链路闲置,业务直接告警。嗯,从那以后我再也不敢小看这个配置了。

4.1 LACP 与 PAgP:两种协议,两种哲学

链路聚合有两种协商协议:LACP(IEEE 802.3ad)和 PAgP(Cisco 私有)。我个人习惯,只要不是纯 Cisco 老环境,一律用 LACP。为什么?

特性 LACP PAgP
标准 IEEE 802.3ad(开放) Cisco 私有
跨厂商兼容 支持 仅 Cisco
最大链路数 16(8 活动 + 8 备份) 8(全部活动)
模式 Active / Passive Desirable / Auto
检测机制 LACPDU 每 1 秒(快)/ 30 秒(慢) PAgP PDU 每 1 秒

核心建议:新项目一律使用 LACP Active 模式。PAgP 只用于遗留 Cisco 设备对接,且必须两端都是 Cisco。

配置上其实不复杂。LACP 两端模式必须匹配:一端 Active,另一端可以是 Active 或 Passive。PAgP 也一样,Desirable 对 Desirable 或 Auto。

# LACP 配置示例(Cisco IOS)
interface Port-channel1
 no switchport
 ip address 10.1.1.1 255.255.255.0
!
interface GigabitEthernet1/0/1
 channel-group 1 mode active
!
interface GigabitEthernet1/0/2
 channel-group 1 mode active

个人经验:我曾经遇到过一个坑——两端都配了 LACP,但一端是 Active,另一端是 Passive,结果协商失败。检查了半天才发现是模式不匹配。记住:Active 对 Active 最稳,Active 对 Passive 也行,但 Passive 对 Passive 绝对不行。

4.2 负载均衡算法:选错了,聚合等于白配

很多人以为链路聚合配好就完事了。其实不然。负载均衡算法决定了流量怎么分配到各条链路上。选错了,你会发现一条链路跑满,其他链路在「摸鱼」。

EtherChannel 的负载均衡是基于流的,不是基于包的。它通过哈希计算,把属于同一个流的报文固定到同一条链路上。这样能保证报文不乱序。

常见的哈希因子有这些:

  • 源 MAC:适合二层交换环境,流量均匀度一般
  • 目的 MAC:适合服务器到网关的场景
  • 源 + 目的 MAC:二层最常用,均匀度较好
  • 源 IP:适合三层路由环境
  • 目的 IP:适合访问单一服务器集群
  • 源 + 目的 IP:三层最推荐,均匀度最高
  • 源 + 目的 IP + 端口:四层负载均衡,最精细

避坑指南:我曾经在一个数据中心项目中,所有流量都经过一对核心交换机做 EtherChannel。默认算法是源 MAC,结果因为所有服务器的 MAC 都集中在同一块板卡上,哈希结果严重倾斜。改成源 + 目的 IP 后,链路利用率从 90%/10% 变成了 45%/55%。

查看当前负载均衡算法:

# 查看 EtherChannel 负载均衡算法
Switch# show etherchannel load-balance
EtherChannel Load-Balancing Configuration:
        src-dst-ip

# 查看每条链路的流量分布
Switch# show etherchannel port-channel
Port-channel1 (Primary Aggregator)
        Age of the Port-channel   = 0d:00h:05m:32s
        Logical slot/port   = 1/1          Number of ports = 2
        HotStandBy port = null
        Port state          = Port-channel Ag-Inuse
        Protocol            = LACP
        Ports in the Port-channel:

Index   Port        Oper-State   Load
0       Gi1/0/1     up           0x55
1       Gi1/0/2     up           0xAB

Load 值 0x55 和 0xAB 表示哈希分布。如果两个值差距很大,说明算法需要调整。

调优建议:如果流量模型是南北向(客户端到服务器),用 src-dst-ip;如果是东西向(服务器之间),用 src-dst-mac 或 src-dst-ip。端口级哈希(src-dst-port)虽然最均匀,但会消耗更多硬件资源,老设备可能不支持。

4.3 跨设备链路聚合:vPC 与 M-LAG

单台交换机做 EtherChannel,一旦设备挂了,聚合也就断了。跨设备链路聚合就是为了解决这个问题——让两台设备看起来像一台,共同提供链路聚合。

Cisco 叫 vPC(Virtual Port Channel),华为叫 M-LAG(Multi-Chassis Link Aggregation),其他厂商各有各的叫法。原理大同小异。

4.3.1 vPC 核心组件

  • vPC Domain:两台设备组成一个域,必须有相同的 domain ID
  • vPC Keepalive:通过独立链路(通常是管理口)检测对端存活
  • vPC Peer-Link:两台设备之间的数据同步链路,通常用 40GE/100GE
  • vPC Member Port:连接到下游设备的物理端口
vPC 架构示意图 Switch A vPC Primary Switch B vPC Secondary Peer-Link (40GE/100GE) Keepalive (管理口) 下游交换机/服务器 说明: vPC 让两台交换机共享同一个 Port-Channel 接口,下游设备只需做普通 EtherChannel 配置。

4.3.2 vPC 配置要点

! 配置 vPC Domain(Switch A)
vpc domain 100
 role priority 1000    ! 数值小为主设备
 system-priority 32667
!
! 配置 Keepalive 链路
interface mgmt0
 vpc peer-link keepalive destination 10.0.0.2 source 10.0.0.1
!
! 配置 Peer-Link
interface port-channel10
 switchport mode trunk
 vpc peer-link
!
! 配置 vPC Member Port
interface port-channel20
 switchport mode trunk
 vpc 20
!
interface Ethernet1/1
 channel-group 20 mode active
!
interface Ethernet1/2
 channel-group 20 mode active

重要提醒:Peer-Link 必须使用独立端口通道,不能与业务流量复用。我曾经见过一个案例,Peer-Link 带宽不够,导致 vPC 域分裂,两台设备都认为自己是主设备,结果广播风暴直接打垮了整个网络。

4.3.3 vPC 高可用性设计

vPC 的高可用性体现在几个层面:

  • 设备级:一台交换机故障,另一台接管所有流量
  • 链路级:Peer-Link 断了,Keepalive 还在,设备不会分裂
  • 转发级:vPC 成员链路故障,流量自动切换到其他链路

最佳实践:

  • Keepalive 使用独立 VRF 或管理口,避免与业务网络混用
  • Peer-Link 至少配置 2 条物理链路做 EtherChannel
  • vPC member port 分布在不同的线卡上,避免单点故障
  • 开启 vPC ARP 同步,减少故障切换时的 ARP 学习时间

4.4 故障排查:遇到问题怎么办?

链路聚合的故障,我总结下来就三类:协商失败、负载不均、vPC 分裂。

协商失败排查步骤:

  1. 检查两端协议模式是否匹配(Active/Active 或 Active/Passive)
  2. 检查物理链路状态(show interface status)
  3. 检查 VLAN 允许列表是否一致(show interface trunk)
  4. 检查两端速率和双工是否一致

负载不均排查:

  1. 用 show etherchannel load-balance 查看当前算法
  2. 用 show etherchannel port-channel 查看 Load 值分布
  3. 根据流量模型调整哈希因子

vPC 分裂排查:

  1. 检查 Keepalive 是否可达(ping 对端管理口)
  2. 检查 Peer-Link 状态(show vpc peer-link)
  3. 检查 vPC 一致性(show vpc consistency-parameters)

我的习惯:每次做完 vPC 配置,我都会用 show vpc brief 确认两台设备状态都是「up」,然后用 show vpc consistency-parameters global 检查全局参数是否一致。这一步能避免 90% 的潜在问题。

链路聚合看起来简单,但真正用好它,需要对协议、算法和架构都有深入理解。嗯,希望这些经验能帮你少走一些弯路。