利用 Docker 云仓库分发超级大文件的新方法

导 读

如果您要交付 30GB 以上的超级大文件给他人,例如一组分布在不同地域的潜在客户,该怎么做呢?本文介绍了一个新方法:利用公有云镜像仓库作为分发中介,将大文件分割为 1GB 左右的分片,然后用 Docker 镜像包裹起来,推送到云仓库;拉取的过程正好相反。在云计算时代,对云用户来说,容量大且廉价的云仓库有近水楼台之便利。

1、为什么要交付超级大文件

新工具的出现总是因应实际技术需求或社会需求而诞生的。

最近,公司大佬提出一项需求,面向不特定潜在客户交付一个超级巨大的二进制文件,要求能通过互联网快速下载,文件大小大约在 30~50GiB。

比较了现有的几个大文件服务方案,发现都有不足或者不能满足需求。网盘曾经兴盛一时,但是随着商业化加深,已不再免费提供大文件下载服务,下载速度也降为龟速。P2P 文件共享主要面向公众,与定向交付需求不符合。FTP 方法需要架设 FTP 服务器,下载时还受限于网络带宽。

联想到经常使用的云镜像仓库,因其高速、开放和免费的特点,拟选择作为交付大文件的基础服务。因为交付文件过于巨大,甚至超过云仓库的对单个镜像的最大限制。所以将大文件均等地分割为若干个文件分片,再将文件分片塞到 Docker 镜像里去。

2、技术原理及其实现

技术原理

本方法技术原理的三个要点:

将大文件均等地分割为等长的若干个文件分片。例如:典型的分片大小是 100MB 或者 1GiB。

构建为容器镜像,将文件分片拷贝到镜像文件系统,所依赖的基础镜像足够小(5~6MB),因此有效载荷比足够高。将包含文件分片的容器镜像推送到云镜像仓库。接收方逆序操作,拉镜像、合并文件分片,重新构建原始大文件,最后交付大文件给用户。

使用多并发技术加速分发和接收过程。带宽足够的话,推送或拉取的速度与并发数 成比例增长。

软件实现

下面两张图是分发/推送和接收/拉取大文件的时序图。

图 分发/推送大文件时序图(并行模式)

图 接收/拉取大文件时序图(并行模式)

3、如何规划你的大文件交付方案

在决定是否用这个工具方法来分享大文件之前,请先思考几个问题。

■ 待分发(交付)的文件是不是足够大

交付几百兆的文件,用这个方法的意义不是很大,因为有很多途径可以交付出去,当 然这个方法也是可以支持的。

交付文件的最佳大小范围是 5~100GiB。镜像仓库对单个镜像大小有限制,推送或拉取的单个镜像太大也会影响效率。对大文件进行分片,能规避这些技术限制,并有良好的性能表现。

理论上讲,用本方法交付文件的大小上限是很宽泛的,仅仅受限于文件系统容量、镜像仓库容量等外在条件。

■ 需要一个有访问权限的镜像仓库和相应的仓库账号

镜像仓库应该被您和您的交付对象都能访问到。

准备一个有写权限的仓库账号,您可用来推送镜像分片。

准备一个有读权限的仓库账号,您的交付对象可用来拉取镜像分片。当然也可以完全 公开,任何人都可以自由地拉镜像,前提是知道镜像名和访问路径。

■ 规划文件分片大小和并发数

文件分片大小由程序自适应控制,默认设置是:2GiB 以下的文件,分片大小固定为100MB;2GiB 及以上的文件,分片大小固定为 1GiB。

适当的并发数能显著提升拉镜像和合并文件的速度。默认的并发数是 5 个,运行时可以传入并发数参数,并发数应当与文件分片数、接入网络带宽和镜像仓库网速相适应。例如:20 个分片的文件,并发数设为 5~10 个都是可以的。举个反例,5 个分片的文件,并发数设为 10 个就不合适了,因为只有 5 个并发子任务在跑,其余 5 个并发子任务会立即退出。

■ 安全交付问题

如果待交付文件包含敏感信息,那么请先加密文件内容再交付。或者,提出需求改进 本方法,对文件分片进行加密和解密,另外应当通过安全通道分发秘钥。

与镜像仓库的通信默认是以安全方式进行的,但文件内容在镜像仓库是以明文存储的, 所以对文件内容预先加密更可靠。

4、如何发布一个超级文件并与其他人共享文件?

发布一个超级文件,主要有以下三步:

下载源代码:

cd ~

git clone -b v1.1 https://github.com/solomonxu/docker-share-bigfile.git 

cd docker-share-bigfile

chmod -R a+x bin conf

或者:

cd ~

wget https://github.com/solomonxu/docker-share-bigfile/archive/v1.1.tar.gz 

tar -xvf v1.1.tar.gz

cd docker-share-bigfile*

chmod -R a+x bin conf

修改配置文件

修改以下几个配置参数,直接沿用此前创建仓库账号时的相关设置。

cd docker-share-bigfile 

vi conf/share.conf

docker_repository=registry.cn-hangzhou.aliyuncs.com

docker_project=myproject

docker_user=myuser

docker_password=mypassword

运行推送文件脚本

以单进程方式运行推送脚本:

cd ~/docker-share-bigfile

./bin/push_bigfile.sh huge_file_name

huge_file_name 是大文件的相对路径。以多并发方式运行推送脚本:

cd ~/docker-share-bigfile 

./bin/push_bigfile.sh huge_file_name 5 

默认并发数是 5 个,可以在运行脚本时自行调整。

为交付对象准备接收配置文件

接收配置文件 share.conf 与发布时的配置文件格式相同,除了登录 Docker 镜像仓库的账号和密码之外,其余参数须保持一致。

该配置文件需要通过安全通道交给您的交付对象。

5、如何接收一个超级文件?

接收一个大文件的过程与发布过程基本类似,只是最后一步运行的 Shell 脚本不同。接收一个超级大文件,主要有以下三步:

下载源代码

cd ~

git clone -b v1.1 https://github.com/solomonxu/docker-share-bigfile.git 

cd docker-share-bigfile

chmod -R a+x bin conf

或者:

cd ~

wget https://github.com/solomonxu/docker-share-bigfile/archive/v1.1.tar.gz 

tar -xvf v1.1.tar.gz

cd docker-share-bigfile*

chmod -R a+x bin conf

修改配置文件

修改以下几个配置参数,或者用发布者提供的配置文件直接覆盖。

cd docker-share-bigfile 

vi conf/share.conf

docker_repository=registry.cn-hangzhou.aliyuncs.com 

docker_project=myproject

docker_user=myuser

docker_password=mypassword

运行接收文件脚本

以单进程方式运行接收脚本:

cd ~/docker-share-bigfile

./bin/pull_bigfile.sh huge_file_name

huge_file_name 是大文件的相对路径。

以多并发方式运行接收脚本:

cd ~/docker-share-bigfile

./bin/pull_bigfile.sh huge_file_name 5

默认并发数是 5 个,可以在运行脚本时自行调整。

接收大文件的结果

接收脚本运行结束以后,大文件存放在 data 子目录下:

cd data

ls -ltr

6、实测和效果

推送大文件实测效果

Docker 镜像仓库选择阿里云杭州镜像仓库。从阿里云虚拟机(异地)发起推送大文件, 测试结果如下:

从云虚拟机发起:推送 1.01GiB 大文件,自动分解为 11 个文件分片,5 个并发,耗时 5 分 42 秒。

运行环境:CentOS 7.5,因为 CPU 和内存占用不高,忽略硬件配置要求,按常规配置即可。

根据实测结果推算:一个 50GiB 的大文件,从云虚拟机推送大文件,大约需要耗时 4 小时 45 分,需要一点耐心等待,好在推送开始以后可以甩手不管。

如果需要进一步压缩时间的话,可以改进为多并发处理、多节点推送,以改善本地Docker 的瓶颈。

接收大文件实测效果

Docker 镜像仓库选择阿里云杭州镜像仓库。分别从阿里云虚拟机(异地)和家用宽带(联通)发起接收大文件。测试效果如下:

从云虚拟机发起:接收 1.01GiB 大文件,自动拉取 11 个文件分片,5 个并发,耗时 37 秒。

从宽带接入虚拟机发起:接收 1.01GiB 大文件,自动拉取 11 个文件分片,5 个并发, 耗时 1 分 28 秒。

从云虚拟机发起接收文件明显快于从宽带虚拟机发起,接入网速的影响比较明显。 根据实测结果推算:一个50GiB 的大文件,从云虚拟机接收,大约需要耗时 30 分 50 秒,速度可以接受。

PDF 文档下载路径是:

https://github.com/solomonxu/d … 88%25 A9%E7%94%A8Docker%E4%BA%91%E4%BB%93%E5%BA%93%E5%88%86%E5%8F%91%E8%B6%85%E7%BA%A 7%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B0%E6%96%B9%E6%B3%95.pdf

原文链接: https://mp.weixin.qq.com/s/-8DVJ5PJdvyOwFaPTlE6Mg

Cantact to the author:

Email: xumeng@wise2c.com

Wechat: solomonxu9999

关于睿云智合

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

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

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