自研P2P镜像分发系统

2024-06-16 05:08
文章标签 镜像 系统 分发 p2p 自研

本文主要是介绍自研P2P镜像分发系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Overview

镜像P2P主要用于解决大规模容器分发场景下的镜像拉取性能问题,目前主流的开源解决方案有Dragonfly(Alibaba)以及Kraken(Uber),
这两种解决方案各有优缺点,设计模式也各有不同:

  • Dragonfly:采用supernode中心控制设计模式,所有的peer数据传输任务都由supernode负责调度,整个集群将管理集中在supernode组件
  • Kraken:采用随机分散设计模式,Tracker组件只负责管理所有peer的连接信息(包括各个peer拥有的数据),而实际的数据传输流程则交由各个peer自行协商决定

Eagle充分参考了Dragonfly,Kraken以及FID的原理和特性。
在上述项目基础上去掉了一些不必要特性,保留了最核心的组件和功能,精简而实用

特性支持

目前Eagle支持如下特性:

  • Non-invasive:Eagle对docker以及docker distribution代码无侵入,可以无感知对接
  • High-availability:Eagle从客户端侧以及服务端侧实现了Tracker以及Seeder的高可用,整个架构无单点故障
  • SSI(Seeder Storage Interface):EagleSeeder存储实现了插件式接口,用户可以根据SSI接口实现对接第三方存储(目前默认本地文件系统)
  • Host level speed limit:Eagle提供针对整个节点P2P下载和上传的网络限速功能
  • LRUCache delete policy:Eagle提供LRU算法实现Proxy测和Seeder测的磁盘回收功能,并提供参数限制Cache使用大小
  • Lightweight:Eagle由少数核心组件构成,理论上是P2P系统组件的最小集合,属于轻量级的解决方案

未来Eagle希望支持如下特性:

  • Peer optimal arithmetic:Eagle希望实现基于网络拓扑的Peer优选算法,提高传输效率以及节省跨IDC带宽
  • Push notification mechanism:实现镜像上传同步更新到Seeder Cache,这样可以最大限度减少Seeder回源操作

其中,Peer optimal arithmetic是目前所有开源项目都没有实现的特性(参考Kraken #244和Dragonfly #1311),也是本项目的重点研究对象

原理

Eagle由如下组件组成:

  • Proxy:部署在各个节点上,充当docker的代理,对docker拉取镜像的请求进行过滤以及将请求转发给P2P网络(EagleClient)
  • EagleClient:P2P网络中的Peer端,负责执行P2P下载以及上传具体任务
  • Seeder:种子服务器,负责生成镜像分层的种子文件,并充当P2P网络镜像分层数据文件的第一个上传Peer
  • Tracker:保存了P2P网络拓扑中每个Peer的地址信息,同时记录了每个Peer的数据下载情况
  • Origin:镜像仓库,可以是任何镜像仓库(docker distribution, harbor, quay等)的入口地址

整个架构图如下:
在这里插入图片描述

Workflow

当docker执行拉取镜像操作时,其请求会被Proxy劫持。Proxy会对请求进行过滤,如果是对镜像分层的拉取请求,则会转交给EagleClient执行;否则直接代理请求

EagleClient在接受到Proxy转发过来的请求后,首先判断本地磁盘是否存在对应的文件,如果存在则直接返回;否则进入P2P下载流程

整个P2P下载流程大致如下:

EagleClient首先会从Seeder获取镜像分层的种子文件。Seeder在接受到请求后,检查本地是否存在对应文件,如果不存在,则会回源拉取,然后根据数据文件生成种子文件,返回给EagleClient;并向Tracker宣布自己作为该镜像分层的uploader。EagleClient获取到种子文件后,会向Tracker获取P2P网络中该数据文件对应分片的Peer地址和下载信息,然后依据BT协议进行P2P下载

请求流程图如下:
在这里插入图片描述

实现

Eagle的代码短小而精炼,接下来我们从代码层面探讨一下上述特性的具体实现

GRPC

EagleClient使用GRPC协议从Seeder获取种子文件,以提高传输效率

协议文件metainfo.proto内容如下:

syntax = "proto3";package metainfo;// The metainfo service definition.
service MetaInfo {// Get metainforpc GetMetaInfo (MetaInfoRequest) returns (MetaInfoReply) {}
}// The request message containing the source request
message MetaInfoRequest {string url = 1;
}// The response message containing the metainfo bytes
message MetaInfoReply {bytes metainfo = 1;
}

EagleClient newMetaInfoClient

func (e *BtEngine) newMetaInfoClient() (pb.MetaInfoClient, error) {rsv, err := endpoint.NewResolverGroup("eagleclient")if err != nil {return nil, err}rsv.SetEndpoints(e.seeders)name := fmt.Sprintf("eagleclient-%s", picker.RoundrobinBalanced.String())balancer.RegisterBuilder(balancer.Config{Policy: picker.RoundrobinBalanced,Name:   name,Logger: zap.

这篇关于自研P2P镜像分发系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065527

相关文章

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网