摘要:
无状态网络功能是一个新的网络功能虚拟化架构,解耦了现有的网络功能设计到无状态处理组件以及数据存储层,在打破紧密耦合的同时,实现了更具可伸缩性和可恢复性的网络功能基础设施。无状态NF处理实例是围绕高效管道构建的,利用DPDK实现高性能网络I/O,打包为Docker容器以便于部署,以及基于预期请求模式优化的数据存储接口,以高效访问基于Ramcloud的数据存储。网络范围的编排器监视实例的负载和故障,管理实例以扩展和提供弹性,并利用基于OpenFlow的网络将流量定向到实例。
我们实现了三个示例网络功能(网络地址转换器、防火墙和负载均衡器)。
我们的评估显示:
我们能够达到10Gbit/s的吞吐量,附加的延迟开销在100微秒到500微秒之间。
我们能够进行不会中断正在进行的通信的故障转移。
当向外扩展和向内扩展时,我们能够匹配理想的性能。
背景/问题:
中间盒是当今网络基础设施中的一个重要组成部分,为网络运营商提供了将新的网络功能作为附加组件部署的能力,这些附加组件可以直接检查、修改和阻止或重新定向网络流量,有助于提高网络的安全性和性能。虽然传统上部署为物理设备,但通过网络功能虚拟化(NFV),网络功能(如防火墙、入侵检测系统、网络地址转换器和负载平衡器)不再需要在专有硬件上运行,而是可以在虚拟化环境中的软件、商品服务器上运行,并且具有高吞吐量,能够根据需要弹性地扩展网络功能并从故障中快速恢复。
然而要实现这些特性并不是那么简单,中心问题围绕锁定到网络功能中的状态-状态,如有状态防火墙中的连接信息、入侵检测系统中的子字符串匹配、网络地址转换器中的地址映射或有状态负载平衡器中的服务器映射。将该状态锁定到单个实例中会限制灵活性、弹性和处理其他挑战(如非对称/多路径路由和软件更新)的能力。
为了克服这一点,有两条研究路线:
对于可恢复性,最近的工作提出了(1)定期检查网络功能状态,以便在出现错误时可以重建网络功能(2)记录所有输入(即包)并使用确定性重放,以便在失败时重建状态。这些解决方案提供了一定的弹性,但代价是每包延迟大幅增加(大约10毫秒),或者在故障转移时恢复时间较长(例如,重放自上一个检查点以来接收的所有数据包),两者都无法解决可恢复性问题。
对于弹性,最近的工作建议修改网络功能软件,以便能够通过API将状态从一个实例迁移到另一个实例。然而,状态迁移需要时间,本质上并不能解决计划外故障的问题,而且作为一个中心属性,它依赖于流到实例的关联性——每一个状态迁移都会使状态迁移成为一个有用的原语,在实践中受到限制。
解决办法:
我们提出无状态网络功能(或无状态NF),这是一种新的体系结构,它从网络功能需要执行的处理中打破了网络功能需要维护的状态之间的紧密耦合。
可恢复性:使用无状态nf,我们可以在失败时立即生成一个新实例,因为新实例可以访问所需的所有状态。它可以立即处理流量,并且不会中断网络。更重要的是,由于故障转移没有惩罚,因此我们可以更快地进行故障转移-实际上,我们不需要确定某个网络功能已发生故障,而只需猜测它已发生故障,然后检测到我们错了,或纠正问题(例如,重新启动)
可伸缩性:当扩展时,使用无状态nf,可以启动一个新的网络功能实例,并立即将流量定向到它。网络功能实例将可以通过数据存储访问所需的状态(例如,作为已建立连接的一部分的数据包,该连接指向传统虚拟防火墙中的新实例,将被丢弃,因为查找将失败,但对于无状态nf,查找将提供有关已建立连接)。同样,扩展只需要将任何通信量重新定向到要关闭的实例之外
非对称/多路径路由:在无状态NF中,每个实例将共享所有状态,因此正确的操作不依赖于与实例的流量关联。事实上,在我们的模型中,我们假设任何单独的包都可以由任何实例处理,从而抽象出一个可伸缩的、有弹性的网络功能。因此,通过不同路径的包不会导致问题。
我们描述了如何以无状态的方式重新设计四种常见的网络功能:一个有状态防火墙、一个入侵防御系统、一个网络地址转换器和一个负载均衡器的实现。
工作表明,我们所研究的功能是有价值的,即使使用我们目前的原型,我们也能够将其他系统的处理速度与类似的目标相匹配,同时提供可伸缩性和可恢复性。
实现细节:
本文的核心思想是在网络函数中将处理与状态分离——将状态放入数据存储中。我们称之为无状态网络功能(或无状态NF),因为网络功能本身变成无状态,应用程序(例如,有状态防火墙)的状态通过将状态存储在单独的数据存储中来维护。
表1显示了要分离的网络状态,并将其存储在远程存储器中,以实现四种网络功能:
我们演示了如何使用多个网络函数算法的伪代码访问解耦状态,并总结了表1中数据存储所需的读写操作。在所有算法中,我们将更新或写入状态显示为WriteRC,将读取状态显示为ReadRC(其中RC与我们选择的数据存储RAMcloud相关)。
下面我们描述算法1(负载均衡器)和2(IP):
整体无状态NF架构:
在高层次上,无状态NF由一个网络范围的体系结构组成。
如上图所示,无状态NF体系结构由三个主要组件组成:数据存储、承载网络功能实例的主机和处理网络功能基础设施动态的编排组件。网络功能主机只是商品服务器
弹性低延迟数据存储:无状态nf以及远程数据存储的其他用途的中心思想是关注点分离的概念。也就是说,在分离状态和处理的过程中,每个组件都可以专注于更具体的功能。在无状态NF中,网络功能只需要处理网络流量,不需要担心状态复制等问题。数据存储提供了状态的弹性。由于这种分离,并且由于它位于包处理的关键路径上,数据存储还必须提供低延迟访问。出于我们的目的,我们假设一个数据存储不需要对事务的支持,但是我们期望在将来的工作中探索可能需要事务的网络功能的影响。
在本文中,我们选择RAMcloud作为我们的数据存储。RAMcloud是一个分布式的密钥价值存储系统,它提供对数据的低延迟访问,并支持高度的可伸缩性。
网络功能编排:编排的基本需求包括监视网络功能实例的负载和故障,并相应地调整实例的数量。
无状态NF编排控制器是用JAVA实现的,它有一个管理API,实现弹性策略的实现,以确定何时创建或销毁网络功能。
无状态NF实例体系结构:尽管无状态nf总体架构提供了管理实例集合的能力,提供了无状态NF的弹性和弹性优势,但无状态NF实例的架构是为了实现所需的可部署性和性能。
如下图所示,无状态NF实例体系结构由三个主要组件组成:
- 可以按需部署的数据包处理管道
- 高性能网络I/O
- 到数据存储的有效接口
讨论与优化:
减少与远程数据存储的交互:从根本上说,如果我们能够进一步减少与远程数据存储的交互,我们就可以提高性能。
数据存储可伸缩性:本文描述的方法,最终仍将受到数据存储可伸缩性的限制,但通常将数据存储视为可伸缩的、活跃的研究领域。