01
项目背景
云联网(Cloud Connect Network)为用户提供一种能够快速构建跨地域VPC之间以及云上多VPC与云下多数据中心之间的高速、优质、稳定的网络能力,帮助用户打造一张具有企业级规模和通信能力的全球云上网络。通过创建云连接,将用户需要实现互通的不同地域的网络实例加载到云连接实例中,就可以快速的为用户提供全球网络互通服务,这里的网络实例可以是用户自己创建的VPC实例也可以是本地数据中心的IP资源。
02
CCN V1版本优化简述
随着公司内业务不断上云,VPC间访问需求也随之增加,云联网网关不仅承担跨地域的流量,同时也会承载同地域VPC间的东西流量,网关的压力。之前在云联网优化v1版本中将云联网中报文的转发由每个报文转发处理改为session模式处理,极大提高了云联网转发性能。但是转发性能提高的同时也引入了一些新的问题。
03
现有问题
3.1 云联网架构描述
云联网网关由控制面和转发面组成,控制面对外提供API,供业务创建ccsi规则来打通vpc之间/idc与vpc之间的访问。转发面基于DPDK框架,通过加载ccsi转发规则,完成数据包的策略匹配,最终通过VXLAN封装数据包后,发送至正确的节点。其中包含几个基础概念,CCSI(一个云联网实例,子网路由挂载在实例下)、ROUTE-子网路由(需要打通的vpc或idc网段)、下一跳(云联网网关封VXLAN包的外层源ip)。
图1 云联网架构图
3.2 优化v1版本云联网优化方案
图2 云联网v1优化方案
3.3 优化v1版本CCN报文转发流程
a 根据报文携带的vxlanid遍历ccsi实例的哈希表获取与当前vxlanid相同的ccsi_entry节点
b 拿到ccsiid后根据ccsiid遍历ccsi实例的哈希表获取id相等的ccsi实例节点信息
c 根据源ip对ccsi实例节点下关联的子网进行路由匹配
d 根据目的ip对ccsi实例节点下关联的子网进行路由匹配
e 源目的IP都匹配成功后,根据目的ip的vxlanid遍历vpc哈希表查询是否存在当前vpc
f 根据vxlanid及目的ip地址信息查询vpc哈希表确认目的IP对应的虚机是否存在
g 查到虚机具体信息后,用于封装vxlan数据包转发至正确的节点
建立session后的报文转发:
a 根据报文源目的IP查询是否存在session
b 存在则根据session记录的信息,封装vxlan数据包转发至正确的节点
图3 V1版本云联网转发流程
3.4 优化v1版本云联网产生的问题
基于上述v1版本优化云联网的转发性能得到了极大的提升,网卡利用率由优化前的20%提升到80%以上,但是提升性能的同时伴随着大量session的创建,在v1版本中sesion的清理工作实现包括session本身的老化处理,空连接的定时清理工作,删除子网或者vport信息时,遍历session表中的清理工作,当云联网中的配置发生变化(删除子网route或者是删除vport信息)时,需要查找到要删除的子网route或vport所关联的session。这里就会出现一个很苦恼的问题,创建session时是以源ip及目的ip座位hashkey的计算因子,当删除子网或者vport信息时,是拿不到源ip和目的ip相关信息的。因此只能遍历整个session表,逐个节点查询匹配当前要删除的子网或者vport信息,这样查询效率很慢。如果当前有大批量的删除子网route或者vport信息时就会出现明显的网络抖动,甚至导致bgp断连,因此,如何提高session清理时的查询算法变得尤为重要。
04
优化方案
如何绕过对会话表的查询动作呢?如果在删除子网路由的时候可以同时获悉当前路由下的所有session节点就可以完美的绕过对大会话表的查询动作。因此在conn结构和route结构中分别增加一个list,在ccn转发过程中,如果报文匹配上所有策略创建session时,将当前session节点挂载在session表和route结构链表中,如此在每个route结构下都挂载了当前子网下的所有session节点,在清理时就可以由原先的遍历整个session表下所有node变为遍历当前route结构下挂载的list节点,如下所示:
4.1 优化前数据结构
图中每个hash节点的key都是由源目地址相同的报文组成,删除子网时需要按顺序遍历整个session表。
图4 session表数据结构
4.2 优化后数据结构
图中每个节点都是要删除的子网结构下挂载的session节点,直接遍历子网结构下的所有list即可
图5 route结构中挂载conn_list结构
如此可以极大减少查询动作。
但是需要注意的是,在删除子网时清理session表session节点的同时,需要清理掉当前route结构下链表对应的session节点,相应的在删除vport或者超时情况下,出现清理session表动作的情况下,需要清理掉route结构下的链表节点
05
性能测试结果
5.1 测试环境
网关服务器,配置具体如下:
服务器配置 | |
---|---|
网卡 | 25G迈络思网卡 |
cpu | Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz |
操作系统 | centos7.2 |
5.2 删除200条CCN子网
25G网卡流量满载测试结果如下:
优化前版本:
两台虚机经云联网网关互访,网络抖动明显,bgp断连
图6 V1版本延迟
优化后版本:
两台虚机经云联网网关互访,网络无抖动
图7 V2版本延迟
06
后续优化
目前高性能版本的云联网已经上线至公司的三个地域,持续稳定运行了2个多月。后面我们还会逐步卸载一些VPC间流量到云联网网关上,来减轻其他种类网关压力。另外,高性能版本的云联网还有继续可优化的点,比如当前session实现为无状态方式,ccn网关收包和回包不一定在同一cpu核上,会分别在不同核上创建新的会话,后续可以参考负载均衡中的有状态会话,增加redirect会话重定向机制。这样收包和回包会走同一条session落到一个cpu核上,可以极大减少每个cpu核上的会话数。会话查看工具也在逐步完善中,通过工具可以掌握目前每个核的session负载情况,有助于问题排查。
更多技术干货,
请关注“360智汇云开发者”👇
360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。
目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案。
官网:https://zyun.360.cn(复制在浏览器中打开)
更多好用又便宜的云产品,欢迎试用体验~
添加工作人员企业微信👇,get更快审核通道+试用包哦~