MC-LAG/VLAG在SONiC中的实现
什么是MC-LAG?
MC-LAG(Multi Chassis Link Aggregation Group,跨设备链路聚合组)是一种实现跨设备链路聚合的机制,通过将一台设备与另外两台设备进行跨设备链路聚合,保留了普通链路聚合的所有优点,同时提供了设备级别的冗余。
MC-LAG提供了一种横向虚拟化技术,将两台物理设备虚拟成单台逻辑设备,这台虚拟出来的“单个设备”与其相连的上行或下行设备实现“一对一”链路聚合。
图1 物理拓扑与逻辑视图[/caption]
如图1所示,MC-LAG组对外表现为一台逻辑设备,用于链路聚合;MC-LAG交换机组内部署Ethernet或LAG类型的peer-link用于MC-LAG之间协议信息交互,以及承担故障场景下的东西向流量。MC-LAG组对外表现为单一节点,相对于传统组网,在实现冗余备份时不会带来环路风险,同时链路聚合的负载均衡模式不会导致链路闲置,链路利用更加高效。
VLAG(Virtual Link Aggregation Group,虚拟链路聚合组)是一种在MC-LAG基础上发展而来的技术,其控制面逻辑与MC-LAG完全相同,区别在于VLAG设备组之间搭建VXLAN隧道,以该VXLAN隧道作为peer-link,摆脱了MC-LAG中需要在成员设备之间预留专门物理链路的限制。
如图2所示,Server端通过MC-LAG机制与另外两台设备S1、S2进行跨设备链路聚合。
图2 MC-LAG基本拓扑[/caption]
MC-LAG/VLAG的控制面
控制协议ICCP
SONiC在MC-LAG控制面采用轻量级的ICCP协议,在保障功能的前提下,只进行少量的一致性检测和信息同步。
ICCP(Inter-Chassis Communication Protocol,设备间交流协议),是在RFC7275中定义的标准协议。ICCP协议使用TCP端口8888在MC-LAG peer间建立连接,轻量级的ICCP协议会进行配置一致性检查、ARP表项和MAC表项同步。
ICCPD容器
在SONiC中容器ICCPD用来维护MC-LAG的控制层,ICCPD容器与其他模块的关联如图3所示。
- 容器ICCPD启动后,运行iccpd,mclagmgrd,mclagsyncd守护进程。iccpd为协议运行主进程,mclagsyncd通过TCP socket与iccpd进程交互信息;mclagmgrd通过调用iccpd提供的mclagdctl命令与iccpd进程进行交互。
- ICCPD容器启动时从CONFIG_DB中读取MC-LAG配置表项,mclagmgrd监听CONFIG_DB中MC-LAG配置表项变化。
- mclagsyncd监听ASIC DB中FDB表项变化信息,通知给iccpd进程。
- iccpd通过使用netlink消息与内核交互。当触发RTM_NEWLINK或RTM_DELLINK消息时,则更新端口所在vlan的信息;当触发RTM_NEWNEIGH或RTM_DELNEIGH,则更新本地ARP表项;当触发RTM_NEWADDR时,则更新本地MAC地址信息。另一方面,iccpd发送netlink消息来修改内核层端口的mac地址以及写入ARP表项。
- mclagsyncd从iccpd进程接收协议处理结果,修改APP_DB中相关表项。如APP_FDB_TABLE下发MAC表项,APP_ISOLATION_GROUP_TABLE添加隔离信息,APP_PORT_TABLE或APP_LAG_TABLE或APP_VXLAN_TUNNEL_TABLE写入端口mac学习属性。
- Orchagent订阅APP DB,之后的处理不再是ICCPD关心的范畴。
邻居建立
MC-LAG peer两台设备以local_ip和peer_ip为TCP连接的源地址和目的地址建立ICCP邻居。
MC-LAG peer两台设备分别承担Active和Standby角色。根据配置信息中的local_ip和peer_ip数字的大小比较,数字较小者作为Active端,TCP连接的Client端;数字较大者作为Standby端,TCP连接的Server端,Client端会主动向server发起连接请求。
当ICCP连接建立完成之后,MC-LAG peer根据peer-link的端口类型,修改APP_DB中的APP_PORT_TABLE或APP_LAG_TABLE或APP_VXLAN_TUNNEL_TABLE表项,关闭peer-link的mac学习功能。
MC-LAG peer的Active,Standby角色仅为控制层面的概念,在数据转发面,MC-LAG peer各自决定流量转发路径,地位相同。
ICCP信息同步
在MC-LAG peer之间会同步以下信息:
- 系统信息:同步MC-LAG成员端口的MAC地址,保证MC-LAG peer向Server发送的LACP报文中“system ID”域相同,实现跨设备链路聚合。具体做法是当Standby端收到Active端的system MAC信息后,发送netlink消息,将本地MC-LAG成员端口的system ID修改为和Active端一致。
- MC-LAG成员端口配置信息:记录本地和对端MC-LAG成员端口的名称等信息,用来做一致性检查。
- MC-LAG成员端口状态信息:记录本地和对端MC-LAG成员端口状态,保证无故障情况下peer-link到MC-LAG成员端口的隔离,对端MC-LAG成员端口故障情况下peer-link到同名端口的隔离解除。隔离是向APP_DB中配置表项,隔离解除删除该表项。
- ARP信息:与MC-LAG成员端口相关的ARP表项会在MC-LAG peer之间进行同步。当收到对端的ARP消息之后,通过发送netlink消息在本地更新ARP表项。
- FDB信息:与MC-LAG成员端口相关的FDB表项会在MC-LAG peer之间进行同步。当收到对端的FDB消息之后,通过修改APP_DB中表项,更新本地FDB表项。
- 心跳检测
在SONiC中,以1s为时间间隔向对端发送心跳报文,在连续15个周期没收到心跳报文时,则被判定为超时,ICCP连接断开。
一致性检测
SONiC使用轻量级ICCP协议进行以下属性的一致性检测:MC-LAG peer关于local_ip,peer_ip的配置对称;MC-LAG成员端口配置相同:名称、数量、加入的VLAN,VLAN的路由口IP,VLAN的路由口MAC地址;MC-LAG peer中peer-link的端口类型保持一致。
典型组网
MC-LAG中典型组网及配置如图4所示。
图4 MC-LAG典型组网[/caption]
MC-LAG/VLAG场景下流量转发的配置
以图5配置为例,介绍一下配置VLAG场景下的二层流量转发情况。
无故障流量转发
在无故障情况下,Server1与Server2之间的流量转发路径如图6中橙色曲线所示。
图6 无故障流量转发
- Server1上的广播流量通过PortChannel0001选路到达S1,在Vlan300中广播,复制到PortChannel0310到达Server2,复制到VTTNL1隧道封装经undelay网络到达S2。由于在S2上开启VTTNL1到PortChannel0310和PortChannel0300的转发隔离,广播报文不会回环到Server1,也不会第二次到达Server2。同时,由于VTTNL1的MAC学习功能被关闭,S2上关于Server1的FDB表项不会迁移到VTTNL1。
- Server1往Server2的单播流量通过PortChannel0001选路到达S1,在S1上查询FDB表项单播到达Server2。由于S1与S2的FDB表项同步,若选路到S2,也可查询FDB表项单播到达S2。
链路故障场景
当链路发生故障时,Server1与Server2之间的流量转发如图7所示。
图7 链路故障流量转发
- S1上的PortChannel0310状态切换为down,Server2与S1之间的通信发生故障,S1和Server2直接感知该故障。
- Server2向Server1方向的广播和单播流量均直接通过S2进行转发。
- Server1向Server2方向的广播流量,当经过S2转发,则直接广播到达Server2;当经过S1时,广播复制到VTTNL1上,隧道封装经underlay网络到达S2后解封装,由于S2上已解除VTTNL1到PortChannel0310的单向隔离,则可在S2上广播复制到Server2。
- Server1向Server2方向的已知单播流量,当经过S2转发,则直接单播到达Server2;当经过S1时,由于S1上已将出接口为PortChannel0310的FDB表项重定向到VTTNL1上,则单播流量会经过VTTNL1隧道到达S2。由于S2上已解除VTTNL1到PortChannel0310的单向隔离,隧道报文解封装查询FDB表项经PortChannel0310单播转发到Server2。
设备故障场景
当MC-LAG组内成员设备发生故障时,Server1和Server2之间的流量转发如图8所示:
图8 设备故障流量转发
- 如图8所示,S1设备发生故障,Server1和Server2之间ICCP连接断开。
- Server1和Server2均感知S1故障。Server1和Server2之间的流量均由S2承担,如图8橙色曲线所示。