上世纪末期,基于
C/S
模式的思想,人们发展了HTTP
、FTP
等应用层协议。然而C/S
模式的弊端很明显:服务器的负载过大,下载速率过慢。基于上述背景,有人结合P2P
网络与负载均衡的思想,提出P2P
下载模式。
背景
网络下载
提起网络下载领域,你应该首先会想到基于TCP/IP
协议簇的C/S
模式。这种模式希望每一个客户机都与服务器建立TCP
连接,服务器轮询监听TCP
连接并依次响应,如下图:
上世纪末期,基于C/S
模式的思想,人们发展了HTTP
、FTP
等应用层协议。然而C/S
模式的弊端很明显:服务器的负载过大,下载速率过慢。随着互联网规模的增大以及客户对于下载数据大小,下载速率等需求的上升,这些弊端被不断放大。
P2P 下载原理
基于上述背景,有人结合P2P
网络与负载均衡的思想,提出P2P
下载模式。这种模式不再把所有的下载压力丢给服务器,服务器只负责传递文件元数据,真正的文件下载连接建立在客户机与客户机之间。同时一个文件可以被分片为多个块,同一个文件中不同的块可以在不同的客户机之上下载,使得下载文件在P2P
网络中动态流通,大幅提升了下载效率,如下图:
去中心化的P2P
下载基于DHT
技术,它采用分布式全网方式来进行信息的存储和检索。所有信息均以哈希表条目形式加以存储,这些条目被分散地存储在各个节点上,从而以全网方式构成一张巨大的分布式哈希表。在此基础上做到对单服务器的去中心化,哈希表负责对负载的分摊,将全网负载均摊到多个机器之上。
Dragonfly
简介及架构概述
Dragonfly
是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率,最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。
原理
Dragonfly
结合C/S
架构与P2P
架构的优点。它提供面向客户的C/S
架构下载模式。同时它也提供面向服务器集群的P2P
回源模式,与传统P2P
不同的是,对等网络建立在Scheduler
内部,目标是最大化P2P
内部下载效率,如下图:
架构简介
Dragonfly
面向镜像分发和文件分发,结合P2P
网络和服务器集群的思想,向用户提供稳定的、高效的下载服务。Dragonfly
希望在服务器内部构建P2P
网络,将服务器的不同主机节点分为 Manager、Scheduler、Seed Peer 以及 Peer 四个角色,分别提供不同的功能。
其中Manager
提供总体配置功能,拉取其他角色的配置并相互通信。Scheduler
提供下载调度功能,其调度结果直接影响下载速率。Seed Peer
负责回源下载,从外部网络中拉取所需的镜像或文件。Peer
作为C/S
架构中的服务器,通过多种协议向客户提供下载功能。架构图如下:
其中,Seed Peer
支持使用多种协议从外部网络中回源下载,同时也支持当作集群当中一个Peer
使用。Peer
提供基于多种协议的下载服务,也提供为镜像仓库或其他下载任务的代理服务。
组件详解
Manager
Manager
在多P2P
集群部署的时候扮演管理者的角色,提供前端控制台方便用户进行可视化操作P2P
集群。其主要提供动态配置管理、维护集群稳定性以及维护多套P2P
集群的关联关系等功能。对于维护集群整体稳定性Manager
和各个服务保持Keepalive
保证能够在实例异常情况下将异常实例进行剔除。动态配置管理可以在Manager
上面操作各个组件的控制单元,比如控制Peer
和Seed Peer
的负载数,Scheduler
调度Parent
的个数等。Manager
也可以维护多套P2P
集群关联关系,一个Scheduler Cluster
、一个Seed Peer Cluster
和若干个Peer
组成一个完整的P2P
集群,当然不同P2P
集群可以是网络隔离的。正常情况下采用一个机房一套P2P
集群,统一由一个Manager
管理多个P2P
集群。
Scheduler
Scheduler
主要工作就是为当前下载节点寻找最优父节点并触发Seed Peer
进行回源下载。在适当时候让Peer
进行回源下载。Scheduler
在启动时,先向Manager
注册,注册成功后初始化动态配置客户端,并从Manager
拉取动态配置,接下来启动Scheduler
自身所需的服务。
Scheduler
的核心就是选取一组最优Parent
节点供当前下载Peer
进行下载。Scheduler
面向Task
,一次Task
就是一次完整的下载任务,在Scheduler
中存储Task
信息和相应P2P
下载网络的DAG
。调度过程是首先过滤异常Parent
节点,根据多维度进行过滤,比如判断该Peer
是否是BadNode
,判断逻辑为假设每个节点的响应时长都遵循正态分布,若一个节点目前的响应时长处于 6σ 范围之外,那么认为该节点是BadNode
,剔除该节点。再根据历史下载特征值对剩余待定Parent
节点进行打分,返回一组分数最高的Parent
提供给当前Peer
进行下载。
Seed Peer
和Peer
Seed Peer
和Peer
有很多相似之处。他们都是基于Dfdaemon
,不同的是Seed Peer
采用Seed Peer
模式,支持主动触发回源下载。Peer
采用Peer
模式,作为C/S
架构中的服务器向用户提供下载功能,支持被Scheduler
被动触发回源下载。这表明Peer
和Seed Peer
的关系不是固定的,一个Peer
可以通过回源使自己成为Seed Peer
,Seed Peer
也可以改动运行状态变为Peer
,Scheduler
会动态地对相应DAG
进行改动。另外Seed Peer
和Peer
都需要参与调度下载过程当中,Scheduler
可能会选取Seed Peer
或者Peer
作为父节点向其他Peer
提供下载功能。
Dfstore 和 Dfcache
Dfcache
是dragonfly
的缓存客户端,它与dfdaemon
通信并对P2P
网络中的文件进行操作,其中P2P
网络充当缓存系统。可以在Scheduler
中存储相应Task
和DAG
。
Dfstore
是dragonfly
存储客户端. 其可以依赖不同类型的对象存储服务作为Backend
,提供稳定的存储方案,现在支持S3
和OSS
。Dfstore
依赖Backend
对象存储服务结合P2P
本身的加速特点。可做到快写快读,并且能够节省回源以及跨机房流量,减少源站压力。
优势
稳定性
Dragonfly
会自动隔离异常节点来提高下载稳定性,Dragonfly
中各个组件通过Keepalive
与Manager
进行联系,Manager
能够保证返回给Peer
的Scheduler
地址和返回给Scheduler
的Seed Peer
地址都是可用的。不可用的Scheduler
和Seed Peer
不会被Manager
推给需要进行下载任务的Peer
或Scheduler
,从而达到隔离异常节点的目的,这也是实例维度的异常隔离,如下图:
另外Dragonfly
在调度时以Task
为单位,也确保了整个调度过程的稳定性。在收到一个新的Task
调度请求之后,Scheduler
触发Seed Peer
进行回源下载;在收到一个已有Task
的调度请求之后,Scheduler
调度最优Parent Peer
集合返回给Peer
。这个逻辑确保了无论Task
是否下载过,Dragonfly
都可以对其进行处理。此外在Scheduler
调度过程中,对响应时长过慢的Peer
,认为目前是异常节点,将不会作为Parent Peer
被返还。这也是Task
维度的异常隔离。
高效性
Dragonfly
采用P2P
进行服务端内部的回源,P2P
下载本身即分摊负载,将每个服务端节点的负载降到最低,有以下几个细节保证了Dragonfly
下载的高效性:
-
Scheduler
通过为每个可能的Parent
打分,返回给Peer
目前局部最优的Parent
集合,Peer
基于此集合做下载。 -
下载过程基于
Task
,每个Task
将待下载文件分为多个Piece
,Peer
拿到了最优的Parent
之后,向此集合广播每个Piece
的下载请求,集合中的Parent
收到该请求后返回给Peer
对应Piece
的元信息,Peer
将第一个收到的Piece
元信息所对应的Parent Peer
作为该Piece
的实际下载源。该做法考虑到Scheduler
返回可用Parent
到触发下载这段时间内可能的变化,同时对不同的Piece
,允许Peer
向不同的下载源获取数据。 -
Dfdaemon
分为Seed Peer
模式和Peer
模式,允许Seed Peer
和Peer
进行切换,可以根据实际需求改变作为Seed Peer
和Peer
的机器数目,动态调整更适应实际情况。
简单易用
Dragonfly
提供Helm Charts
、Docker Compose
、Docker Image
以及二进制的多种部署方式。用户可以快速一键部署进行一次简单POC
,并且也可以基于Helm Charts
进行大规模生产部署。当然Dragonfly
各个服务都有完善的Metrics
也提供现成的Granafa
模版,方便用户观察P2P
的流量走势。
Dragonfly
作为CNCF
在镜像加速领域标准解决方案,结合Dragonfly
子项目Nydus
进行按需加载可以最大限度提升镜像下载速度,未来我们也会继续努力建设镜像加速领域的生态链。感谢所有参与到社区建设的同学,希望有更多对镜像加速领域或P2P
感兴趣的同学加入(文末扫描二维码或搜索钉钉群号:44701621进群交流)到我们的社区当中。