其他
适用场景全新升级!扩展 Dragonfly2 作为分布式缓存系统架构 | 龙蜥技术
Dragonfly2 简介
Manager:维护各 P2P 集群的关联关系、动态配置管理、用户态以及权限管理等功能。也包含了前端控制台,方便用户进行可视化操作集群。
Scheduler:为下载节点选择最优下载父节点。异常情况控制 Dfdaemon 回源。
Seed Peer:Dfdaemon 开启 Seed Peer 模式可以作为 P2P 集群中回源下载节点, 也就是整个集群中下载的根节点。
Peer:通过 Dfdaemon 部署,基于 C/S 架构提供 dfget 命令行下载工具,以及 dfget daemon 运行守护进程,提供任务下载能力。
问题背景
扩展 Dragonfly2
每个计算节点上(比如神龙)部署一个 dfdaemon,作为一个 peer 加入 P2P 网络。
接受来自本节点的请求
为其他 peer 提供上传服务
每个 peer 只负责管理自己本地的 cache 数据,不负责回源,回源由业务进程负责
每个集群可以部署一个到多个基于 ECS 的 scheduler 节点。
记录文件 P2P 网络的文件信息
下载调度
多 scheduler 节点解决单点故障问题
每个 cache 系统中的文件都会通过 ringhash 映射到某个 scheduler 上
一个或者多个 Manager 作为集群管理者。
负责向 scheduler 和 peer 节点发送动态配置
收集 metrics 等信息
接口设计
dfdaemon 接口
pkg/rpc/dfdaemon/dfdaemon.proto
// Daemon Client RPC Service
service Daemon{
// Trigger client to download file
rpc Download(DownRequest) returns(stream DownResult);
// Get piece tasks from other peers
rpc GetPieceTasks(base.PieceTaskRequest)returns(base.PiecePacket);
// Check daemon health
rpc CheckHealth(google.protobuf.Empty)returns(google.protobuf.Empty);
}
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 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);
}
// 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
代码实现
upstream PR:https://github.com/dragonflyoss/Dragonfly2/pull/1227
使用方法
- 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
测试及效果
测试方法
# 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
测试效果
stat (本地存在cache) | 0.07 | |
/ | ||
/ | ||
相关阅读链接:
2、Dragonfly 架构文档:
3、Dragonfly 官网链接:
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。
往期精彩推荐
1.人人都可以参与开源!龙蜥社区最不容错过的开发者活动来了2.小龙力荐!人人都可以完成算法代码,简单易上手3.龙蜥开发者说:开源是场马拉松!来自广州大学姚同学的开源成长记 | 第 13 期4.浪潮信息工程师:带你了解设备透传虚拟机的快速启动技术优化方案