Serverless,全称 Serverless Computing,即无服务器计算,也有一些场景称之为函数即服务(Function-as-a-Service,缩写为 FaaS),是一种新型的云计算模型。
大约 10 年前,Serverless 作为一种未来的软件服务概念被正式提出[1x]。2014 年,AWS 率先用 Lambda 开启了 Serverless 的产品化,再到 2017 年云厂商纷纷布局 Serverless 领域。国内外比较出名的产品包括有 AWS Lambda、Microsoft Azure Functions、Google Cloud Run、Alibaba Function Compute 等。更进一步,Kubernetes 的蓬勃发展也催生了一系列 Serverless Kubernetes 形态的服务,得益于 Kubernetes 的标准化和 Serverless 的弹性和免运维,Serverless Kubernetes 得到了许多用户的垂青。
2019 年,UC Berkeley 研究人员在“Serverless Computing: One Step Forward, Two Steps Back”论文[2]中分析判断道:“Serverless 将引领云计算的下一个十年”。时至 2021 年,Forrester 发布报告[3x]称,统计中 31%主流企业的核心应用,从原来的主机架构迁移到了 Serverless 架构,并且这个规模还在持续高速增长。
经过近 10 年的技术磨砺,Serverless 架构已经凭借着细粒度计算资源分配、无需预先分配资源、真正意义上的高度扩容和弹性等方面的功能优势,给很多基于云计算开发的业务和应用带来了丰富的技术红利,更是被广泛采纳,逐渐在越来越多的业务中发挥重要价值。这项当年概念性的 Serverless 技术,已经“飞入寻常百姓家”,也成为各大云厂商都落地支持的重要服务模式。
即便如此,Serverless 在带来很多发展新机遇的同时,在主流场景大规模实际落地方面也面临诸多挑战。
同样来自 UC Berkeley 的论文也分析了 Serverless 的局限性,文章称其为“进一退二(One Step Forward, Two Steps Back)”——无限弹性的计算平台愿景下面临着数据访问的掣肘和黑盒性阻碍数据一致性、leader 选举、分布式事务等分布式技术的发展。
通过提供自动缩放功能,如今的 Serverless 产品在云编程方面迈出了一大步,它提供了一种看似无限的计算平台。
原文:By providing autoscaling, today’s FaaS offerings take a big step forward for cloud programming, offering a practically manageable, seemingly unlimited compute platform.
但并非一切都已尽善尽美,将 Serverless 大规模推广到一些现有应用中还有些明确的障碍。
首先,Serverless 忽视了高效数据处理的重要性; 其次,它们给分布式系统的开发添加了阻碍。其中第二点不在本文的讨论范围内。
原文:First, they painfully ignore the importance of efficient data processing. Second, they stymie the development of distributed systems.
对于很多数据应用而言,迁移到 Serverless 面临的一大问题就是数据访问的高延时和并发访问造成的分布式存储 IO 瓶颈。归根结底这是由于:
比如在机器学习场景下,在初始化的时候加载机器学习模型,而有些模型的大小达到几 GB 甚至几十 GB,根据实测单个实例拉取模型的时间至少 60 秒以上,整个启动时间在 2 分钟左右,如果考虑扩容数量成百上千的场景,严重的 IO 竞争影响了 Serverless 的启动性能。
这就引起了数据科学家的担忧:大数据运算和 AI 负载在 Serverless 上是不是要以牺牲性能为代价换取成本上的收益?当启动速度慢到一定程度的时候,Serverless 所擅长的弹性优势不复存在;如果运行时间太长的话,Serverless 相比于包年包月的虚拟机租赁收费模式成本上孰优孰劣也不能清晰确定。
数据访问的高延时俨然成为了 Serverless 应用的阿喀琉斯之踵,阻碍其在数据密集型应用场景的规模化落地。
Serverless 数据访问延时的问题,本质上是由云上的计算存储分离架构导致的。如果能够将数据以分布式的方式加载到计算集群中,并充分发挥数据本地性和数据访问可复用的特性,则可以提升数据访问的性能。CNCF 旗下开源沙箱项目 Fluid 秉持着这个理念应运而生。
Fluid 是一个开源的 Kubernetes 原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用,例如大数据应用、AI 应用等。通过 Kubernetes 服务提供的数据层抽象,Fluid 可以让数据像流体一样在诸如 HDFS、OSS、Ceph 等存储源,并在 Kubernetes 上层云原生应用计算之间灵活高效地移动、复制、驱逐、转换和管理。
另外,具体数据操作对用户透明,用户不必再担心访问远端数据的效率、管理数据源的便捷性,以及如何帮助 Kuberntes 做出运维调度决策等问题,只需以最自然的 Kubernetes 原生数据卷方式直接访问抽象出来的数据即可,剩余任务和底层细节全部交给 Fluid 处理。
Fluid 项目当前主要关注数据集和使用应用编排这两个重要场景。数据集编排可以将指定数据集的数据缓存到指定特性的 Kubernetes 节点,而应用编排将使用该数据集的应用调度到可以或已经存储了指定数据集的节点上。这两者还可以组合形成协同编排场景,即协同考虑数据集和应用需求进行节点资源调度。
Fluid 设计之初是为了 Serverful 场景使用(Serverful 与 Serverless 相对,意思是应用对所运行的服务器有感知,并且在服务器为中心的前提下实现架构设计),通过计算任务与数据本地性和复用性调度相结合实现数据访问性能最大化。
然而,许多用户在实践中还是选用了缓存和计算节点分离的架构,就是将计算集群中的部分节点专门用作缓存,另外一部分节点用来作为计算。由于缓存节点和计算在同样的网络环境下(VPC),并且分布式缓存可以实现 P2P 的数据访问,这样避免了存储服务限流和网络限流。这种模式被称为近地缓存。它虽然不能和本地缓存的性能相比,但是一方面缩短了计算与存储的物理距离,从漂洋过海变成了同一个数据中心甚至同一个机柜,有效缩减了访问延时,另一方面通过 P2P 的数据传输突破了存储服务器端的网络带宽的限制。
在此基础上,Fluid 支持数据弹性和可操作性,能够根据计算吞吐需求实现:
因此,如果用户能够了解(有很多自动化的方式做到)自己的数据使用模式和对吞吐性能的需求,就能实现性能提升的有的放矢。通过使用更多节点 SSD 的缓存节点,将数据缓存设置更多的备份,设置分布式缓存访问的随机性,都可以有效地避免热点数据成为访问瓶颈。
Fluid 0.7 之前的版本是不支持 Serverless 的,实际上多数流行的开源软件都不能大规模地部署在 Serverless 平台上,毕竟目前很多开源软件(尤其是数据系统)并不是针对 Serverless 执行环境的而设计的。这背后主要有两个问题:
为了支持 Serverless 场景,Fluid 解决问题的基本思路是对不同的问题分而治之,具体来说:
以下为 Fluid 在 Serverless 场景的架构,可以分为数据平面(Data Plane)和控制平面(Control Plane):
由于 Serverless 的架构也在不断升级换代,相信未来 Serverful 的部分会不断被云厂商以服务化方式提供,从而演变成一个可以弹性并且按需付费的加速服务。
本文介绍了 Fluid 完成了对 Serverless 场景的第一步支持,后续我们会通过一系列的文章介绍其设计方案以及在 Knaitve 等开源 Serverless 平台的实践。
作者简介:
车漾,阿里云高级技术专家
顾荣,南京大学副研究员
Reference:
[1] https://en.wikipedia.org/wiki/Serverless_computing
[2] Joseph M. Hellerstein, Jose Faleiro, Joseph E. Gonzalez, Johann Schleier-Smith, Vikram Sreekanti, Alexey Tumanov and Chenggang Wu. Serverless Computing: One Step Forward, Two Steps Back, CIDR 2019.
领取专属 10元无门槛券
私享最新 技术干货