1. 技术定义
P2P 即 peer-to-peer,节点将自己的一部分计算、存储或网络资源直接提供给其他节点使用,节点既是资源的供应者又是资源的消费者,这一点与传统的 client-server 模型有着显著区别。P2P 技术被广泛应用于文件分发领域。
2. 发展历史
P2P 镜像加速开源框架的发展历史:
- Dragonfly: 阿里巴巴开源的基于 P2P 的智能镜像和文件分发工具。
- 2017 年 11 月: Dragonfly 1.x 正式开源。
- 2018 年 10 月: 进入 CNCF Sandbox。
- 2020 年 4 月: 进入 CNCF Incubating。
- 2021 年 4 月: Dragonfly 2 正式开源,基于 Dragonfly 1.x 的已有问题做了大量优化。
- Kraken: Uber 开源的基于 P2P 的容器镜像服务。
- 2018 年正式开源。
3. 框架分析
3.1 Dragonfly
Manager: 维护各 P2P 集群的关联关系、动态配置管理、用户态以及权限管理等功能。也包含了前端控制台,方便用户进行可视化操作集群。
Scheduler: 为下载节点选择最优下载父节点。异常情况控制 Dfdaemon 回源。
Seed Peer: Dfdaemon 开启 Seed Peer 模式可以作为 P2P 集群中回源下载节点, 也就是整个集群中下载的根节点。
Peer: 通过 Dfdaemon 部署,基于 C/S 架构提供 dfget 命令行下载工具,以及 dfget daemon 运行守护进程,提供任务下载能力。
性能测试
测试结果表明 Nydus Mirror 模式和 Dragonfly P2P 集成, 使用 Nydus 下载镜像对比 OCIv1 的模式, 能够有效减少镜像下载时间。Nydus 冷启动和 Nydus & Dragonfly 冷启动数据基本接近。 其他命中 Dragonfly Cache 的结果均好于只使用 Nydus 的情况。最重要的是如果很大规模集群使用 Nydus 拉取镜像, 会将每个镜像层的下载分解按需产生很多 Range 请求, 增加镜像仓库源站 QPS。 而 Dragonfly 可以基于 P2P 技术有效减少回源镜像仓库的请求数量和下载流量。 最优的情况,Dragonfly 可以保证大规模集群中每个下载任务只回源一次。
3.2 Kraken
Agent
- 部署在每台主机上
- 实现 Docker 镜像仓库接口
- 向 Tracker 注册可用的内容
- 连接 peers 下载内容
Origin
- 专用的 seeders
- 将 blobs 作为文件存储在存储服务中(例如 S3、GCS、ECR)
- 形成一个哈希环来分配负载
Tracker
- 跟踪 peers 有哪些内容
- 为给定的 blob 提供需要连接的 peers 列表
Proxy
- 实现 Docker 镜像仓库接口
- 将 image layer 上传到 Origin
- 将 tags 上传到 build-index
build-index
- 将 tags 映射到 blob 摘要
- 支持集群之间的镜像复制
- 将 tags 作为文件存储在存储服务中(例如 S3、GCS、ECR)
性能测试
通过2600个节点并发拉取3G大小且拥有2个镜像层的镜像文件,每个agent有300MB/s的带宽限制。P50拉取时间为10s,P99拉取时间为18s。
4. Dragonfly 和 Kraken 对比
基于项目整体成熟度,社区活跃度、用户数量、架构复杂度,是否针对 Nydus 优化,未来发展趋势等因素综合考虑,Dragonfly 是 P2P 项目中最优的选型。