技术解读:Dragonfly 基于 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 进行按需加载可以最大限度提升镜像下载速度,未来我们也会继续努力建设镜像加速领域的生态链。

关于视频回放

【视频回放】:视频回访已上传至龙蜥官网:https://openanolis.cn/video 查看。

相关链接:

龙蜥云原生SIG地址链接:
https://openanolis.cn/sig/cloud-native
项目地址:
https://github.com/dragonflyoss/Dragonfly2
官网:
https://d7y.io/Slack:
https://cloud-native.slack.com/messages/dragonfly/
Twitter:
https://twitter.com/dragonfly_oss
Developer Group Email:
dragonfly-developers@googlegroups.com

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多行书写的字符串字面值

#include<iostream>using namespace std;int main(){cout<<"Hello Word!""Best Coder!"<<endl;return 0;}

c++中值得初始化

代码中四种初始化&#xff0c;a中都为0 #include<iostream> using namespace std;int main(){int a0;cout<<a<<endl;int a1{0};cout<<a1<<endl;int a2{0};cout<<a2<<endl;int a3(0);cout<<a3<<endl;return 0;}

Kruise Rollout:灵活可插拔的渐进式发布框架

前言 Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布&#xff0c;以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停&#xff0c;并提供旁路的无感对接、兼容已有的多…

最小生成树的Prime算法的思想

Prime算法的核心步骤是&#xff1a;在带权连通图中V是包含所有顶点的集合&#xff0c; U已经在最小生成树中的节点&#xff0c;从图中任意某一顶点v开始&#xff0c;此时集合U{v}&#xff0c;重复执行下述操作&#xff1a;在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边…

c++引用“”

常见的是“左值引用”在c11中新增了“右值引用” 引用&#xff1a;为对象起另外一个名字&#xff0c;引用类型引用另外一种类型。通过声明符写成&d的形式来定义引用类型&#xff0c;其中d是引用类型名。 例如&#xff1a; int a1024; int &ba;//那么b就等于a的值了…

一线技术人应该关注的四种思维能力

引言 作为长期奋战在一线的技术人&#xff0c;我深刻体会到如下几个思维能力对技术人成长的重要性&#xff0c;熟练运用这几种思维可以帮助我们快速的进入到新的领域&#xff0c;在分析、定位和解决问题上有很大帮助。 抽象思维&#xff1a;帮助我们快速抽取面对问题的关键要素…

Nacos 企业版如何提升读写性能和可观测性

概述 微服务引擎 MSE 发布 2.0.4.0 版本&#xff0c;新版本主要在性能和可观测能力升大幅提升&#xff0c;也加固了安全性。性能方面&#xff0c;基于 Dragonwell 进行构建&#xff0c;服务发现和配置性能提升达 40%以上&#xff1b;可观测方面&#xff0c;提供了服务注册的轨…

「技术人生」第9篇:如何设定业务目标

写在前面 上一篇文章讲了如何构建业务大图&#xff0c;看到有评论说这和设定 OKR 差不多啊。希望其他读者不要被类似的看法带偏。业务大图是业务顶层设计&#xff0c;是战略目标、业务长期价值、业务维度拆分、业务组织设计、业务长期发展方向、关键业务战役、短期重点事项的综…

SPFA总结

动态逼近法&#xff1a;设立一个先进先出的队列用来保存待优化的结点&#xff0c;优化时每次取出队首结点u&#xff0c;并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作&#xff0c;如果v点的最短路径估计值有所调整&#xff0c;且v点不在当前的队列中&#…

我们总结了 3 大使用建议,并首次公开 Nacos3.0 规划图

Nacos 是什么 Nacos 是 Dynamic Naming and Configuration-Service 的首字母简称&#xff0c;定位于一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。从 2018 年 7 月开始宣布开源以来&#xff0c;已经走过了第四个年头&#xff0c;在这四年里&#xff0c;备…

容斥原理 和 欧拉函数

在概率论中&#xff0c;对于概率空间中的事件A1&#xff0c;……&#xff0c;An&#xff0c;当n 2时容斥原理的公式为&#xff1a; 当n 3时&#xff0c;公式为&#xff1a; 一般地&#xff1a; 正数n的唯一素因子分解式p1^a1 * p2^a2 * p3^a3 ……* pk^ak 。求1&#xff0c;2…

递归函数时间复杂度分析

递归函数时间复杂度分析 (1) 递归执行过程 例子&#xff1a;求N!。 这是一个简单的"累乘"问题&#xff0c;用递归算法也能解决。 n! n * (n - 1)! n > 1 0! 1, 1! 1 n 0,1 因此&#xff0c;递归算法如下&#xff1a; Jav…

Dubbo 3 StateRouter:下一代微服务高效流量路由

目前的微服务架构中&#xff0c;通常包含服务消费者、服务提供者、注册中心、服务治理四元素&#xff0c;其中服务消费者会向注册中心获取服务提供者的地址列表&#xff0c;并根据路由策略选出需要调用的目标服务提供者地址列表&#xff0c;最后根据负载算法直接调用提供者。当…

首次全面解析云原生成熟度模型:解决企业「诊断难、规划难、选型难」问题

从“上云”到“云上”原生&#xff0c;云原生提供了最优用云路径&#xff0c;云原生的技术价值已被广泛认可。当前行业用户全面转型云原生已是大势所趋&#xff0c;用户侧云原生平台建设和应用云原生化改造进程正在加速。 然而&#xff0c;云原生复杂的技术栈和传统IT的历史包…

有效预警6要素:亿级调用量的阿里云弹性计算SRE实践

编者按&#xff1a;随着分布式系统和业务需求的飞速发展&#xff0c;监控告警在我们保障系统稳定性和事故快速恢复的全周期中都是至关重要的。9月3号&#xff0c;阿里云弹性计算管控SRE李成武老师(花名佐井)&#xff0c;受「TakinTalks稳定性社区」邀请&#xff0c;在线分享日常…

SSE指令集入门

Intel公司的单指令多数据流式扩展&#xff08;SSE&#xff0c;Streaming SIMD Extensions&#xff09;技术能够有效增强CPU浮点运算的能力。Visual Studio .NET 2003提供了对SSE指令集的编程支持&#xff0c;从而允许用户在C代码中不用编写汇编代码就可直接使用SSE指令的功能。…

浮点运算是什么?

简单说就是小数的加减乘除运算。 在计算机的硬件中是没有小数点这个东西的。cpu能处理的东西都是整的。所以&#xff0c;小数就要用类似科学计数法的方式来表示。如1.234在计算机里面&#xff0c;可以理解成用1234和-3两个整数来表示1234*10的-3次方&#xff0c;这类数就叫浮点…

CISC与RISC的区别?

CISC是指复杂指令系统计算机&#xff08;Complex Instruction Set Computer&#xff09;&#xff1b;RISC是指精简指令系统计算机&#xff08;Reduced Instruction Set Computer&#xff09;。这里的 计算机指令系统 指的是计算机的最低层的 机器指令 &#xff0c;也就是CPU能够…

EMR 重磅发布智能运维诊断系统(EMR Doctor)——开源大数据平台运维利器

大数据运维的挑战—如何保证集群稳定与运行效率 企业级大数据集群通常拥有海量的数据存储、日常运算成干上万的计算任务&#xff0c;需要满足各类上层业务的计算需求。对于这类集群的运维往往充满着挑战&#xff1a;海量的数据、庞杂的组件以及组件之间复杂的依赖关系、对于时…

DP为王——动态规划法学习笔记

动态规划英文名Dynamic Programming&#xff0c;这个名称总让人有一种时曾相识的感觉&#xff0c;可能是因为容易和“线性规划”之类的概念搞混。 首先&#xff0c;适用动态规划的问题十分广泛和常见——地图路径搜索&#xff08;深度优先、广度优先、A*&#xff09;&#xff0…