[Aliyun-ACP] 使用OSS处理大文件之断点续传
实验概述
本实验会自动创建一台ECS实例。首先,新建两个bucket,并开通跨区域复制功能。然后,在部署OSS Python SDK的ECS实例中,调用断点续传接口,上传一个12M的本地文件到一个OSS bucket中;重启ECS实例,模拟真实情况中,由于网络不稳定,而导致的服务器突然停止服务。最后,在ECS实例中,续传中断的Object,在OSS管理控制台中查看完整Object。
实验目标
完成此实验后,可以掌握的能力有:
1. 使用OSS管理控制台
2. 在阿里云管理控制台创建OSS bucket
3. 使用OSS Python SDK实现大文件分片断点续传;
学前建议
1. 已完成SL003 使用OSS API上传和下载文件
2. 会使用Python语言编程;
3. 了解OSS的基本概念
1.1 背景知识
阿里云对象存储(以下简称OSS),对外提供海量,安全,低成本,高可靠的云存储服务。用户可以通过调用API或Web控制台上传下载数据。OSS适合存放任意文件类型,适合各种网站、开发企业及开发者使用。在真实的生产环境中,客户若要将本地或服务器中的文件上传到OSS bucket中,主要使用如下四种上传方式:
· 简单上传,使用OSS Put Object方法上传单个Object,适合在任何一次HTTP请求交互即可完成上传的场景,比如小文件的上传。一般通过这种方式上传的文件大小不能超过5GB。
· 表单上传,适用于小文件上传的上传方式。用户使用OSS API中的Post Object请求来完成Object的上传。非常适合嵌入在HTML网页中上传Object。经常用于网站应用场景,比如招聘网站中,用户的简历不需要先传送到网站服务器,再通过网站服务器上传文件到OSS中。用户的简历将直接存储到OSS中。但是,这样上传的文件大小限制为5GB。
· 断点续传,当使用简单上传(PutObject)较大的文件到OSS的时候,若上传的过程中出现了网络错误,那么,此次上传失败。重试必须从文件起始位置上传。针对这种情况,OSS提供了分片上传(Multipart Upload)来达到断点续传的效果。分片上传就是将要上传的文件分成多个数据块(OSS中又称为Part)来分别上传,上传完成之后再调用OSS的接口将这些Part组合成一个Object。断点续传适合解决如下四种场景:
1) 恶劣的网络环境:如手机端,当出现上传失败的时候,可以对失败的Part进行独立重试,而不需要重新上传其他的Part。
2) 断点续传:中途暂停之后,可以从本次上传完成的Part位置继续上传。
3) 加速上传:要上传到OSS的本地文件很大的时候,可以并行上传多个Part以加快上传。
4) 流式上传:可以在需要上传的文件大小还不确定的情况下开始上传。这种场景在视频监控等行业应用中比较常见。
断点续传的流程如下:
1)将要上传的文件按照一定的大小分片
2)初始化一个分片上传任务(InitiateMultipartUpload)
3)逐个或并行上传分片(UploadPart)
4)完成上传(CompleteMultipartUpload)
· 追加上传,在一个Object后面直接追加内容的功能,通过这样方式上传的Object类型为Appendable Object,而非Normal Object。每次追加上传的数据都能即时可读。
2.3 调用OSS API上传大文件
1. 本小节,用户将配置Python SDK 断点续传中的参数信息,并通过断点续传方式上传本地12M的文件。
2. 远程登录到ECS服务器,修改配置参数。登录信息请使用本实验“实验资源”中分配的ECS服务器的“弹性IP”、“用户”和“密码”。
说明:本次实验中的ECS实例为“Linux系统”,远程登录ECS实例的详细步骤,请参考云中沙箱帮助文档中“远程访问Linux系统”。
3. 登录到ECS后,执行命令cd aliyun-lab/,进入aliyun-lab目录下。执行命令vim object_resumable.py,进入断点续传python脚本编辑页面,修改脚本文件。 “object_resumable.py” 脚本是调用OSS Python SDK实现断点续传。
4. 首先,添加配置如下的OSS连接信息,对OSS的访问权限进行验证。
__access_key_id:参数值为本次实验提供的“AK ID”;
__access_key_secret:参数值为本次实验提供的“AK Secret”;
__oss_endpoint:参数值为本次实验提供的“地域”对应数据中心的“外网Endpoint”数值。比如:OSS“地域”为“华东2(上海)”,则输入“华东2(上海)”的“oss-cn-shanghai.aliyuncs.com“。
OSS地域与外网Endpoint对应关系表:
地域 |
外网Endpoint |
---|---|
华东 1 (杭州) |
oss-cn-hangzhou.aliyuncs.com |
华东 2 (上海) |
oss-cn-shanghai.aliyuncs.com |
华北 1 (青岛) |
oss-cn-qingdao.aliyuncs.com |
华北 2 (北京) |
oss-cn-beijing.aliyuncs.com |
华南 1 (深圳) |
oss-cn-shenzhen.aliyuncs.com |
5. 然后,指定本实验上传文件的bucket名称,本地上传文件,以及上传到OSS bucket中Object名。输入如下参数信息:
__bucket_name:云中沙箱“实验资源”中分配的“Bucket名称”,用于将文件上传到提供的OSS bucket中。
__file_name:“local.txt”,本地12M大小的文本文件;
__object_name:“<Object 路径>/remote.txt”,<Object 路径>是云中沙箱“实验资源”中分配的“Object路径”,用于指定Object在OSS Bucket中存储路径,并重命名为"remote.txt"。
6. 最后,在“插入OSS断点续传的函数”下方,输入如下代码,也就是OSS Python SDK 提供的断点续传函数,完成后,保存并退出编辑页面:
oss2.resumable_upload(bucket, __object_name, __file_name,
store=oss2.ResumableStore(root='/tmp'),
multipart_threshold=100*1024,
part_size=100*1024,
progress_callback=percentage)
断点续传相关参数说明:
-- ResumableStore,可选参数,默认将进度保存到HOME下的“.py-oss-upload”目录中。本实验中,指定把进度保存到“/tmp/.py-oss-upload”目录下。
-- multipart_threshold,可选参数,只要上传的文件大小,大于或等于此参数值时,就可以进行分片上传。本实验中,指明只要文件大小大于100K,就可以进行分片上传。
-- part_size,可选参数,分片大小。一般建议分片为100K,进行上传。
-- progress_callback=percentage,可选参数,界面显示的上传进度
7. 完成如上python脚本的全部参数的配置后,输入命令:python object_resumable.py,开始上传本地12M“local.txt”文件到OSS bucket的指定Object路径中,并可以从ECS终端访问窗口,查看当前上传进度。
8. 至此,用户可以使用断点续传的函数上传文件。下一小节中,用户将重启ECS实例,模拟上传中断的情况。
2.5 重启ECS云主机,模拟中断情况
1. 本小节中,用户将重启ECS云主机,模拟工作环境下,文件上传意外中断的情况。
2. 请通过沙箱平台“实验资源”,点击“前往控制台”访问阿里云RAM登录界面。在阿里云RAM登录界面,输入本次实验“我的实验资源”中分配的“阿里云子账号”和“阿里云子账号密码”。点击“登录”,进入阿里云管理控制台。
3. 首先,访问阿里云ECS管理控制台,并重启ECS云主机。在阿里云管理控制台主页面,点击左上角的“产品与服务”。在弹出的下拉菜单中,点击“弹性计算”服务类别下的“云服务器ECS”,进入ECS管理控制台。
4. 在阿里云ECS管理控制台,点击左侧栏的“实例”,进入实例列表。
首先,选择与云中沙箱提供的“地域”相同的“地域”信息。例如,若云中沙箱提供的“地域”为“华东2(上海)”,则在页面上端的地域栏中选择“华东2”。
然后,在“实例名称”右侧的搜索栏中,输入“我的实验资源”分配的“阿里云子账号名”,并点击“搜索”,就可以查看到本实验使用的ECS云主机,并且状态为“运行中”。
最后,点击ECS实例右侧的“更多”,在弹出的下拉列表中,用户执行关于此台ECS实例的更多操作。点击“重启”,弹出对话框,选择重启方式。
选择“重启”,并点击“确定”,重启ECS实例。
注意:请勿选择“强制重启”,强制重启ECS实例可能导致本次实验的未知错误。
6. 此时,实例状态变为“停止中”,然后,变为“启动中”。请等待1-2分钟,ECS实例的状态将再次变为“运行中”。此时,ECS实例可以登录并访问,也就是模拟在上传过程中出现意外中断的情况,然后,系统恢复正常的过程。
7. 此时,返回ECS的终端访问界面,可以查看到ECS实例访问中断。
8. 下一小节,在OSS管理控制台,查看未完全上传的“碎片”文件“local.txt”。
2.6 查看上传文件碎片信息
1. 访问OSS管理控制台,查看由于本地文件上传中断,而产生的“碎片”信息。
2. 首先,在阿里云管理控制台,点击页面左上角的“产品与服务”,然后,在下拉菜单中,选择“存储与CDN”类别下的“对象存储OSS”,进入OSS管理页面。
3. 在OSS管理控制台的概览页面中,点击与云中沙箱分配的“Bucket名称”相同的Bucket。例如:云中沙箱“我的实验资源”分配的OSS “Bucket名称”为“oss-994-hd2”,则点击Bucket栏下的“oss-994-hd2”Bucket,进入分配的Bucket的管理页面。
4. 在OSS Bucket的“Object管理”页面中,可以查看到当前Object列表中存在一个或多个文件夹。点击云中沙箱分配的一级“Object路径”。例如:用户分配的“Object路径”为“RSL006/u-xxx/”,则“RSL006”为一级Object路径。点击“RSL006”,进入Object “RSL006” 路径中。
在“RSL006”的文件夹中,点击云中沙箱分配的二级“Object路径”。例如:用户分配的“Object路径”为“RSL006/u-xxx”,则“u-xxx”为二级Object路径。点击“u-xxx”,进入Object “RSL006/u-xxx”路径中。
此时,在Object管理的列表的第一行中,用户可以查看到当前Object路径信息。在“Object管理”的Object列表中,显示“暂无数据”。这是因为本地文件“local.txt”,由于上传中断,导致没有成功上传到OSS中。
说明:因为只有文件的内容全部上传,并且上传成功,才会显示在Object管理中。
5. 点击左侧栏中的“碎片管理”,查看所有上传未完成的Object,也称为“Object碎片”。点击碎片右侧“碎片”栏下“点击统计”,查看已上传的文件大小。
此时,可以查看到碎片的大小和碎片个数,碎片的大小小于12M。
6. 下一小节,将再次登录ECS实例,并调用OSS Python SDK的断点续传函数,完成本地文件的全部上传。
2.7 调用OSS API 续传大文件
1. 本节中,用户将续传中断的Object,并将本地“local.txt”保存到指定的Object路径中。
2. 重新远程登陆访问ECS实例。在ECS终端界面中,执行命令cd aliyun-lab/和python object_resumable.py,续传中断的本地文件内容。此时,上传进度初始值与ECS实例中断时的进度相同。
等待1分钟,页面提示上传成功。
3. 返回OSS管理控制台的“Object管理”页面,并进入“我的实验资源”分配的“Object路径”中,可以查看到上传成功的remote.txt文件,大小为12M。