【最佳实践】OSS开源工具ossutil-大文件断点续传
经常碰到内部同学或者外部客户问ossutil关于大文件断点续传的问题。本文简单描述下原理并举例说明。
用户可从这里获取ossutil。
官网:https://help.aliyun.com/document_detail/50452.html
代码:https://github.com/aliyun/ossutil
OSS断点续传
应用场景
当调用OSS的PutObject来上传较大的文件时,如果上传过程中出现错误,比如网络错误,那么此次上传失败。重试时必须从文件起始位置上传。
针对这种情况,OSS提供了分片上传(Multipart Upload)来达到断点续传的效果。分片上传就是将要上传的文件分成多个数据块(OSS里又称之为Part)来分别上传,上传完成之后再调用OSS的接口将这些Part组合成一个Object。
因此,OSS断点续传适用于以下场合。
- 恶劣的网络环境:如手机端,当出现上传失败的时候,可以对失败的Part进行独立的重试,而不需要重新上传其他的Part。
- 断点续传:中途暂停之后,可以从上次上传完成的Part的位置继续上传。
详细信息,请参考https://help.aliyun.com/document_detail/31850.html。
实现原理
在分片上传的过程中,已经上传的Part的生命周期是永久的,因此很容易可以实现断点续传的功能。
如果分片上传意外失败,可以在重启的时候调用以下接口。
ListMultipartUploads
- 列出所有分片上传任务,即已经被初始化的Multipart Upload但是未被Complete或者Abort的Multipart Upload事件;
- 更多详细信息,请参考https://help.aliyun.com/document_detail/31997.html
ListParts
- 列出指定Upload ID每个分片上传任务中上传成功的Part列表
- 更多详细信息,请参考https://help.aliyun.com/document_detail/31998.html
有了上传成功的Part列表,就可以从最后一块成功上传的Part开始继续上传,从而达到断点续传的效果。暂停和恢复上传实现原理也是一样的。
ossutil大文件断点续传
ossutil上传文件时,如果文件大小超过--bigfile-threshold选项指定的大小(默认为100M),ossutil会认为该文件为大文件,并自动使用断点续传策略。
续传策略
上传至OSS
- ossutil会对大文件自动分片,进行multipart分片上传;
- 如果上传失败,会在本地.ossutil_checkpoint目录记录失败信息,下次重传时会读取.ossutil_checkpoint目录中的信息进行断点续传,当上传成功时会删除.ossutil_checkpoint目录。
从OSS下载
- ossutil会自动对大文件分片下载,所有分片下载后组装成一个文件;
- 如果下载失败,同样会在.ossutil_checkpoint目录记录失败信息,重试成功后删除.ossutil_checkpoint目录。
在OSS间拷贝
- ossutil会自动对大文件分片,使用Upload Part Copy方式拷贝;
- 同样会在.ossutil_checkpoint目录记录失败信息,重试成功后会删除.ossutil_checkpoint目录。
实现原理
断点续传的重点在于需要本地记录已经上传了多少,还需要上传多少。因此ossutil在本地默认.ossutil_checkpoint目录下创建文件记录本次上传分片信息,并用LevelDB记录哪些分片已经上传成功。
比如,在.ossutil_checkpoint目录下创建如下文件并记录分片信息。具体内容可参考后面的例子。
$ ls .ossutil_checkpoint/Users/tester/ws/test.file.200M---oss:/tempb3/test.file.200M.cp
.ossutil_checkpoint/Users/tester/ws/test.file.200M---oss:/tempb3/test.file.200M.cp
例子
上传并中断
本文给出一个上传的例子,下载和拷贝操作方法类似。
# 200M文件上传$ ls -lh test.file.200M
-rw-r--r-- 1 zubo.yzb staff 200M 6 11 15:34 test.file.200M# 上传18%时Ctrl+C掉$ ossutil cp test.file.200M oss://tempb3
Total num: 1, size: 209,715,200. Dealed num: 0, OK size: 38,456,400, Progress: 18%^C⏎
碎片信息
ls命令加-a选项可参考分片信息。
$ ossutil ls oss://tempb3 -a
Object Number is: 0
InitiatedTime UploadID ObjectName
2018-06-11 15:34:57 +0800 CST 15E03889BFF34823AF47A6F65A8E7B11 oss://tempb3/test.file.200M
UploadID Number is: 1
0.116129(s) elapsed
也可以登录控制台查看分片(碎片)信息。
Checkpoint文件
默认在当前目录下会创建.ossutil_checkpoint目录,并将断点信息写入文件,文件名如上所述。
文件数据定义如下。
type uploadCheckpoint struct {Magic string // magicMD5 string // cp内容的MD5FilePath string // 本地文件FileStat cpStat // 文件状态ObjectKey string // keyUploadID string // upload idParts []cpPart // 本地文件的全部分片
}type cpStat struct {Size int64 // 文件大小LastModified time.Time // 本地文件最后修改时间MD5 string // 本地文件MD5
}type cpPart struct {Chunk FileChunk // 分片Part UploadPart // 上传完成的分片IsCompleted bool // upload是否完成
}
// FileChunk 文件片定义
type FileChunk struct {Number int // 块序号Offset int64 // 块在文件中的偏移量Size int64 // 块大小
}
// UploadPart 上传/拷贝的分片
type UploadPart struct {XMLName xml.Name `xml:"Part"`PartNumber int `xml:"PartNumber"` // Part编号ETag string `xml:"ETag"` // ETag缓存码
}
文件内容如下。
{"FilePath": "test.file.200M","FileStat": {"LastModified": "2018-06-11T15:34:18+08:00","MD5": "","Size": 209715200},"MD5": "3Rv7Fx0gbfPLWKOa4OjMew==","Magic": "FE8BB4EA-B593-4FAC-AD7A-2459A36E2E62","ObjectKey": "test.file.200M","Parts": [{"Chunk": {"Number": 1, =====> 第1个分片"Offset": 0,"Size": 2563760 =====> 每个分片size为2563760=2503KB},"IsCompleted": true, =====> 已经成功上传"Part": {"ETag": "\"EC704FC6D8822194EEC4E68769739BE3\"", =====>已经成功上传的分片有ETag"PartNumber": 1, =====> 第1个分片"XMLName": {"Local": "","Space": ""}}},
。。。{"Chunk": {"Number": 15, =====> 第15个分片"Offset": 35892640,"Size": 2563760},"IsCompleted": true, =====> 已经成功上传"Part": {"ETag": "\"EC704FC6D8822194EEC4E68769739BE3\"","PartNumber": 15,"XMLName": {"Local": "","Space": ""}}},{"Chunk": {"Number": 16, =====> 第16个分片"Offset": 38456400,"Size": 2563760},"IsCompleted": false, =====> 未上传"Part": {"ETag": "","PartNumber": 0,"XMLName": {"Local": "","Space": ""}}},
。。。{"Chunk": {"Number": 82, =====>82个分片"Offset": 207664560,"Size": 2050640},"IsCompleted": false,"Part": {"ETag": "","PartNumber": 0,"XMLName": {"Local": "","Space": ""}}}],"UploadID": "15E03889BFF34823AF47A6F65A8E7B11"
}
断点续传
再次上传直接从断点开始继续,可以观察到progress直接从18%开始,直到结束。
$ ossutil cp test.file.200M oss://tempb3 -f
Succeed: Total num: 1, size: 209,715,200. OK num: 1(upload 1 files).
11.461563(s) elapsed
总结
- 小文件不会断点续传,失败后下次直接重传;
- 对于上传至OSS或在OSS间拷贝,如果失败,OSS上可能会产生Uncomplete的UploadId,但只要最终成功,就不会存在Uncomplete的UploadId(会被组装成object);
- 上传到oss时,如果.ossutil_checkpoint目录包含在file_url中,.ossutil_checkpoint目录不会被上传到oss。该目录路径可以用--checkpoint-dir选项指定,如果指定了该选项,请确保指定的目录可以被删除。
如果使用rm命令删除了Uncomplete的Multipart Upload,可能会造成下次cp命令断点续传失败(报错:NoSuchUpload),这种时候如果想要重新上传整个文件,请删除相应的checkpoint文件。
$ ossutil cp test.file.200M oss://tempb3 Total num: 1, size: 209,715,200. Dealed num: 0, Transfer size: 0. When error happens. Error: oss: service returned error: StatusCode=404, ErrorCode=NoSuchUpload, ErrorMessage=The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed., RequestId=5B1E2B177953A44A418E6FD5, File=test.file.200M! Will remove checkpoint dir '.ossutil_checkpoint' automatically. Please try again.⏎
- 分片上传不直接等于断点续传,但是基于分片上传可以实现断点续传的效果。
- 如果上传的文件是不变的,分片的方法也是不变的,那么只需要在本地记录文件已经成功上传了哪些分片,后面重新上传的时候,跳过已经成功上传的分片,就能达到断点续传的效果。
Reference
- https://help.aliyun.com/document_detail/31850.html
- https://help.aliyun.com/document_detail/31856.html
- https://help.aliyun.com/document_detail/31997.html
- https://help.aliyun.com/document_detail/31998.html
【最佳实践】OSS开源工具ossutil-大文件断点续传相关推荐
- apache的开源工具common-fileupload实现文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- 多线程大文件断点续传和流媒体的处理方法
2019独角兽企业重金招聘Python工程师标准>>> 在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下. 在Sq ...
- 精品分享:基于 SpringBoot + Vue 开发的云盘系统(含大文件断点续传剖析)
引言 作为开发人员,我们经常需要存储和下载文件,为了使用方便,通常都会将文件存储在云端,市面上使用率最高的云端存储莫过于百度网盘了,但使用别人的东西难免会受到各种各样的限制,必须花钱才会享受到更好的服 ...
- html5解决大文件断点续传6,解决html5大文件断点续传
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载
前言:iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载是在前篇iOS开发之网络编程--使用NSURLConnection实现大文件下载的基础上进行 断点续传的设置 ...
- 文件上传控件-如何上传文件-大文件断点续传
需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...
- 【vue】 前端 基于 vue-simple-uploader 实现大文件断点续传和分片上传
文章目录 一.前言 二.后端部分 新建Maven 项目 后端 pom.xml 配置文件 application.yml HttpStatus.java AjaxResult.java CommonCo ...
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 部署篇(工具部署)
作者 | 孤弋 阿里云高级技术专家,负责 EDAS 的开发和用户体验优化工作. 导读:上一篇文章<SpringCloud 应用在 Kubernetes 上的最佳实践 - 部署篇(开发部署)&g ...
- java 开源 断点续传,全平台大文件断点续传上传技术 ( 开源项目 Stream )
Stream 上传插件介绍 Stream 这个项目主要是为了解决大文件上传, 本程序只是它的一个 Perl 后端的实现. 项目网站是: http://www.twinkling.cn 原始地址是: h ...
最新文章
- 【PP】其他类型BOM备忘录
- Fragment使用LocalBroadcastManager接收广播消息
- 《JavaScript高级程序设计》笔记:JavaScript简介(一)
- Python版插入排序算法
- python3最新版下载_python3.9下载-Python下载v3.9.0 官方最新版【x86|x64】-西西软件下载...
- python刷今日头条阅读量_教你如何提高今日头条号推荐量阅读量播放量
- live555 linux 编译
- 判断数组是否为某二叉搜索树的后序遍历
- vue设置video图片_vue video和vue-video-player实现视频铺满教程
- 读书笔记——WebKit技术内幕 HTML结构
- 专利代理人的真实工作状况
- 开发者硬核:Web3 DApp 最佳编程实践指南
- [渝粤教育] 中国地质大学 机械电气安全技术 复习题 (2)
- MTK Kernel Log 看电池信息
- 安川服务器输入输出信号,谈谈自动控制系统的输入输出信号
- 年度收官技术盛宴SD2.0大会精彩议题曝光
- SVN主干代码合并到分支(trunk to branch)
- (Router)路由交换实验
- Wi-Fi无线网络下行速度超级慢 (5kb/s)之解决方案
- python购物街竟价项目_python制作视频教程下载地址