查看原文
其他

技术漫谈 | dragonfly 之 p2p 镜像分发

吴鹏 Wise2C 2022-11-10

支持https harbor,公有或私有仓库 支持push image

一、什么是dragonfly

Dragonfly 是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高文件传输的效率和速率,最大限度地利用网络带宽,尤其是在分发大量数据时,例如应用分发、缓存分发、日志分发和镜像分发。


在阿里巴巴,Dragonfly 每个月会被调用 20 亿次,分发的数据量高达 3.4PB。Dragonfly 已成为阿里巴巴基础设施中的重要一环。


尽管容器技术大部分时候简化了运维工作,但是它也带来了一些挑战:例如镜像分发的效率问题,尤其是必须在多个主机上复制镜像分发时。


Dragonfly 在这种场景下能够完美支持 Docker 和 PouchContainer。它也兼容其他格式的容器。相比原生方式,它能将容器分发速度提高 57 倍,并让 Registry 网络出口流量降低 99.5%。


Dragonfly 能让所有类型的文件、镜像或数据分发变得简单而经济。


2、Dragonfly 有何优势(具备以下特性)?

  • 基于 P2P 的文件分发:通过利用 P2P 技术进行文件传输,它能最大限度地利用每个对等节点(Peer)的带宽资源,以提高下载效率,并节省大量跨机房带宽,尤其是昂贵的跨境带宽。

  • 非侵入式支持所有类型的容器技术:Dragonfly 可无缝支持多种容器用于分发镜像。

  • 机器级别的限速:除了像许多其他下载工具(例如 wget 和 curl)那样的针对当前下载任务的限速之外,Dragonfly 还支持针对整个机器的限速。

  • 被动式 CDN:这种 CDN 机制可防止重复远程下载。

  • 高度一致性:Dragonfly 可确保所有下载的文件是一致的,即使用户不提供任何检查代码(MD5)。

  • 磁盘保护和高效 IO:预检磁盘空间、延迟同步、以最佳顺序写文件分块、隔离网络-读/磁盘-写等等。

  • 高性能:SuperNode 是完全闭环的,意味着它不依赖任何数据库或分布式缓存,能够以极高性能处理请求。

  • 自动隔离异常:Dragonfly 会自动隔离异常节点(对等节点或 SuperNode)来提高下载稳定性。

  • 对文件源无压力:一般只有少数几个 SuperNode 会从源下载文件。

  • 支持标准 HTTP 头文件:支持通过 HTTP 头文件提交鉴权信息。

  • 有效的 Registry 鉴权并发控制:减少对 Registry 鉴权服务的压力。

  • 简单易用:仅需极少的配置。



3、dragonfly原理

Dragonfly 下载普通文件和下载容器镜像的工作原理略有不同。

下载普通文件

SuperNode 充当 CDN,并负责调度对等节点(Peer)之间的文件分块传输。dfget 是 P2P 客户端,也称为“Peer”(对等节点),主要用于下载和共享文件分块。


下载镜像文件

Registry 类似于文件服务器。dfget proxy 也称为 dfdaemon,会拦截来自 docker pull 或 docker push 的 HTTP 请求,然后使用 dfget 来处理那些跟镜像分层相关的请求。




下载文件分块

每个文件会被分成多个分块,并在对等节点之间传输。一个对等节点就是一个 P2P 客户端。SuperNode 会判断本地是否存在对应的文件。如果不存在,则会将其从文件服务器下载到 SuperNode。




四、dragonfly部署(参考dragonfly官网)

https://d7y.io/zh-cn/



五、dragonfly https的harbor

dragonfly 常见问题

https://github.com/dragonflyoss/Dragonfly/blob/master/FAQ.md

目的:启用 docker PROXY 让dragonfly 支持https


1、部署https harbor

https://github.com/goharbor/harbor/blob/master/docs/configure_https.md


2、部署docker_proxy

pull images

pull_images.sh

#!/bin/sh
docker_registry_proxy="dockerhubwp/docker_proxy_nginx:latest"
supernode="registry.cn-hangzhou.aliyuncs.com/alidragonfly/supernode:0.2.0"
dfclient="dockerhubwp/dfclient:latest"

images="${docker_registry_proxy} ${supernode} ${dfclient}"

function pullImage(){
for image in ${images}; do
echo -e "pull image ======>${image}"
docker pull ${image}
done
}

pullImage

docker_proxy.sh

#! /bin/sh

# Separate deployment docker_proxy

# dfdaemon and docker registry map
# example x.x.x
registry="harbor域名"
containername=docker_registry_proxy
# 你需要配置的dns 服务器 (如:dnsmasq)
DNS_SERVER="dns-server"
docker_registry_proxy="dockerhubwp/docker_proxy_nginx:latest"

# get localhost ip
ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
localhostIp=$(echo ${ipaddr} | cut -d " " -f 1)

function changeDockerProxy() {
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOD >/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:3128/"
Environment="HTTPS_PROXY=http://127.0.0.1:3128/"
EOD
}

function dockerDockerProxyRun() {
if [[ 0 != $(docker ps -a | grep ${containername} | wc -l) ]]; then
docker rm -f ${containername}
fi
docker run --restart=always --privileged=true --name ${containername} -d -p 0.0.0.0:3128:3128 -v /etc/docker_proxy_nginx/docker_mirror_certs:/ca -v /var/log/docker_proxy_nginx:/var/log/nginx/ -e DRAGONFLY_REGISTRIES="${registry},http://${localhostIp}:65001" -e REGISTRIES="${registry}" -e DNS_SERVER=${DNS_SERVER} ${docker_registry_proxy}
}

changeDockerProxy

systemctl daemon-reload
systemctl restart docker

dockerDockerProxyRun


3、部署dragonfly

部署Supernode

supernode.sh

#!/bin/sh

# Separate deployment supernode

supernode="registry.cn-hangzhou.aliyuncs.com/alidragonfly/supernode:0.2.0"
containername=supernode

function superNode() {
if [[ 0 != $(docker ps -a | grep ${containername} | wc -l) ]]; then
docker rm -f ${containername}
fi
docker run --name ${containername} --restart=always -d -p 8001:8001 -p 8002:8002 ${supernode}
}
superNode


部署dfclient

dfclient.sh

#!/bin/sh

# Separate deployment docker_proxy

dfclient="dockerhubwp/dfclient:latest"

#harbor 地址
dfdaemon_registry="https://x.x.x"
containername=dfclient

# supernode ips example (10.0.0.160,10.0.0.162)
supernodes="supernodeip"


ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
localhostIp=$(echo ${ipaddr} | cut -d " " -f 1)

cat <<EOD >/etc/dragonfly.conf
[node]
address=${supernodes}
EOD


function startDfClient() {
if [[ 0 != $(docker ps -a | grep ${containername} | wc -l) ]]; then
docker rm -f ${containername}
fi
docker run --name ${containername} --restart=always -d -p 65001:65001 -v /root/.small-dragonfly:/root/.small-dragonfly -v /etc/dragonfly.conf:/etc/dragonfly.conf -e dfdaemon_registry=${dfdaemon_registry} -e localhostIp=${localhostIp} ${dfclient}
}

startDfClient

最后

trust.sh

#!/bin/sh

# trust ca

curl http://127.0.0.1:3128/ca.crt >/etc/pki/ca-trust/source/anchors/docker_proxy_nginx.crt

update-ca-trust

docker pull x.x.x/library/nginx:latest


参考:

https://d7y.io/zh-cn/

https://github.com/goharbor/harbor/

https://github.com/rpardini/docker-registry-proxy

https://github.com/chobits/ngx_http_proxy_connect_module


关于睿云智合


深圳睿云智合科技有限公司成立于2012年,总部位于深圳,并分别在成都、深圳设立了研发中心,北京、上海设立了分支机构,核心骨干人员全部为来自金融、科技行业知名企业资深业务专家、技术专家。早期专注于为中国金融保险等大型企业提供创新技术、电子商务、CRM等领域专业咨询服务。


自2016年始,在率先将容器技术引进到中国保险行业客户后,公司组建了专业的容器技术产品研发和实施服务团队,旨在帮助中国金融行业客户将容器创新技术应用于企业信息技术支持业务发展的基础能力改善与提升,成为中国金融保险行业容器技术服务领导品牌。


此外,凭借多年来在呼叫中心领域的业务经验与技术积累,睿云智合率先在业界推出基于开源软交换平台FreeSwitch的微服务架构多媒体数字化业务平台,将语音、视频、webchat、微信、微博等多种客户接触渠道集成,实现客户统一接入、精准识别、智能路由的CRM策略,并以容器化治理来支持平台的全应用生命周期管理,显著提升了数字化业务处理的灵活、高效、弹性、稳定等特性,为帮助传统企业向“以客户为中心”的数字化业务转型提供完美的一站式整体解决方案。


客户与合作伙伴


大家快来扫我!

这里有你想了解的行业资讯和你所需要的技术干货!!


大家关注【Wise2C】后回复【进群】,睿云小助手会第一时间把拉你进入【 Docker企业落地实践群】,我们分享的各个企业案例项目的技术专家与用户代表,正在敬候您的光临!

若需要了解更多有关Wise系列PaaS产品的详情,请与我们的市场团队联系:contact@wise2c.com



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存