深度解读阿里巴巴云原生镜像分发系统 Dragonfly

摘要: Dragonfly 目前承载了阿里全集团 90%以上的文件下载任务、日分发峰值达到 1 亿次,100%成功支撑双十一营销活动数据抵达数万台机器,github Star 数已达到 2500+。2018 年 11 月 14 日已正式进入 CNCF,成为 CNCF 沙箱级别项目(Sandbox Level Project)。git

Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题。随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并经过云化平台优化业务管理。Dragonfly 源于阿里巴巴,从实际落地场景出发,前瞻性地解决了云原生镜像分发的__效率、流控与安全__三大难题。github

Dragonfly 目前承载了阿里全集团 90%以上的文件下载任务、日分发峰值达到 1 亿次,100%成功支撑双十一营销活动数据抵达数万台机器,github Star 数已达到 2500+。2018 年 11 月 14 日已正式进入 CNCF,成为 CNCF 沙箱级别项目(Sandbox Level Project)。算法

Dragonfly 的由来

随着阿里集团业务爆炸式增加,2015 年时发布系统日均发布量突破两万,不少应用的机器规模开始破万,发布失败率开始增高,而根本缘由则是发布过程须要大量的文件拉取,文件服务器扛不住大量的请求,固然第一时间会想到服务器扩容,但是扩容后又发现后端存储成为瓶颈且扩容成本也很是巨大(按照咱们的计算,为了知足业务需求,不阻碍业务的发展,后续至少须要 2000 台高配物理机且上不封顶)。此外,大量来自不一样 IDC 的客户端请求消耗了巨大的网络带宽,形成网络拥堵。后端

同时,阿里巴巴不少业务走向国际化,大量的应用部署在海外,海外服务器下载要回源国内,浪费了大量的国际带宽,并且还很慢;若是传输大文件,网络环境差,失败的话又得重来一遍,效率极低。跨域

因而咱们很天然的就想到了 P2P 技术,P2P 技术并不新鲜,当时也调研了不少国内外的系统,可是调研的结论是这些系统的规模和稳定性都没法达到咱们的指望,所以就有了Dragonfly这个产品的诞生。缓存

Dragonfly 能解决哪些问题

做为一款通用文件分发系统,Dragonfly 主要可以解决如下几个方面的问题:安全

  1. 大规模下载问题:应用发布过程当中须要下载软件包或者镜像文件,若是同时有大量机器须要发布,好比 1000台,按照 500MB 大小的镜像文件计算,若是直接从镜像仓库下载,假设镜像仓库的带宽是 10000Mbps,那么理想状态下至少须要 10 分钟,并且实际状况极可能是仓库早已被打挂。
  2. 远距离传输问题:针对跨地域跨国际的应用,好比阿里速卖通,它既要在国内部署,又要在美国和俄罗斯部署,而存储软件包的源通常只在一个地域,好比国内上海,那么在美国或者俄罗斯的机器当要下载软件包的时候就要经过国际网络传输,可是国际网络不只延时高并且极不稳定,严重影响传输效率,进而致使业务不能及时上线新功能或者问题补丁,由此甚至会产生业务故障。
  3. 带宽成本问题:除了传输效率问题,高昂的带宽成本也是一个很是严重的问题,不少互联网公司尤为是视频相关的公司,带宽成本每每能够占据其整体成本的很大一部分。
  4. 安全传输问题:据统计,每一年由于网络安全问题致使的经济损失高达 4500 亿美圆,因此安全必须是第一辈子命线,文件传输过程当中若是不加入任何安全机制,文件内容很容易被嗅探到,假设文件中包含帐号或者秘钥之类的数据,一旦被截获,后果将不堪设想。

Dragonfly 是如何解决这些问题的

经过 P2P 技术解决大规模镜像下载问题,原理以下:服务器

针对上图有几个概念须要先解释:网络

  • PouchContainer:阿里巴巴集团开源的高效、轻量级企业级富容器引擎技术。
  • Registry:容器镜像的存储仓库,每一个镜像由多个镜像层组成,而每一个镜像层又表现为一个普通文件。
  • Block:当经过Dragonfly下载某层镜像文件时,蜻蜓的SuperNode会把整个文件拆分红一个个的块,SuperNode 中的分块称为种子块,种子块由若干初始客户端下载并迅速在全部客户端之间传播,其中分块大小经过动态计算而来。
  • SuperNode:Dragonfly的服务端,它主要负责种子块的生命周期管理以及构造 P2P 网络并调度客户端互传指定分块。
  • DFget__:__Dragonfly的客户端,安装在每台主机上,主要负责分块的上传与下载以及与容器 Daemon 的命令交互
  • Peer:下载同一个文件的 Host 彼此之间称为 Peer。

主要下载过程以下:多线程

  1. 首先由 Pouch Container 发起 Pull 镜像命令,该命令会被 DFget 代理截获。
  2. 而后由 DFget 向 SuperNode 发送调度请求。
  3. SuperNode 在收到请求后会检查对应的文件是否已经被缓存到本地,若是没有被缓存,则会从 Registry 中下载对应的文件并生成种子块数据(种子块一旦生成就能够当即传播,而并不须要等到 SuperNode 下载完成整个文件后才开始分发),若是已经被缓存,则直接生成分块任务。
  4. 客户端解析相应的任务并从其余 Peer 或者 SuperNode 中下载分块数据,当某个 Layer 的全部分块下载完成后,一个 Layer 也就下载完毕,此时会传递给容器引擎使用,而当全部的 Layer 下载完成后,整个镜像也就下载完成了。

经过上述 P2P 技术,能够完全解决镜像仓库的带宽瓶颈问题,充分利用各个 Peer 的硬件资源和网络传输能力,达到规模越大传输越快的效果。

Dragonfly的系统架构不涉及对容器技术体系的任何改动,彻底能够无缝支持容器使其拥有 P2P 镜像分发能力,以大幅提高文件分发效率!

结合 CDN 与预热技术解决远距离传输问题

经过 CDN 缓存技术,每一个客户端能够就近从 SuperNode 中下载种子块,而无需跨地域进行网络传输,CDN 缓存原理大体以下:

同一个文件的第一个请求者会触发检查机制,根据请求信息计算出缓存位置,若是缓存不存在,则触发回源同步操做生成种子块;不然向源站发送 HEAD 请求并带上 If-Modified-Since 字段,该字段的值为上次服务器返回的文件最后修改时间,若是响应码为 304,则表示源站中的文件目前还未被修改过,缓存文件是有效的,而后再根据缓存文件的元信息肯定文件是不是完整的,若是完整,则缓存彻底命中;不然须要经过断点续传方式把剩下的文件分段下载过来,断点续传的前提是源站必须支持分段下载,不然仍是要同步整个文件。若是 HEAD 请求的响应码为200,则表示源站文件已被修改过,缓存无效,此时须要进行回源同步操做;若是响应码既不是 304 也不是 200,则表示源站异常或地址无效,下载任务直接失败。

经过 CDN 缓存技术能够解决客户端回源下载以及就近下载的问题,可是若是缓存不命中,针对跨域远距离传输的场景,SuperNode 回源同步的效率将会很是低,这会直接影响到总体的分发效率,为了解决该问题,Dragonfly采用了一种自动化层级预热机制来最大程度的提高缓存命中率,其大体原理以下:

经过 Push 命令把镜像文件推送到 Registry 的过程当中,每推送完一层镜像就会当即触发 SuperNode 以 P2P 方式把该层镜像同步到 SuperNode 本地,经过这种方式,能够充分利用用户执行Push和Pull操做的时间间隙(大概10分钟左右),把镜像的各层文件同步到 SuperNode 中,这样当用户执行 Pull 命令时,就能够直接利用 SuperNode 中的缓存文件,天然而然也就没有远距离传输的问题了。

经过动态压缩和智能化调度解决带宽成本问题

经过动态压缩,能够在不影响 SuperNode 和 Peer 正常运行的状况下,对文件中最值得压缩的部分实施相应的压缩策略,从而能够节约大量的网络带宽资源,同时还能进一步提高分发速率,相比于传统的 HTTP 原生压缩方式,动态压缩主要有如下几个方面的优点:

动态压缩的优点首先天然是动态性,它能够保证只有在 SuperNode 和 Peer 负载正常的状况下才会开启压缩,同时只会对文件中最值得压缩的分块进行压缩且压缩策略也是动态肯定的;此外,经过多线程压缩方式能够大幅提高压缩速率,并且借助 SuperNode 的缓存能力,整个下载过程只须要压缩一次便可,压缩收益比相对于 HTTP 原生方式至少提高 10 倍。

除了动态压缩外,经过 SuperNode 强大的任务调度能力,能够尽可能使在同一个网络设备下的 Peer 互传分块,减小跨网络设备、跨机房的流量,从而进一步下降网络带宽成本。

经过加密插件解决安全传输问题

在下载某些敏感类文件(好比秘钥文件或者帐号数据之类的文件)时,传输的安全性必需要获得有效保障,在这方面,Dragonfly主要作了如下几个方面的工做:

  1. 支持 HTTP Header 传输,以知足那些须要经过 Header 来进行权限验证的下载请求
  2. 经过自研的数据存储协议对数据块进行包装传输,后续还会对包装的数据进行再加密
  3. 即将支持安全加密功能插件化
  4. 经过多重校验机制,能够严格防止数据被篡改

Dragonfly目前的成熟度如何

在阿里巴巴集团内部,Dragonfly做为全集团基础技术构件,目前已经承载了全集团 90%以上的文件下载任务,包括镜像文件、应用软件包、算法数据文件、静态资源文件以及索引文件等等,日分发峰值目前能够达到 1 亿次,为集团业务提供了高效稳定的文件分发能力;同时,每一年双十一你们买买买的过程当中,其中最为关键的营销活动数据(数 GB 大小)也是在将近零点的时候经过Dragonfly来成功(100%成功)抵达数万台机器上的,万一在这个过程当中有一点点问题,双十一会如何,你懂的......

目前 Dragonfly 也已经开源,在开源社区中, 目前 Star 数 2500+,同时有很是多的外部用户对 Dragonfly 表现出浓厚的兴趣,也有不少外部公司正在使用 Dragonfly 来解决他们在镜像或者文件分发方面遇到的各类问题,好比中国移动、滴滴、科大讯飞等;此外,Dragonfly 已成为全中国第三个进入CNCF Sandbox 级别的项目,后续咱们还会继续加油努力,争取尽快毕业!

经过以上介绍,我相信针对Dragonfly是否足够成熟,你们内心应该也有杆秤了吧,固然,Dragonfly还有不少事情须要不断完善和改进,在这里诚邀各路人才,一块儿把Dragonfly打形成一款世界级的产品!

将来规则展望

  1. 成为CNCF毕业项目,为云原生应用提供更加丰富和强大的文件分发能力。
  2. 开源版与集团内部版融合,给社区开放出更多的高级特性。
  3. 智能化方面进行更多探索和改进。

原文连接 

相关文章
相关标签/搜索