适用场景全新升级!扩展 Dragonfly2 作为分布式缓存系统架构

Dragonfly2 简介

Dragonfly 作为龙蜥社区的镜像加速标准解决方案,是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率,最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。

现阶段 Dragonfly 基于 Dragonfly1.x 演进而来,在保持 Dragonfly1.x 原有核心能力的基础上,Dragonfly 在系统架构设计、产品能力、使用场景等几大方向上进行了全面升级。

Dragonfly 架构主要分为三部分 Manager、Scheduler、Seed Peer 以及 Peer 各司其职组成 P2P 下载网络,Dfdaemon 可以作为 Seed Peer 和 Peer。详细内容可以参考架构文档(链接见文末),下面是各模块功能:

  • Manager:维护各 P2P 集群的关联关系、动态配置管理、用户态以及权限管理等功能。也包含了前端控制台,方便用户进行可视化操作集群。
  • Scheduler:为下载节点选择最优下载父节点。异常情况控制 Dfdaemon 回源。
  • Seed Peer:Dfdaemon 开启 Seed Peer 模式可以作为 P2P 集群中回源下载节点, 也就是整个集群中下载的根节点。
  • Peer:通过 Dfdaemon 部署,基于 C/S 架构提供 dfget 命令行下载工具,以及 dfget daemon 运行守护进程,提供任务下载能力。

更多详细信息可以参考 Dragonfly 官网(链接见文末)。

问题背景

虽然 Dragonfly 的定位是一个基于 P2P 的文件分发系统,但是分发的文件必须是能够从网络上下载的文件,无论是 rpm 包还是容器镜像内容,最终都是有一个地址源的,用户可以通过 dfget 命令向 dfdaemon 发起下载请求,然后 Dragonfly P2P 系统负责下载,如果数据不在其他 Peer 上,那么 Peer 或者 SeedPeer 自己会回源,直接从源下载数据,然后返回给用户。

但是有些场景我们需要分发的数据是某个节点上生成的,不存在一个远端的源地址,这个时候 Dragonfly 就无法分发这种数据了。所以我们希望 Dragonfly 能够增加对这种场景的支持,其实相当于把 Dragonfly 当作了一个分布式的基于 P2P 的缓存和任意数据分发系统。

扩展 Dragonfly2

所以我们设想中的 Dragonfly 缓存系统架构是这样的:

  • 每个计算节点上(比如神龙)部署一个 dfdaemon,作为一个 peer 加入 P2P 网络。
    • 接受来自本节点的请求
    • 为其他 peer 提供上传服务
    • 每个 peer 只负责管理自己本地的 cache 数据,不负责回源,回源由业务进程负责
  • 每个集群可以部署一个到多个基于 ECS 的 scheduler 节点。
    • 记录文件 P2P 网络的文件信息
    • 下载调度
    • 多 scheduler 节点解决单点故障问题
    • 每个 cache 系统中的文件都会通过 ringhash 映射到某个 scheduler 上
  • 一个或者多个 Manager 作为集群管理者。
    • 负责向 scheduler 和 peer 节点发送动态配置
    • 收集 metrics 等信息

接口设计

dfdaemon 接口

原来的 daemon 接口:

pkg/rpc/dfdaemon/dfdaemon.proto
// Daemon Client RPC Service
service Daemon{// Trigger client to download filerpc Download(DownRequest) returns(stream DownResult);// Get piece tasks from other peersrpc GetPieceTasks(base.PieceTaskRequest)returns(base.PiecePacket);// Check daemon healthrpc CheckHealth(google.protobuf.Empty)returns(google.protobuf.Empty);
}

新增 4 个接口:

service Daemon { 
// Check if given task exists in P2P cache system
rpc StatTask(StatTaskRequest) returns(google.protobuf.Empty);
// Import the given file into P2P cache system
rpc ImportTask(ImportTaskRequest) returns(google.protobuf.Empty);
// Export or download file from P2P cache system
rpc ExportTask(ExportTaskRequest) returns(google.protobuf.Empty);
// Delete file from P2P cache system
rpc DeleteTask(DeleteTaskRequest) returns(google.protobuf.Empty);
}

scheduler 接口

原来的 scheduler 接口:

// Scheduler System RPC Service
service Scheduler{
// RegisterPeerTask registers a peer into one task.
rpc RegisterPeerTask(PeerTaskRequest)returns(RegisterResult);
// ReportPieceResult reports piece results and receives peer packets.
// when migrating to another scheduler,
// it will send the last piece result to the new scheduler.
rpc ReportPieceResult(stream PieceResult)returns(stream PeerPacket);
// ReportPeerResult reports downloading result for the peer task.
rpc ReportPeerResult(PeerResult)returns(google.protobuf.Empty);
// LeaveTask makes the peer leaving from scheduling overlay for the task.
rpc LeaveTask(PeerTarget)returns(google.protobuf.Empty);
}

新增 2 个接口,下载复用之前的 RegisterPeerTask()接口,删除复用之前的LeaveTask() 接口:

// Scheduler System RPC Service
service Scheduler{
// Checks if any peer has the given task
rpc StatTask(StatTaskRequest)returns(Task);
// A peer announces that it has the announced task to other peers
rpc AnnounceTask(AnnounceTaskRequest) returns(google.protobuf.Empty);
}

接口请求时序图

StatTask

ImportTask

ExportTask

DeleteTask

代码实现

目前代码已经合并,可以在 Dragonfly v2.0.3 版本中使用。

upstream PR:https://github.com/dragonflyoss/Dragonfly2/pull/1227

使用方法

除了增加新的接口之外,我们还增加了一个叫 dfcache 的命令,用于测试,使用方法如下:

- add a file into cache system
dfcache import --cid sha256:xxxxxx --tag testtag /path/to/file
- check if a file exists in cache system
dfcache stat --cid testid --local # only check local cache
dfcache stat --cid testid # check other peers as well
- export/download a file from cache system
dfcache export --cid testid -O /path/to/output
- delete a file from cache system, both local cache and P2P network
dfcache delete -i testid -t testtag

测试及效果

测试方法

通过新增的 dfcache 命令,在一个节点上向 P2P cache 系统中添加不同大小的文件,然后在另外一个节点上针对这个文件做查询、下载、删除等操作。例如:

# dd if=/dev/urandom of=testfile bs=1M count =1024
# dfcache stat -i testid # 检查一个不存在的文件
# dfcache import -i testid testfile
# on another node
# dfcache stat -i testid
# dfcache export -i testid testfile.export

测试效果

两台 ecs,网络走 vpc,带宽 3.45 Gbits/s (约 440MiB/s):

下载的 ecs 磁盘带宽 180MiB/s 左右:

相关阅读链接:

1.Dragonfly1.x 链接地址:https://github.com/dragonflyoss/Dragonfly

2.Dragonfly 架构文档:https://d7y.io/zh/docs/concepts/terminology/architecture/

3.Dragonfly 官网链接:https://d7y.io/

4.龙蜥云原生SIG地址链接:https://openanolis.cn/sig/cloud-native

原文链接

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

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

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

相关文章

sdut1197约瑟夫问题

#include <stdio.h> int main( void ) {int n, i 0, m, p,ans;scanf("%d%d", &n, &m); //n总人数&#xff0c;m步长while( i < n ){p i * m;while (p > n)p p - n (p - n - 1)/(m - 1);// printf("%d\n", p);ansp;}printf("…

sdut2056不敢死队问题

#include <stdio.h> int main( void ) {int n;while(scanf("%d",&n),n){int i 0, m5, p,ans,l0;// scanf("%d", &n); //n总人数&#xff0c;m步长while( i < n ){p i * m;while (p > n)p p - n (p - n - 1)/(m - 1);l;if(p1)print…

hdu1257 最少拦截系统【想了好久】

最少拦截系统 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Problem Description某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超…

sdut 最长公共子序列问题

Problem Description 从一个给定的串中删去&#xff08;不一定连续地删去&#xff09;0个或0个以上的字符&#xff0c;剩下地字符按原来顺序组成的串。例如&#xff1a;“ ”&#xff0c;“a”&#xff0c;“xb”&#xff0c;“aaa”&#xff0c;“bbb”&#xff0c;“xabb”&a…

hdu1176 免费馅饼 动态规划 二维数组实现

免费馅饼 Time Limit: 1000MS Memory Limit: 32768KBSubmit Statistic DiscussProblem Description 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&am…

sdut 取数字问题(深搜,动态规划)

/*首先看见这题想到的就是DFS但是求的是最短路径因此可以利用BFS&#xff0c;但是BFS学的太渣了&#xff0c;还是用动态规划来试试&#xff01;dp[i][j]表示走到第i行j列时候的路径dp[i][j]min(dp[i-1][j],dp[i][j-1])a[i][j];但是这样写的缺陷是不能找出最小正整数的路径#incl…

如何通过链路追踪进行定时任务诊断

背景简介 什么是定时任务 定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务技术方案》。 什么是链路追踪 随着分布式微服务化架构在企业中大规模运用&#xff0c;业务运行的应用平台是一…

关于平台工程的开发者工具链,你还想加点啥?

前言 从 Kubernetes 诞生以来&#xff0c;以 DevOps、容器化、可观测、微服务、Serverless 等技术为代表的云原生&#xff0c;催生了应用架构新一轮的升级。有意思的是&#xff0c;与以往的技术迭代更新不同&#xff0c;原本是一个技术圈常规的一次技术实践&#xff0c;在千行…

sdut 走迷宫

走迷宫Time Limit: 1000MS Memory limit: 65536K题目描述一个由n * m 个格子组成的迷宫&#xff0c;起点是(1, 1)&#xff0c; 终点是(n, m)&#xff0c;每次可以向上下左右四个方向任意走一步&#xff0c;并且有些格子是不能走动&#xff0c;求从起点到终点经过每个格子至多一…

阿里云联合“产学研媒”发起 BizDevOps 共促计划,助力企业提升组织效能

2012年全球最具影响力的独立研究咨询机构Forrester曾预言&#xff1a;“In the future, all companies will be software companies”&#xff08;在未来&#xff0c;所有的企业都将成为软件企业&#xff09; 近10年来&#xff0c;DevOps运动在全球和中国风起云涌&#xff0c;…

Kubernetes HPA 的三个误区与避坑指南

前言 云计算带来的优势之一便是弹性能力&#xff0c;云原生场景下Kubernetes提供了水平弹性扩容能力&#xff08;HPA&#xff09;&#xff0c;让应用可以随着实时指标进行扩/缩。然而HPA的实际工作情况可能和我们直观预想的情况是不一样的&#xff0c;这里面存在一些认知误区。…

K8s有损发布问题探究

问题提出 流量有损是在应用发布时的常见问题&#xff0c;其现象通常会反馈到流量监控上&#xff0c;如下图所示&#xff0c;发布过程中服务RT突然升高&#xff0c;造成部分业务响应变慢&#xff0c;给用户的最直观体验就是卡顿&#xff1b;或是请求的500错误数突增&#xff0c…

解读 K8s Pod 的13种典型异常

在K8s中&#xff0c;Pod作为工作负载的运行载体&#xff0c;是最为核心的一个资源对象。Pod具有复杂的生命周期&#xff0c;在其生命周期的每一个阶段&#xff0c;可能发生多种不同的异常情况。K8s作为一个复杂系统&#xff0c;异常诊断往往要求强大的知识和经验储备。结合实战…

实践教程之如何快速使用 PolarDB-X

PolarDB-X 为了方便用户体验&#xff0c;提供了免费的实验环境&#xff0c;您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验&#xff0c;PolarDB-X 也提供免费的视频课程&#xff0c;手把手教你玩转 PolarDB-X 分布式数据库。 本期实验可以让您快…

实践教程之如何将 PolarDB-X 与大数据等系统互通

本期实验将指导您使用PolarDB-XCanalClickHouse搭建实时分析系统。 本期免费实验地址 本期教学视频地址 前置准备 假设已经根据前一讲内容完成了PolarDB-X的搭建部署&#xff0c;可以成功链接上PolarDB-X数据库。 实践教程之如何快速安装部署PolarDB-X 部署Canal Canal是…

caffe安装 cuda安装 opencv安装 cudnn安装 python相关依赖库安装

1安装cuda8.0 安装依赖库 #sudo apt-get install g #sudo apt-get install git #sudo apt-get install freeglut3-dev Ctraltf4 进入后台 输入用户名和密码 User&#xff1a; Password&#xff1a; #sudo vi /etc/modprobe.d/blacklist-nouveau.conf 输入 blacklistnouve…

加载速度提升 15%,关于 Python 启动加速探索与实践的解析

编者按&#xff1a;在刚刚结束的 PyCon China 2022 大会上&#xff0c;龙蜥社区开发者严懿宸分享了主题为《Python 启动加速的探索与实践》的技术演讲。本次演讲&#xff0c;作者将从 CPython 社区相关工作、本方案的设计及实现&#xff0c;以及业务层面的集成等方面进行介绍。…

统信软件高级工程师:关于云原生技术在容器方面的应用介绍

编者按&#xff1a;随着近几年来云原生生态的不断壮大&#xff0c;众多企业纷纷开展了用云上云的工作&#xff0c;学习云原生及容器技术对于现代工程师是必不可少的。本文整理自龙蜥大讲堂 54 期&#xff0c;统信高级研发工程师参与技术分享&#xff0c;为大家介绍了云原生的介…

sdut 区间覆盖问题

区间覆盖问题 Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic DiscussProblem Description 用i来表示x坐标轴上坐标为[i-1&#xff0c;i]的长度为1的区间&#xff0c;并给出n&#xff08;1≤n≤200&#xff09;个不同的整数&#xff0c;表示n个这样的区间。 现在要…

opencv mat数据剪裁感兴趣的部分处理方法

Mat srcImage_r imread("c_d_right.jpg",1);Mat srcImage_l imread("c_d_left.jpg",1);Mat vv(srcImage_r,Rect(10,10,100,100));imshow("vv", vv);