All Nexthop Lead to Destination – ECMP


OpenStack新版本Xena发布,Neutron也开放了新的网络特性ECMP。借此机会,我们将在本文中讨论讨论ECMP在网络使用中的作用及在Neutron中的实现。


一、啥是ECMP(Equal cost multi path)


技术周|条条大路通罗马- ECMP


网络环境中,条条大路通罗马。网络的起点和终点之间往往存在多条可行的路径。面对多条可行路径,小孩子才做选择题,成年的路由器则是全都要。这里全都要的方式就是通过ECMP。ECMP(等价多路径路由),即存在多条到达同一个目的地址的相等开销的路径。当设备支持等价路由时,发往该目的IP 或者目的网段的三层转发流量就可以通过不同的路径分担,实现网络链路的负载均衡,并在链路出现故障时,实现快速切换。当一帧帧报文来到路由器,站到了“人生”的十字路口,无论选择向左走还是选择向右走,它们终将在目标处相逢。

ECMP被多种路由协议支持,例如:OSPF、ISIS、EIGRP、BGP等。ECMP的常见路径选择策略也有如下几种:IP哈希,IP取模,平衡轮巡,带权轮询。在数据中心最为常见的Spine-Leaf架构的网络中,起点LEAF与终点LEAF通常经过ECMP将流量均衡至多个Spine交换机之上。


二、OpenStack中的ECMP


1、Neutron中ECMP的用途



目前,Neutron中的ECMP功能主要被设计用于支持Octavia下的“多主模式”。Octavia中用于执行负载均衡的多个amphora同时使用相同的VIP,通过在虚拟路由器下配置ECMP,针对该VIP的访问请求能被分发至多个active的amphora虚拟机。即多次负载均衡。第一次为路由器执行的ECMP负载均衡;第二次为amphora中LVS或haproxy执行的负载均衡。


2、Neutron中ECMP的实现



Neutron server 暴露了如下所示的一条API。通过调用该API实现对指定虚拟路由器的ECMP设置。

openstack router add route

–route destination=192.168.1.111/32,gateway=192.168.1.10

–route destination=192.168.1.111/32,gateway=192.168.1.20

–route destination=192.168.1.111/32,gateway=192.168.1.30 router-ecmp


Neutron L3 agent 则根据API下达的设置,通过下述命令,执行对虚拟路由器对应namespace的配置下发。

ip.route(‘replace’, dst='<destination_ip>’,multipath=[{“gateway”:”<nexthop1>”},{“gateway”:”<nexthop2>”},,{“gateway”:”<nexthop3>”}])


配合Octavia,最终实现的效果如下图所示。
 

技术周|条条大路通罗马- ECMP


3、当前使用方式存在的缺陷



当前的ECMP仍然需要基于报文的五元组的哈希。这意味着当其中某个“下一跳”失效,或从ECMP路由列表中移除时,所有的连接将被重新分布,进而导致TCP会话断开,发生雪崩现象。为了避免这样的缺陷,可以采用一致性哈希的方案,仅将故障链路的流量重新HASH到其他正常链路上,而非故障链路上的数据流则无需改变下一跳。
 

技术周|条条大路通罗马- ECMP


三、ECMP面临的一些问题


任何一项技术都是优点与缺点的统一。我们在享受ECMP带来的多路径负载均衡与链路备份同时,也不得不面对随之而来的一些问题。下面就列举ECMP使用过程中会对网络带来负面影响的数个缺陷。

1、不区分流类型,负载均衡效果不佳



ECMP的使用中,针对流量的负载均衡通常是基于流的形式,通常情况下单独的一条网络流的所有报文固定于运行于拓补中的一条固定网络路径流通。这种特性使得ECMP对流量大小比较均衡的网络环境拥有较好的负载均衡效果。而当网络如下图所示“大象流”与“老鼠流”明显时,基于流的ECMP并不能合理地将流量均衡至多个网络链路中。(相较于本文描述的逐流形式的ECMP,也存在逐包形式的ECMP。逐包可以提高ECMP的带宽利用率,使等价多路径路由分担更均匀,但存在数据包乱序的问题,需要确保流量接收的设备或终端支持报文乱序组包的功能。

技术周|条条大路通罗马- ECMP


2、对称网络下效果不理想



ECMP不感知全网拓补。如下图所示,运行ECMP的交换机A均匀的将流量分发给交换机B与交换C。然而由于交换机B与目标交换机F之间也存在多条链路,实际交换机B相较于交换机C可以承载更多的流量。交换机A均匀将流量分发至交换机BC上并未实现整网流量的最佳平衡状态。(基于端口权重的ECMP轮询方式可以缓解该问题)
 

技术周|条条大路通罗马- ECMP


3、拥塞无感,加重重载链路负担



与上一条缺陷类似,ECMP也不感知链路本身的负载状态。网络的复杂性导致实际网络链路的负载并不均衡。与路由器B相比,当路由器C工作负载较重,与路由器A链路带宽压力较大时,路由器A的ECMP仍然会将流量负载至B、C两条路径之上,全然不顾路径C已不堪重负。
 

技术周|条条大路通罗马- ECMP


4、部分设备对网络分片不友好



一些网络设备针对分片报文并不能顺利的进行ECMP相关的处理(华为6810)。


四、UCMP(Unequal cost multiple path)


既然存在等价多路径,必然存在非等价多路径。
 

技术周|条条大路通罗马- ECMP


根据前文描述的ECMP的部分缺陷,在等价链路上平均分配流量,就容易引起低速链路流量阻塞以及高速链路的带宽不能得到有效利用的问题。为了解决这个问题,用户可以在接口上配置非等价负载分担功能,这样等价链路可根据带宽不同而分担不同比例的流量,使负载分担更合理。例如,路由器两个出口,两路径,一个带宽是100M,一个是10M,如果部署是UCMP,则网络总带宽能达到100M+10M(任意比例) 的利用率,同样情况下使用ECMP,很有可能网络仅仅只能实现10M+10M的利用率。

关于九州云:
九州云成立于2012年,是中国早期从事开放云边基础架构服务的专业公司。公司成立九年,始终秉承“开源·赋能云边变革”的理念,完成了从中心云到边缘云解决方案的拓展和积累,建立了完整的“云+边”生态体系和解决方案。九州云已先后为运营商、政府、金融、能源、制造业、商业、交通、物流、教育、医疗等各大行业的企业级客户提供了高质量的开放云边基础架构服务。目前拥有中国移动、中国电信、中国联通、国家电网、南方电网广东公司、中国人民银行、中国银联、中国人寿、中国资源卫星、eBay、国际陆港集团、万达信息、东风汽车、爱立信等众多重量级客户。

技术周|条条大路通罗马- ECMP