阿里云 FaaS 架构设计
摘要:希望通过本系列课程,让大家更深入了解阿里云FaaS架构设计,以及神龙高密部署的FaaS介绍。
本篇内容将从2个部分为读者介绍关于阿里云 FaaS 架构设计和神龙高密部署的 FaaS,希望可以让大家对阿里云FaaS 有更深入的了解,并可以将 FaaS 应用到项目中,达到降本提效的目的。
一、基于 ECS 的 FaaS
在阿里云传统架构,用户通过互联网进入到负载均衡系统中,再通过负载均衡把系统的请求调度到不同的机器上去。这种传统的架构带来的问题比较多,一方面是多应用配比比例容易失衡,造成资源浪费;另一方面是镜像升级比较繁琐,整个过程的开机速度在分钟级,扩容速度也相对较慢。
(1) 架构设计
基于 ECS 的 FaaS 架构设计同样也是通过互联网进入,落到 SLB 负载均衡上。SLB 负载均衡这个系统是部署在阿里云内部的,主要用于抵挡 DDoS 攻击及请求均衡到多台 api_server 上。api_server 再发起函数的 CRUD 操作,并向 Scheduler 申请容器。Scheduler 管理容器在 worker 的放置,请求落在容器上的调度分发。用户所在 worker 就是我们称之为的计算节点,如果需要访问用户的 VPC 环境则在计算节点上通过 ENI 网卡打通到用户 VPC 环境。
(2) 多租户多应用部署的支持
namespace 是 linux 前几年推出的一个资源隔离方案,可以在内核层面做一些设置指定一部分进程固定。并且可以在 cgroup 的这一套设置方案里设置,控制资源的访问。在 namespace、cgroup 整套方案下,衍生出了 container,社区中常用的的 Docker 方案把镜像操作系统中的很多细节包装成一个方案,用户看到了一个相对比较完整的操作系统,把用户当成一个单个用户放置在虚拟机当中。这就是一个 vm,相当于说一台 ECS,这里就是操作系统层面,把整个 cpu、memory、包括设备全部给屏蔽掉,在上面用 cgroup 封一层,对应的就是 Docker 容器。
应用放置策略包括用户独占虚拟机、同 VPC 独占虚拟机、资源访问权限一致的 APP 混部在同机器。把两个不同的用户混在一个 vm 下,也就是 ECS 上面,对于用户之间来说是存在风险的。为了屏蔽掉共用 kernel 带来的风险,ECS 上的实现,我们单个 ECS 只有一个租户,这样处理也存在一些问题,最突出的就是对于低频调用函数资源使用率低。
(3) 快速水平弹性扩容
如何做到水平弹性扩容?
① 通过应用容器部署,可以定制一些特别的语言、Runtime容器、通用LIB/SDK,并保持社区生态一致,这样就不需要另外去下载,用户用起来也比较方便,启动速度也非常快。
② 通过设置公共容器镜像、容器镜像写入ECS镜像、ECS镜像启动机器、快速补充机器池等控制机器资源池,从而能够兼顾性能与成本。
③ 在池化的机器中池化容器创建、代码目录延迟挂载、提前启动runtime、提前health check,用户请求来临的时候需要启动的时间会变得更短。
④ 通过限制用户应用大小、鼓励拆分业务逻辑、内置SDK/Lib来控制应用大小。
⑤ 通过P2P镜像分发、避免对下载服务造成冲击、按需加载、降低下载延迟、提升启动速度等完成P2P镜像下载加速。
(4) 如何提升资源使用率
在实际研发过程中发现,相同QPS下单位时间片内调度对资源量的影响非常大,我们可以通过调度提升资源使用率。例如在下图中,我们看到宏观状态下的整体 TPS 是非常稳定的,然而事实上,我们放大到毫秒级别会发现,其实非常不均匀!那么这种不均匀到底会给我们带来什么影响?
假设我们每个容器被设置的最大并发度为 1,即任意时刻一个容器只处理一个任务。下图展示了 a,b,c,d,e,f 多个请求在不同时刻点被调度时对容器数目的影响。
可以看到场景一时,每个请求均匀打入时,任意时刻只需要一个容器就够了,这种情况就是我们理想中希望能达到的;
而在场景二下,如果调度发生了滞后,可能导致前置的请求和后来的请求混到了一个时间点,导致容器数目翻倍,在中间的空白处,这些容器又没有被充分利用造成了资源的浪费;
在场景三下,如果容器启动耗时较长,或者调用耗时变长,原来的 b 请求会和 a 请求出现时间上的叠加,导致又需要创建新的容器,而新的容器如果需要较长时间的冷启动, 又会导致和 c 请求出现时间上的叠加。如果调度系统实现得不够好,这样一来就可能产生雪崩效应,导致资源使用量暴涨,而实际使用率却极其低下。
通过上面几个场景,我们可以大致为资源使用率的开销上总结一个优化方向:
- 尽可能让调度更均匀、更合理,避免扎堆唤起容器
- 尽可能降低冷启动时长,避免短期大量容器都处于创建当中,避免无意义的系统调度开销
- 除了上述外,我们还可以考虑高密部署,将单机的资源使用率提升上去
(5) 如何容灾、防止雪崩
在实际操作中发生异常的时候,用户请求会出错,出错后会重启或调动新资源创建新的容器,但这样会导致整个延迟增大。用户有又会重复尝试,重复尝试则会导致负载升高,从而又引起异常,如此恶性循环。可以通过优化启动速度、多 Partition 容灾部署、指数退避重试、Breaker 阻断异常请求、多可用区备灾、SLB 阻断 DDoS 攻击来防止雪崩。
二、基于神龙高密部署的FaaS
(1) 为什么需要做高密部署?
一是因为弹性启动速度要求高,希望做到每秒1万个容器实例的启动、启动延迟控制在300毫秒以内、容器的存活时间在分钟级别、资源粒度128MB;
二是成本更低,ECS 架构因安全隔离问题资源碎片多,突发调用延迟高,影响资源数目;
三是性能,ECS 单机缓存少、请求毛刺率较高、请求最大延迟高;
四是稳定性,高并发对系统冲击、频繁的创建删除资源、ECS管控压力,爆炸半径难以控制。
(2) 高密部署架构带来的技术难题
整个高密部署架构带来的一些技术难题:
首先要面对的是如何解决单机多租户隔离安全风险,如果不解决这个问题那么就无法做到单机多租户的安全高密部署,这样资源使用率密度无法有效提升;
其次是如何解决高并发下启动速度问题,如果无法做到这点,如我们前面所提到的,冷启动时间较长会严重加剧资源的开销,同时严重影响用户延迟体验;
再就是如何解决单机多租户VPC网络打通及安全问题,这一点其实非常重要,我们在 ECS 上建立 VPC 网络连接的速度非常慢,这也严重影响了用户冷启动及资源的使用;
另外我们还需要考虑如何设计高密部署下的技术容灾方案,因为任何一个计算节点的异常会带来大量用户的服务异常。
(3) 基于安全容器模板技术的优化
我们是如何做到基于安全容器模板技术的优化的?每个容器独占一个虚拟机沙箱,这个沙箱相当于是一个独立的虚拟机,有自己独立的 linux 内核,这样一来每个容器都是通过独立的 kernel 来做安全隔离。神龙启动时模板化大量虚拟机用于提升启动速度,通过 virtiofs 延迟挂载用户代码目录,通过虚拟机微内核隔离用户,可以做到单台机上每个微内核20M左右的内存,单机至少 2000 个容器,控制它的冷启动时间是在250毫秒左右。通过调度算法,我们可以合理地使用资源,承诺用户的资源 quota。
(4) 代码按需加载
代码按需加载是通过以下几个方面做到的:用户容器会重复使用同一份代码,单台神龙只需下载一次;脚本语言包含了大量用不到的代码;使用使用 FUSE(用户空间文件系统)来做中间层文件的真实读取;底层使用 NAS 做低延迟的数据下载;OSS(阿里云对象存储)做高带宽支持的数据下载。注意到,我们这里混用了 NAS 及 OSS 一同来做代码的加载,需要注意的是,NAS 的访问延迟相对而言更低,对于小文件的加载更快。我们在加载初始阶段开始全量异步从 OSS 下载代码。而对于需要立即访问的数据,我们则从 NAS 上读取。由于我们将整个用户代码目录做成了两个文件:一个为目录文件索引数据,另一个为文件内容数据。由于 NAS 访问延迟低,我们可以通过类似 GetRange 的方式去数据文件上获取小文件内容。这样就可以用最快的速度即时加载用户代码来达到快速冷启动了。
(5) VPC 网络优化
基于网络服务网格的 VPC 网关代理是通过用户VPC网络安全隔离。我们过去在 ECS 方案上插拔 ENI 网卡非常耗时,至少需要2~3s,P99甚至达到6~8s。在高密部署的神龙方案上,我们没有必要为每个安全容器做多次网卡插拔,只需要在神龙机器上统一打通到网关代理,而用户 ENI 网卡常驻在网关集群上,这样整个网卡的加载速度会变得很快。这样对于用户体验和资源开销都会是一个巨大的优化。
(6) 资源分配率
通过混合部署多租户各类业务提升部署密度,合理配比不同资源需求的容器到一台物理神龙,从而提升资源分配率。
三、总结
讲师简介:朱鹏,阿里云 Serverless 技术专家
负责阿里云函数计算调度设计研发,在函数计算高并发、技术容灾、冷启动优化、调度资源管理、神龙裸金属技术架构等多个方向均参与了设计和研发实现,是阿里云函数计算神龙高密部署架构主导推动负责人之一。目前主要致力于提升资源使用率,研究设计超大规模并发下的低延迟资源调度解决方案。
本文整理自【Serverless Live 系列直播】9 月 27 日场
直播回放链接:
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
阿里云 FaaS 架构设计的更多相关文章
- 基于 Angularjs&Node.js 云编辑器架构设计及开发实践
基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- 云ATM架构设计
云ATM架构设计 启动程序(Start.java) public class Start { public static void main(String[] args) { MainView vie ...
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
- Docker容器技术的PaaS云平台架构设计***
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...
- 一面数据: Hadoop 迁移云上架构设计与实践
背景 一面数据创立于 2014 年,是一家领先的数据智能解决方案提供商,通过解读来自电商平台和社交媒体渠道的海量数据,提供实时.全面的数据洞察.长期服务全球快消巨头(宝洁.联合利华.玛氏等),获得行业 ...
- 阿里云app原型设计
软件需求分析与系统设计 https://edu.cnblogs.com/campus/zswxy/2018SE 这个作业要求在哪里 https://edu.cnblogs.com/campus/zsw ...
- 探索云数据库最佳实践 阿里云开发者大会数据库专场邀你一起Code up!
盛夏.魔都.科技 三者在一起有什么惊喜? 7月24日,阿里云峰会·上海——开发者大会将在上海世博中心盛大启程,与未来世界的开发者们分享数据库.云原生.开源大数据等领域的技术干货,共同探讨前沿科技趋势, ...
- no.2淘宝架构背后——零售业务中台架构设计探讨及实践读后感
2017年8月12日,袋鼠云首席架构师正风在“网易博学实践日:大数据与人工智能技术大会”进行<淘宝架构演进背后——零售业务中台架构设计探讨及实践>演讲分享.传统零售行业如何选择应对新经济模 ...
- 阿里云AIoT云端一体:迎接云原生+低代码时代的到来
距上次2019年参加上海阿里云开发者大会已经近2年的时间了,也许因为疫情的原因,这一两年线下大型活动基本很少了,这次在北京国家会议中心举办的阿里云开发者大会,无论是参会人员的规模,还有演讲嘉宾的级别和 ...
随机推荐
- AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--
手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导. 在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序. 本节的程序的需求是,接收CAD用 ...
- Unity学习笔记--数据持久化XML文件(2)
IXmlSerializable接口: 使用该接口可以帮助处理不能被序列化和反序列化的特殊类得到处理, 使特殊类继承IXmlSerializable接口 ,实现其中的读写方法,检测到读写方法被重写之后 ...
- MINA框架
一.小程序MINA框架分为三个部分: 有 View(视图层).App Service(逻辑层)和 Natice(系统层). 1.View(视图层) 视图层包含了小程序多个页面.每个页面都有WXML文件 ...
- 用pycharm创建一个django框架
用pycharm创建一个django框架 注意解释器的选择和文件路径 创建完django项目 1.自动创建了一个templates目录(先删除) 2.把settings里的 TEMPLATES = [ ...
- [CF1264D]Beautiful Bracket Sequence
题目描述 This is the hard version of this problem. The only difference is the limit of $ n $ - the lengt ...
- 解决OpenCV编译时./bin: error while loading shared libraries: libopencv_highgui.so.3.2: cannot open的问题
1.问题 安装好了opencv后,用其去检测是否可以使用时,出现了如下的问题: 2.解决 参考这篇博文点击 的配置环境即可解决
- 安卓app填写域名和端口后点击保存没有反应(填错注册信息)
解决方法:域名填写错误导致(仔细检查填写的域名和端口是否正常,注册的信息是否与填写的一致) 域名是:3q9l302537.wicp.vip 中间有个字母 l 不是数字 1 填写成了:3q91302 ...
- 数字孪生为何通过融合GIS系统能够更好地助力智慧城市发展?
随着城市化进程的不断加速,智慧城市建设已成为许多城市发展的重要方向.在智慧城市中,数字孪生技术和GIS系统的融合,为城市发展带来了全新的可能性和机遇.数字孪生是一种将物理世界和数字世界相结合的技术,通 ...
- 牛客网刷Java记录第一天
第一题 下列程序输出啥? public class StringDemo{ private static final String MESSAGE="taobao"; public ...
- 【2】从零玩转OSS阿里云存储服务之Java代码操作-2-cong-ling-wan-zhuan-oss-a-li-yun-cun-chu-fu-wu-zhi-java-dai-ma-cao-zuo
title: [2]从零玩转OSS阿里云存储服务之Java代码操作 date: 2021-06-09 17:37:14.486 updated: 2021-12-26 17:43:12.779 url ...