软件|阿里云徐立:面向容器和 Serverless Computing 的存储创新( 三 )


DADI 关键技术解读
DADI 增量镜像可以通过基于块+分层技术来实现 , 其中每个层对应于一个 LBA 的变更 。 DADI 的关键技术包括远程镜像的细粒度按需传输 , 高效的在线解压缩 , 基于 trace 读取 , 用于处理突发工作的 P2P 传输技术 。 DADI 在提高部署应用的敏捷性和弹性方面非常有效 。
1、分层块设备 Overlay Block Device
每层记录被增量修改的变长数据块 LBA , 不涉及文件/文件系统的概念 , 以 512 字节为最小粒度 。 快速索引 , 支持变长记录 , 以节省内存 , 各记录的 LBA 不重叠 , 支持高效的区间查询 。
2、原生支持可写层
提供追加写文件和随机写稀疏文件两种模式构建 DADI 镜像 。 只读层 , 每个只读都可以按照不同类型的大小 , 每层查询区间 , 速度极快 。 可写层由存储原始数据(Raw Data)和存储索引(Index)两部分组成 , 接受 append only 组织而成 。

3、ZFile 压缩格式
标准压缩文件格式 , 例如 gz , bz2 , xz 等 , 无法高效的进行随机读写操作 , 无论读取压缩文件中的哪一部分 , 都需要从头部开始解压 , 为了支持 layer blob 的压缩并同时支持远程镜像的按需读取 , DADI 引入了 ZFile 压缩格式 。 ZFile 的压缩格式如下图所示 , 按固定大小数据块压缩 , 只解压读到的数据块 , 支持多种有效的压缩算法 , 包括 lz4 , zstd , gzip 等 , 采用通用格式 , 不绑定于 DADI 。

4、基于 Trace 预取
记录应用过程中的读取日志、只记位置、不记数据本身 。 在应用冷启动时 , 若已有 trace 记录 , 则 DADI 将根据trace提前把数据预取回本地 , 采用高并发读取 , 更加高效 。 Trace 作为一个特殊的 layer 存于 image , 专门用于加速 , 用户不可见 , 未来可容纳其他加速文件 。 如下图绿色部分表示加速层、容纳 trace 文件以及其他文件 。
5、按需 P2P 传输
在我们的生产环境中 , 有几个关键应用程序已经部署在数千台服务器上 , 并且包含高达数 GB 的 Layer , 这些应用程序的部署给 Registry 和网络基础设施带来了巨大压力 。 为了更好的处理此类大型应用 , DADI 将最近使用的数据块缓存在每个宿主机的本地磁盘上 , 采用 P2P 的方式在主机之间传输数据 。

1、采用树形拓扑结构分发数据
各个节点均缓存最近使用过的数据块 跨节点请求大概率命中父节点自己的 cache 未命中的请求会递归向上传递 , 直到 registry 2、拓扑结构由 root 节点动态维护
每个 layer 单独一个传输拓扑 3、每个机房单独部署一组 root
多节点高可用架构 基于一致性哈希的分工 大规模启动耗时测试

我们将 DADI 容器启动延迟与 .tgz 镜像、Slacker、CRFS、LVM 和 P2P 镜像下载进行了比较 , 使用 DockerHub.com 上的 WordPress 镜像 , 我们观测单实例的冷启动延迟 , 所有服务器和主机位于同一数据中心 。 如左图所示 , 结果表明 , 使用 DADI 可以明显减少容器的冷启动时间 。
我们在公共云上创建了 1000 个 VM , 并将他们用做容器的主机 。 在每个主机上启动 10 个容器 , 总共 10000 个容器 。 测试使用 Python 编写的一个小程序 Agility , 访问 HTTP 服务器并在服务端记录时间 。 如右图所示 , 结果表明 DADI 的冷启动在 3 秒之内快速完成 。
DADI 在阿里巴巴的规模化运行

DADI 已经在阿里巴巴集团规模化运行 , 在阿里巴巴的生产环境内大规模部署 。 数据显示 DADI 在 10000个宿主机上启动 10000 个容器仅需3-4 秒 。 DADI 完美应对双十一大促洪峰 , 目前在阿里巴巴集团内部已经部署了接近十万台服务器宿主机 , 支持集团 Sigma、搜索、UC 等业务在线、离线应用超过 2 万个 , 极大提高了应用发布、扩容效率 , 体验如丝般顺滑 。 我们在全球最大的电子商务平台之一的生产环境中使用 DADI 的经验表明 , DADI 在提高部署应用的敏捷性和弹性方面非常有效 。