阿里云-对象存储OSS
https://help.aliyun.com/product/31815.html
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。
OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)、冷归档存储(Cold Archive)作为不经常访问数据的存储方式。
OSS相关概念
- 存储类型(Storage Class)
OSS提供标准、低频访问、归档、冷归档四种存储类型,全面覆盖从热到冷的各种数据存储场景。其中标准存储类型提供高持久、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据;冷归档存储适合需要超长时间存放的极冷数据。更多信息,请参见存储类型介绍。
- 存储空间(Bucket)
存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。您可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
- 对象(Object)
对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,例如最后修改时间、大小等信息,同时您也可以在元信息中存储一些自定义的信息。
- 地域(Region)
地域表示OSS的数据中心所在物理位置。您可以根据费用、请求来源等选择合适的地域创建Bucket。更多信息,请参见OSS已开通的地域。
- 访问域名(Endpoint)
Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。更多信息,请参见各个Region对应的Endpoint。
- 访问密钥(AccessKey)
AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。关于获取AccessKey的方法,请参见获取AccessKey。
OSS常见操作
- 创建Bucket
在上传文件(Object)到OSS之前,您需要创建一个用于存储文件的Bucket。Bucket具有各种配置属性,包括地域、访问权限以及其他元数据。创建Bucket的具体操作,请参见创建存储空间。
- 上传文件
Bucket创建完成后,您可以通过多种方式上传不同大小的文件。有关上传文件的具体操作,请参见上传文件。
- 下载文件
文件上传完成后,您可以将文件下载至浏览器默认路径或本地指定路径。有关下载文件的具体操作,请参见下载文件。
- 列举文件
当您Bucket内存储了大量的文件后,您可以选择列举Bucket内的全部或部分文件。有关列举文件的具体操作,请参见列举文件。
- 删除文件
当您不再需要保留上传的文件时,您可以手动删除单个或多个文件,也可以通过配置生命周期规则自动删除单个或多个文件。有关删除文件的具体操作,请参见删除文件。
OSS重要特性
- 版本控制
版本控制是针对存储空间(Bucket)级别的数据保护功能。开启版本控制后,针对数据的覆盖和删除操作将会以历史版本的形式保存下来。您在错误覆盖或者删除文件(Object)后,能够将Bucket中存储的Object恢复至任意时刻的历史版本。有关版本控制的更多信息,请参见版本控制介绍。
- Bucket Policy
Bucket拥有者可通过Bucket Policy授权不同用户以何种权限访问指定的OSS资源。例如您需要进行跨账号或对匿名用户授权访问或管理整个Bucket或Bucket内的部分资源,或者需要对同账号下的不同RAM用户授予访问或管理Bucket资源的不同权限,例如只读、读写或完全控制的权限等。有关配置Bucket Policy的操作步骤,请参见通过Bucket Policy授权用户访问指定资源。
- 跨区域复制
跨区域复制(Cross-Region Replication)是跨不同OSS数据中心(地域)的Bucket自动、异步(近实时)复制Object,它会将Object的创建、更新和删除等操作从源存储空间复制到不同区域的目标存储空间。跨区域复制功能满足Bucket跨区域容灾或用户数据复制的需求。有关跨区域复制的更多信息,请参见跨区域复制。
- 数据加密
服务器端加密:上传文件时,OSS对收到的文件进行加密,再将得到的加密文件持久化保存;下载文件时,OSS自动将加密文件解密后返回给用户,并在返回的HTTP请求Header中,声明该文件进行了服务器端加密。有关服务器端加密的更多信息,请参见服务器端加密。
客户端加密:将文件上传到OSS之前在本地进行加密。有关客户端加密的更多信息,请参见客户端加密。
OSS使用方式
OSS提供多种灵活的上传、下载和管理方式。
- 通过控制台管理OSS
- 通过API或SDK管理OSS
OSS提供RESTful API和各种语言的SDK开发包,方便您快速进行二次开发。更多信息,请参见OSS API参考和OSS SDK参考。
- 通过工具管理OSS
OSS提供图形化管理工具ossbrowser、命令行管理工具ossutil、FTP管理工具ossftp等各种类型的管理工具。更多信息,请参见OSS常用工具。
- 通过云存储网关管理OSS
OSS的存储空间内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。如果您想要像使用本地文件夹和磁盘那样来使用OSS存储服务,可以通过配置云存储网关来实现。更多信息,请参见云存储网关产品详情页面。
其他相关服务
您把数据存储到OSS以后,就可以使用阿里云提供的其他产品和服务对其进行相关操作。
以下是您会经常使用到的阿里云产品和服务:
- 图片处理:对存储在OSS上的图片进行格式转换、缩放、裁剪、旋转、添加水印等各种操作。更多信息,请参见快速使用OSS图片处理服务。
- 云服务器ECS:提供简单高效、处理能力可弹性伸缩的云端计算服务。更多信息,请参见ECS产品详情页面。
- 内容分发网络CDN:将OSS资源缓存到各区域的边缘节点,利用边缘节点缓存的数据,提升同一个文件,被边缘节点客户大量重复下载的体验。更多信息,请参见CDN产品详情页面。
- E-MapReduce:构建于ECS上的大数据处理的系统解决方案,基于开源的Apache Hadoop和Apache Spark,方便您分析和处理自己的数据。更多信息,请参见E-MapReduce产品详情页面。
- 媒体处理:将存储于OSS的音视频转码成适合在PC、TV以及移动终端上播放的格式。并基于海量数据深度学习,对音视频的内容、文字、语音、场景多模态分析,实现智能审核、内容理解、智能编辑。更多信息,请参见媒体处理产品详情页面。
- 在线迁移服务:您可以使用在线迁移服务将第三方数据源,如亚马逊AWS、谷歌云等数据轻松迁移至OSS。更多信息,请参见在线迁移服务使用教程。
- 离线迁移服务:如果您有TB或PB级别的海量数据需要上传到OSS,但本地的网络带宽不够,扩容成本高,可以使用闪电立方离线数据迁移服务。更多信息,请参见离线迁移(闪电立方)介绍。
其他阿里云存储服务
除了对象存储以外,阿里云还提供文件存储、块存储等类型的存储服务,满足您不同场景下的业务需求。详细信息,请参见阿里云存储服务介绍和阿里云存储产品文档。
有关阿里云存储服务的客户案例、解决方案等,请参见阿里云存储产品家族。
产品优势
对象存储OSS是阿里云提供的海量、安全、低成本、高持久性的云存储服务。本文将OSS与传统的自建存储进行对比,让您更好的了解OSS。
OSS与自建存储对比的优势
对比项 | 对象存储OSS | 自建服务器存储 |
---|---|---|
持久性 | OSS作为阿里巴巴全集团数据存储的核心基础设施,多年支撑双11业务高峰,历经高可用与高可靠的严苛考验。OSS的多重冗余架构设计,为数据持久存储提供可靠保障。同时,OSS基于高可用架构设计,消除单点故障,确保数据业务的持续性。
|
|
安全 |
|
|
成本 |
|
|
智能存储 | 提供多种数据处理能力,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等,并无缝对接Hadoop生态、以及阿里云函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品,满足企业数据分析与管理的需求。 | 需要额外采购,单独部署。 |
OSS其他优势
- 方便、快捷的使用方式
- 提供标准的RESTful API接口、丰富的SDK包、客户端工具、控制台。您可以像使用文件一样方便地上传、下载、检索、管理用于Web网站或者移动应用的海量数据。
- 不限制存储空间大小。您可以根据所需存储量无限扩展存储空间,解决了传统硬件存储扩容问题。
- 支持流式写入和读出。特别适合视频等大文件的边写边读业务场景。
- 支持数据生命周期管理。您可以通过设置生命周期规则,将到期数据批量删除或者转储为更低成本的低频访问、归档存储、冷归档存储。
- 强大、灵活的安全机制
- 提供STS和URL鉴权和授权机制、IP黑白名单、防盗链、主子账号等功能。
- 提供用户级别资源隔离机制和多集群同步机制。
- 提供服务器端加密和客户端加密,并支持基于SSL/TLS的HTTPS加密传输,有效防止数据在云端的潜在安全风险。
- 提供版本控制功能,防止文件被误删除或覆盖而造成数据丢失。
- 数据冗余机制
OSS采用数据冗余存储机制,将每个对象的不同冗余存储在同一个区域内多个设施的多个设备上,确保硬件失效时的数据持久性和可用性。
- OSS针对对象的操作具有强一致性。对象一旦上传或复制成功,即可立即读取,且冗余写入多个设备。
- OSS会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。
- OSS的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。
- 当数据存入OSS后,OSS会检测和修复丢失的冗余,确保数据持久性和可用性。
- OSS会周期性地通过校验等方式验证数据的完整性,及时发现因硬件失效等原因造成的数据损坏。当检测到数据有部分损坏或丢失时,OSS会利用冗余数据重建并修复损坏数据。
- 丰富、强大的增值服务
- 图片处理:支持JPG、PNG、BMP、GIF、WebP、TIFF等多种图片格式的转换,以及缩略图、剪裁、水印、缩放等多种操作。
- 音视频转码:提供高质量、高速并行的音视频转码能力,让您的音视频文件轻松应对各种终端设备。
- 互联网访问加速:提供传输加速服务,可优化互联网传输链路和协议栈,大幅减少数据远距离传输超时的比例,极大地提升用户上传和下载体验。更多详情,请参见传输加速。
- 内容加速分发:OSS作为源站,搭配CDN进行内容分发,提升同一个文件被重复下载的体验。
应用场景
本文介绍对象存储OSS的主要应用场景。
图片和音视频等应用的海量存储
OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。
网页或者移动应用的静态和动态资源分离
利用海量互联网带宽,OSS可以实现海量数据的互联网并发下载。OSS提供原生的传输加速功能,支持上传加速、下载加速,提升跨国、跨洋数据上传、下载的体验。同时,OSS也可以结合CDN产品,提供静态内容存储、分发到边缘节点的解决方案,利用CDN边缘节点缓存的数据,提升同一个文件被同一地区客户大量重复并发下载的体验。
云端数据处理
基本概念
本文将向您介绍对象存储OSS产品中涉及的几个基本概念,以便于您更好地理解OSS产品。
存储空间(Bucket)
存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。
- 每个用户可以拥有多个存储空间。
- 存储空间的名称在OSS范围内必须是全局唯一的,一旦创建之后无法修改名称。
- 存储空间内部的对象数目没有限制。
存储空间的命名规范如下:
- 只能包括小写字母、数字和短划线(-)。
- 必须以小写字母或者数字开头和结尾。
- 长度必须在3~63字符之间。
存储空间总结:
- 命名规范。
- 创建存储空间:包括地域、访问权限、存储类型等。
- 列举存储空间:通过设置prefix、marker或者max-keys参数列举满足指定条件的存储空间。
- 获取存储空间的地域信息:通过GetBucketLocation接口返回的Location字段查看存储空间所属的地域信息。
- 生命周期:策略创建生命周期规则,定期将存储空间(Bucket)内的多个文件(Object)转储为指定存储类型,或者将过期的Object和碎片删除,从而节省存储费用
- 存储空间清单:清单功能获取存储空间(Bucket)中指定文件(Object)的数量、大小、存储类型、加密状态等信息。
- 绑定自定义域名:文件(Object)上传至存储空间(Bucket)后,OSS会自动生成文件URL,您可以直接通过文件URL访问该文件。
- 传输加速:OSS传输加速利用全球分布的云机房,将全球各地用户对您存储空间(Bucket)的访问,经过智能路由解析至就近的接入点,使用优化后的网络及协议,为云存储互联网的上传、下载提供端到端的加速方案。
- 设置跨域资源共享:跨域资源共享CORS(Cross-Origin Resource Sharing)简称跨域访问,是HTML5提供的标准跨域解决方案,允许Web应用服务器进行跨域访问控制,确保跨域数据传输的安全性。
- 存储空间标签:通过存储空间(Bucket)的标签功能, 对Bucket进行分类管理,例如通过设置不同的标签来标记不同用途的Bucket,设置对拥有指定标签的Bucket设置访问权限等。
- 删除存储空间:当您不再需要保留某个存储空间(Bucket)时,可将其删除,以免产生额外费用。
- OSS加速器:随着互联网业务的发展,越来越多的业务对于数据的吞吐量有了更高的要求。为此,对象存储OSS推出加速器功能,可以缓存OSS中的热点文件(Object),提供高性能、高吞吐量的数据访问服务。
对象(Object)
对象是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。
对象的生命周期是从上传成功到被删除为止。在整个生命周期内,除通过追加方式上传的Object可以通过继续追加上传写入数据外,其他方式上传的Object内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。
对象的命名规范如下:
- 使用UTF-8编码。
- 长度必须在1~1023字符之间。
- 不能以正斜线(/)或者反斜线(\)开头。
对象总结:
-
三种类型:通过简单上传生成的Object类型为Normal。
通过分片上传生成的Object类型为Multipart。
通过追加上传生成的Object类型为Appendable,且仅支持在Appendable类型的Object后直接追加内容。 - 上传文件(Object):简单上传、分片上传、断点续传上传、上传回调、授权给第三方上传、表单上传、追加上传、RTMP推流上传
- 下载文件:简单下载、断点续传下载、授权给第三方下载
- 管理文件:列举文件、拷贝文件、解冻文件、删除文件、对象标签、管理文件元信息、通过目录管理文件、单链接限速、使用SelectObject查询文件
ObjectKey
在各语言SDK中,ObjectKey、Key以及ObjectName是同一概念,均表示对Object执行相关操作时需要填写的Object名称。例如向某一存储空间上传Object时,ObjectKey表示上传的Object所在存储空间的完整名称,即包含文件后缀在内的完整路径,如填写为abc/efg/123.jpg。
Region(地域)
Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。详情请参见OSS已经开通的Region。
Region是在创建Bucket的时候指定的,一旦指定之后就不允许更改。该Bucket下所有的Object都存储在对应的数据中心,目前不支持Object级别的Region设置。
Endpoint(访问域名)
Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。例如杭州Region的外网Endpoint是oss-cn-hangzhou.aliyuncs.com,内网Endpoint是oss-cn-hangzhou-internal.aliyuncs.com。具体的内容请参见各个Region对应的Endpoint。
AccessKey(访问密钥)
AccessKey简称AK,指的是访问身份验证中用到的AccessKeyId和AccessKeySecret。OSS通过使用AccessKeyId和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户;AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。对于OSS来说,AccessKey的来源有:
- Bucket的拥有者申请的AccessKey。
- 被Bucket的拥有者通过RAM授权给第三方请求者的AccessKey。
- 被Bucket的拥有者通过STS授权给第三方请求者的AccessKey。
强一致性
Object操作在OSS上具有原子性,操作要么成功要么失败,不会存在有中间状态的Object。OSS保证用户一旦上传完成之后读到的Object是完整的,OSS不会返回给用户一个部分上传成功的Object。
Object操作在OSS同样具有强一致性,用户一旦收到了一个上传(PUT)成功的响应,该上传的Object就已经立即可读,并且Object的冗余数据已经写成功。不存在一种上传的中间状态,即read-after-write却无法读取到数据。对于删除操作也是一样的,用户删除指定的Object成功之后,该Object立即变为不存在。
数据冗余机制
- OSS Object操作具有强一致性,用户一旦收到了上传或复制成功的响应,则该上传的Object就已经立即可读,且数据已经冗余写入到多个设备中。
- OSS会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。
- OSS的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。
- 当数据存入OSS后,OSS会检测和修复丢失的冗余,确保数据持久性和可用性。
- OSS会周期性地通过校验等方式验证数据的完整性,及时发现因硬件失效等原因造成的数据损坏。当检测到数据有部分损坏或丢失时,OSS会利用冗余的数据,进行重建并修复损坏数据。
数据安全
- 访问控制:
Bucket ACL分为public-read-write(公共读写)、public-read(公共读)和private(私有)三种。
Object ACL分为继承Bucket、public-read-write(公共读写)、public-read(公共读)和private(私有)四种。Allow:允许访问请求,即比对Policy命中了Allow规则。
Explicit Deny:显式拒绝访问请求,即比对Policy命中了Deny规则
Implicit Deny:隐式拒绝访问请求,即Policy不存在、或比对Policy没有命中Allow或Deny规则。 - 数据容灾:
同城冗余存储
跨区域复制
同区域复制
特殊场景下的复制行为
数据复制问题排查 - 数据加密:
服务器端加密
客户端加密 - 版本控制:
版本控制介绍
开启版本控制下Object的操作
暂停版本控制下Object的操作
删除标记
常见问题 - 签名:
OSS请求流程
在Header中包含签名
在URL中包含签名
签名常见问题 - 使用STS临时访问凭证访问OSS
- 防盗链:
防盗链功能通过设置Referer白名单以及是否允许空Referer,限制仅白名单中的域名可以访问您Bucket内的资源。OSS支持基于HTTP和HTTPS header中表头字段Referer的方法设置防盗链。
是否进行防盗链验证的具体场景如下:
仅当通过签名URL或者匿名访问Object时,进行防盗链验证。
当请求的Header中包含Authorization字段,不进行防盗链验证。 - 合规保留策略
- OSS沙箱
- OSS高防
- 敏感数据保护
日志管理
- 日志转存:
访问OSS的过程中会产生大量的访问日志。您可以通过日志转存功能将这些日志按照固定命名规则,以小时为单位生成日志文件写入您指定的存储空间(Bucket)。
对于已存储的日志,您可以通过阿里云日志服务或搭建Spark集群等方式进行分析。
生成日志的源Bucket和存储日志的目标Bucket可以相同也可以不同,但是必须属于同一账号下的相同地域。
日志文件以小时为单位生成,但并不表示某个时段的日志文件记录了该时段的所有请求,部分请求可能会出现在上一时段或下一时段的日志文件中。
在您关闭日志转存功能前,OSS的日志文件会一直生成。请及时清理不再需要的日志文件,以减少您的存储费用。
您可以通过生命周期规则定期删除日志文件。更多信息,请参见基于最后一次修改时间的生命周期规则介绍。
OSS会根据需求在日志的尾部添加一些字段,请您在开发日志处理工具时考虑兼容性的问题。 - 实时日志查询:
访问对象存储OSS的过程中会产生大量的访问日志。实时日志查询功能将OSS与日志服务SLS相结合, 允许您在OSS控制台直接查询OSS的访问日志,帮助您完成OSS访问的操作审计、访问统计、异常事件回溯和问题定位等工作,提升您的工作效率并更好地帮助您基于数据进行决策。
3分钟内将日志实时推送到日志服务实例中,支持在OSS控制台直接查看实时日志。
提供日志分析服务,定制了常用的分析报表,数据查询更方便。
支持实时查询和分析原始日志,并按照Bucket名称、Object名称、API操作、时间等条件过滤日志。
静态网站托管
- 静态网站托管介绍
- 教程示例:使用自定义域名设置静态网站托管
- 教程示例:通过静态网站托管部署单页应用
数据处理与索引
- 数据处理与索引介绍
- 新版图片处理指南
- 老版图片服务手册
- 视频截帧
- 智能媒体管理(IMM)
- 数据索引(Data Indexing)
监控服务
- 监控服务概览
- 使用监控服务
- 使用报警服务
- 访问监控数据
- 监控指标参考
- 监控、诊断和故障排除
- 常见问题
事件通知
- 事件通知概述
- 教程示例:结合消息服务实现OSS事件通知
数据湖接入
- OSS-HDFS服务概述
- 使用前须知
- 开通并授权访问OSS-HDFS服务
- OSS-HDFS服务快速入门
- 管理OSS-HDFS服务快照
OSS与文件系统的对比
对比项 | OSS | 文件系统 |
---|---|---|
数据模型 | OSS是一个分布式的对象存储服务,提供的是一个Key-Value对形式的对象存储服务。 | 文件系统是一种典型的树状索引结构。 |
数据获取 | 根据Object的名称(Key)唯一的获取该Object的内容。
虽然用户可以使用类似test1/test.jpg的名字,但是这并不表示用户的Object是保存在test1目录下面的。对于OSS来说,test1/test.jpg仅仅只是一个字符串,与example.jpg并没有本质的区别。因此不同名称的Object之间的访问消耗的资源是类似的。 |
一个名为test1/test.jpg的文件,访问过程需要先访问到test1这个目录,然后再在该目录下查找名为test.jpg的文件。 |
优势 | 支持海量的用户并发访问。 | 支持文件的修改,比如修改指定偏移位置的内容、截断文件尾部等。也支持文件夹的操作,比如重命名目录、删除目录、移动目录等非常容易。 |
劣势 | OSS保存的Object不支持修改(追加写Object需要调用特定的接口,生成的Object也和正常上传的Object类型上有差别)。用户哪怕是仅仅需要修改一个字节也需要重新上传整个Object。
OSS可以通过一些操作来模拟类似文件夹的功能,但是代价非常昂贵。比如重命名目录,希望将test1目录重命名成test2,那么OSS的实际操作是将所有以test1/开头的Object都重新复制成以test2/开头的Object,这是一个非常消耗资源的操作。因此在使用OSS的时候要尽量避免类似的操作。 |
受限于单个设备的性能。访问越深的目录消耗的资源也越大,操作拥有很多文件的目录也会非常慢。 |
因此,将OSS映射为文件系统是非常低效的,也是不建议的做法。如果一定要挂载成文件系统的话,建议尽量只做写新文件、删除文件、读取文件这几种操作。使用OSS应该充分发挥其优点,即海量数据处理能力,优先用来存储海量的非结构化数据,比如图片、视频、文档等。
以下是OSS与文件系统的概念对比:
对象存储 OSS | 文件系统 |
---|---|
Object | 文件 |
Bucket | 主目录 |
Region | 无 |
Endpoint | 无 |
AccessKey | 无 |
无 | 多级目录 |
GetService | 获取主目录列表 |
GetBucket | 获取文件列表 |
PutObject | 写文件 |
AppendObject | 追加写文件 |
GetObject | 读文件 |
DeleteObject | 删除文件 |
无 | 修改文件内容 |
CopyObject (目标文件和源文件相同) | 修改文件属性 |
CopyObject(目标文件和源文件不同) | 复制文件 |
无 | 重命名文件 |
OSS术语表
英文 | 中文 |
---|---|
Bucket | 存储空间 |
Object | 对象或者文件 |
Endpoint | OSS 访问域名 |
Region | 地域或者数据中心 |
AccessKey | AccessKeyId和AccessKeySecret的统称,访问密钥 |
Put Object | 简单上传 |
Post Object | 表单上传 |
Multipart Upload | 分片上传 |
Append Object | 追加上传 |
Get Object | 简单下载 |
Callback | 回调 |
Object Meta | 文件元信息。用来描述文件信息,例如长度,类型等 |
Data | 文件数据 |
Key | 文件名 |
ACL (Access Control List) | 存储空间或者文件的权限 |
开始使用OSS
阿里云对象存储OSS(Object Storage Service)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音视频在内的各类数据文件。
使用控制台
您可以通过OSS控制台创建Bucket,并将文件上传至Bucket。上传完成后,将文件(Object)下载至本地或者通过生成签名URL的方式将文件分享给第三方,供其下载或预览。更多信息,请参见控制台使用流程。
观看以下视频快速了解如何通过控制台使用OSS。
使用命令行管理工具ossutil
ossutil是OSS的命令行工具,支持Windows、Linux、macOS系统。您可以通过ossutil提供的方便、简洁、丰富的Bucket和Object命令管理您的OSS。更多信息,请参见命令行工具ossutil快速入门。
使用图形化管理工具ossbrowser
ossbrowser是OSS的图形化工具,支持Windows、Linux、macOS系统。您可以通过ossbrowser的图形化界面方便直观地管理Bucket、上传下载Object和文件夹(目录)、简化Policy授权等操作。更多信息,请参见图形化管理工具ossbrowser快速入门。
ossbrowser是桌面式图形化工具,所以传输速度和性能不如命令行工具ossutil。
使用API和SDK
OSS提供Java、Python、PHP、Go等多种语言的API和SDK包,方便您快速进行二次开发。各语言SDK示例,请参见OSS SDK示例 。各API接口的详细信息,请参见OSS API文档。
基于OSS的文件系统管理
OSS的存储空间内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。如果您想要像使用本地文件夹和磁盘那样来使用OSS存储服务,可以通过配置云存储网关来实现。通过云存储网关提供的NFS、SMB(CIFS)、iSCSI协议,OSS的存储资源会以Bucket为基础映射成本地文件夹或者磁盘。您可以通过文件读写操作访问OSS资源,无缝衔接基于POSIX和块访问协议的应用,降低应用改造和学习成本。更多信息,请参见通过云存储网关挂载OSS。
Java SDK快速入门
本文介绍如何快速使用OSS Java SDK完成常见操作,如创建存储空间(Bucket)、上传文件(Object)、下载文件等。
前提条件
示例工程
OSS Java SDK提供了基于Maven和Ant的示例工程。您可以在本地设备上编译和运行示例工程,或者以示例工程为基础开发您的应用。工程的编译和运行方法,请参见工程目录下的README.md。
- Maven示例工程:aliyun-oss-java-sdk-demo-mvn.zip
- Ant示例工程:aliyun-oss-java-sdk-demo-ant.zip
创建存储空间
存储空间是OSS的全局命名空间,相当于数据的容器,可以存储若干文件。
以下代码用于创建examplebucket存储空间。
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 创建存储空间。
ossClient.createBucket(bucketName);
// 关闭OSSClient。
ossClient.shutdown();
关于创建存储空间的更多信息,请参见创建存储空间。
上传文件
以下代码用于上传文件到OSS。
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写文件名。文件名包含路径,不包含Bucket名称。例如exampledir/exampleobject.txt。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String content = "Hello OSS";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
// 关闭OSSClient。
ossClient.shutdown();
关于上传文件的更多信息,请参见上传文件。
下载文件
以下代码用于从OSS下载文件。
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写文件名。文件名包含路径,不包含Bucket名称。例如exampledir/exampleobject.txt。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream content = ossObject.getObjectContent();
if (content != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
content.close();
}
// 关闭OSSClient。
ossClient.shutdown();
关于下载文件的更多信息,请参见下载文件。
列举文件
以下代码用于列举examplebucket存储空间下的文件。默认列举100个文件。
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
ObjectListing objectListing = ossClient.listObjects(bucketName);
// objectListing.getObjectSummaries获取所有文件的描述信息。
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(" - " + objectSummary.getKey() + " " +
"(size = " + objectSummary.getSize() + ")");
}
// 关闭OSSClient。
ossClient.shutdown();
开发指南
发起请求
使用阿里云SDK发起请求
使用REST API发起请求
API参考
- 简介
- API概览
- 公共HTTP头定义
- 访问控制
- 关于Service操作
- 关于Region操作
- 关于Bucket操作
- 关于Object操作
- 关于LiveChannel的操作
简介
阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。您可以通过本文档提供的简单的REST接口,在任何时间、任何地点、任何互联网设备上进行上传和下载数据。基于OSS,您可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。
使用限制
您使用的OSS资源和相关功能,都有一定的限制,具体请参见OSS使用限制。
使用说明
OSS API参考主要介绍接口的请求语法、相关参数含义以及请求和返回示例。如果要进行快速二次开发,建议您使用SDK开发包。关于SDK的安装和使用,请参见OSS SDK参考。
OSS定价
关于OSS的价格,请参见OSS详细价格信息。关于OSS的计量计费方式,请参见OSS计量项和计费项。
错误码
请参见OSS常见错误响应。
资源术语
中文 | 英文 | 说明 |
---|---|---|
存储空间 | Bucket | 存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。 |
对象/文件 | Object | 对象是 OSS 存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。 |
地域 | Region | 地域表示 OSS 的数据中心所在物理位置。您可以根据费用、请求来源等综合选择数据存储的地域。详情请查看OSS已经开通的Region。 |
访问域名 | Endpoint | Endpoint 表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。具体的内容请参见各个Region对应的Endpoint。 |
访问密钥 | AccessKey | AccessKey,简称 AK,指的是访问身份验证中用到的AccessKeyId 和AccessKeySecret。OSS通过使用AccessKeyId 和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户,AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,其中AccessKeySecret 必须保密。 |
本文介绍对象存储OSS提供的相关API接口及其各API接口的用法。
关于Service操作
API | 描述 |
---|---|
GetService (ListBuckets) | 返回请求者拥有的所有存储空间(Bucket)。 |
关于Region操作
API | 描述 |
---|---|
DescribeRegions | 查询所有支持地域或者指定地域对应的Endpoint信息。 |
关于Bucket操作
分类 | API | 描述 |
---|---|---|
基础操作 | PutBucket | 创建Bucket。 |
DeleteBucket | 删除Bucket。 | |
GetBucket(ListObject) | 列出Bucket中所有文件(Object)的信息。 | |
GetBucketV2 (ListObjectsV2) | ||
GetBucketInfo | 获取Bucket信息。 | |
GetBucketLocation | 获取Bucket所属的位置信息。 | |
合规保留策略(WORM) | InitiateBucketWorm | 新建合规保留策略。 |
AbortBucketWorm | 删除未锁定的合规保留策略。 | |
CompleteBucketWorm | 锁定合规保留策略。 | |
ExtendBucketWorm | 延长已锁定的合规保留策略对应Bucket中Object的保留天数。 | |
GetBucketWorm | 获取Bucket的合规保留策略信息。 | |
权限控制(ACL) | PutBucketAcl | 设置Bucket访问权限。 |
GetBucketAcl | 获取Bucket访问权限。 | |
生命周期(Lifecycle) | PutBucketLifecycle | 设置Bucket中Object的生命周期规则。 |
GetBucketLifecycle | 获取Bucket中Object的生命周期规则。 | |
DeleteBucketLifecycle | 删除Bucket中Object的生命周期规则。 | |
传输加速(TransferAcceleration) | PutBucketTransferAcceleration | 为存储空间(Bucket)配置传输加速。 |
GetBucketTransferAcceleration | 获取目标存储空间(Bucket)的传输加速配置。 | |
版本控制(Versioning) | PutBucketVersioning | 设置Bucket的版本控制状态。 |
GetBucketVersioning | 获取Bucket的版本控制状态。 | |
GetBucketVersions(ListObjectVersions) | 列举Bucket中所有Object的版本信息。 | |
数据复制(Replication) | PutBucketReplication | 设置Bucket的数据复制规则。 |
GetBucketReplication | 查看Bucket已设置的数据复制规则。 | |
GetBucketReplicationLocation | 查看可复制到的目标Bucket所在的地域。 | |
GetBucketReplicationProgress | 查看Bucket的数据复制进度。 | |
DeleteBucketReplication | 停止Bucket的数据复制任务并删除Bucket的复制配置。 | |
授权策略(Policy) | PutBucketPolicy | 设置Bucket Policy。 |
GetBucketPolicy | 获取Bucket Policy。 | |
DeleteBucketPolicy | 删除Bucket Policy。 | |
清单(Inventory) | PutBucketInventory | 设置Bucket清单规则。 |
GetBucketInventory | 查看Bucket中指定的清单任务。 | |
ListBucketInventory | 查看Bucket中所有的清单任务。 | |
DeleteBucketInventory | 删除Bucket中指定的清单任务。 | |
日志管理(Logging) | PutBucketLogging | 开启Bucket访问日志记录功能。 |
GetBucketLogging | 查看Bucket的访问日志配置情况。 | |
DeleteBucketLogging | 关闭Bucket访问日志记录功能。 | |
静态网站(Website) | PutBucketWebsite | 设置Bucket为静态网站托管模式。 |
GetBucketWebsite | 查看Bucket的静态网站托管状态。 | |
DeleteBucketWebsite | 关闭Bucket的静态网站托管模式。 | |
防盗链(Referer) | PutBucketReferer | 设置Bucket的防盗链规则。 |
GetBucketReferer | 查看Bucket的防盗链规则。 | |
标签(Tags) | PutBucketTags | 添加或修改Bucket标签。 |
GetBucketTags | 查看Bucket标签信息。 | |
DeleteBucketTags | 删除Bucket标签。 | |
加密(Encryption) | PutBucketEncryption | 配置Bucket的加密规则。 |
GetBucketEncryption | 获取Bucket的加密规则。 | |
DeleteBucketEncryption | 删除Bucket的加密规则。 | |
请求者付费(RequestPayment) | PutBucketRequestPayment | 设置Bucket为请求者付费模式。 |
GetBucketRequestPayment | 查看Bucket请求者付费模式配置信息。 | |
跨域资源共享(CORS) | PutBucketCors | 为指定的存储空间(Bucket)设置跨域资源共享CORS(Cross-Origin Resource Sharing)规则。 |
GetBucketCors | 获取指定存储空间(Bucket)当前的跨域资源共享CORS规则。 | |
DeleteBucketCors | 关闭指定存储空间(Bucket)对应的跨域资源共享CORS功能并清空所有规则。 | |
Options | 浏览器在发送跨域请求之前会发送一个preflight请求(Options)给OSS,并带上特定的来源域、HTTP方法和header等信息,以决定是否发送真正的请求。 | |
元数据索引(MetaQuery) | OpenMetaQuery | 为Bucket开启元数据管理功能。 |
GetMetaQueryStatus | 获取指定Bucket的元数据索引库信息。 | |
DoMetaQuery | 查询满足指定条件的Object,并按照指定字段和排序方式列出Object信息。 | |
CloseMetaQuery | 关闭Bucket的元数据管理功能。 |
关于Object的操作
分类 | APi | 描述 |
---|---|---|
基础操作 | PutObject | 上传Object。 |
GetObject | 获取Object。 | |
CopyObject | 拷贝Object。 | |
AppendObject | 以追加写的方式上传Object。 | |
DeleteObject | 删除单个Object。 | |
DeleteMultipleObjects | 删除多个Object。 | |
HeadObject | 只返回某个Object的meta信息,不返回文件内容。 | |
GetObjectMeta | 返回Object的基本meta信息,包括该Object的ETag、Size(文件大小)以及LastModified等,不返回文件内容。 | |
PostObject | 通过HTML表单上传的方式上传Object。 | |
Callback | 您只需在发送给OSS的请求中携带相应的Callback参数即能实现回调。 | |
RestoreObject | 解冻归档类型(Archive)或冷归档(Cold Archive)的文件(Object)。 | |
SelectObject | 对目标文件执行SQL语句,返回执行结果。 | |
分片上传(MultipartUpload) | InitiateMultipartUpload | 初始化一个Multipart Upload事件。 |
UploadPart | 根据指定的Object名和uploadId来分块(Part)上传数据。 | |
UploadPartCopy | 通过在UploadPart请求的基础上增加一个请求头x-oss-copy-source来调用UploadPartCopy接口,实现从一个已存在的Object中拷贝数据来上传一个Part。 | |
CompleteMultipartUpload | 在将所有数据Part都上传完成后,您必须调用CompleteMultipartUpload接口来完成整个文件的分片上传。 | |
AbortMultipartUpload | 取消Multipart Upload事件并删除对应的Part数据。 | |
ListMultipartUploads | 列举所有执行中的Multipart Upload事件,即已经初始化但还未完成(Complete)或者还未中止(Abort)的Multipart Upload事件。 | |
ListParts | 列举指定uploadId所属的所有已经上传成功Part。 | |
权限控制(ACL) | PutObjectACL | 修改Object的访问权限。 |
GetObjectACL | 查看Object的访问权限。 | |
软链接(Symlink) | PutSymlink | 创建软链接。 |
GetSymlink | 获取软链接。 | |
标签(Tagging) | PutObjectTagging | 设置或更新对象标签。 |
GetObjectTagging | 获取对象标签信息。 | |
DeleteObjectTagging | 删除指定的对象标签。 |
关于Live Channel的操作
API | 描述 |
---|---|
PutLiveChannelStatus | 切换LiveChannel的状态。 |
PutLiveChannel | 创建LiveChannel。 |
GetVodPlaylist | 获取播放列表。 |
PostVodPlaylist | 生成播放列表。 |
GetLiveChannelStat | 获取LiveChannel的推流状态信息。 |
GetLiveChannelInfo | 获取LiveChannel的配置信息。 |
GetLiveChannelHistory | 获取LiveChannel的推流记录。 |
ListLiveChannel | 列举LiveChannel。 |
DeleteLiveChannel | 删除LiveChannel。 |
数据迁移
- OSS之间数据迁移:
OSS Bucket之间的数据迁移包含以下场景:
- 同账号下的OSS数据迁移,即同一个阿里云账号下相同或者不同地域Bucket之间的数据迁移。具体步骤,请参见使用数据复制功能迁移同账号下的OSS数据。
- 跨账号下的OSS数据迁移,即不同阿里云账号下相同或不同地域Bucket之间的数据迁移。具体操作,请参见使用在线迁移服务跨账号迁移OSS数据。
-
注意事项
- 数据迁移任务会在跨区域复制或者同区域复制规则配置完成的3~5分钟后启动。
- 由于Bucket间的数据复制采用异步(近实时)复制,数据迁移到目标Bucket需要的时间取决于数据的大小,通常几分钟到几小时不等。
- 迁移历史数据时,从源Bucket复制的Object可能会覆盖目标Bucket中同名的Object。为避免同名文件被覆写,建议您对源Bucket和目标Bucket开启版本控制。开启版本控制的具体步骤,请参见版本控制相关操作。
- 如果您希望在数据迁移进度达到100%时,不再继续迁移源Bucket中的增量数据,您可以选择关闭数据同步。此时,已迁移的数据将被保留在目标Bucket中,源Bucket中的增量数据将不再迁移到目标Bucket。
-
前提条件
- 已创建RAM用户。
为阿里云账号A创建RAM用户A,为阿里云账号B创建RAM用户B。具体步骤,请参见创建RAM用户。
- 已创建AccessKey。
分别为RAM用户A以及RAM用户B创建访问密钥AccessKey,并记录AccessKey信息。具体步骤,请参见为RAM用户创建访问密钥
- 已为RAM用户授权。
分别为RAM用户A以及RAM用户B授予
AliyunOSSFullAccess
以及AliyunMGWFullAccess
的权限。具体步骤,请参见为RAM用户授权。 -
- 已创建RAM用户。
- 第三方数据源迁移到 OSS:
您可以使用阿里云在线迁移服务将第三方数据源,如亚马逊AWS、谷歌云等数据轻松迁移至阿里云对象存储OSS。
使用在线迁移服务,您只需在控制台填写源数据地址和目标OSS地址信息,并创建迁移任务即可。启动迁移后,您可以通过控制台管理迁移任务,查看迁移进度、流量等信息;也可以生成迁移报告,查看迁移文件列表、错误文件列表。具体各个数据源的迁移操作
- 从AWS S3上的应用无缝切换至OSS
注意事项
- 使用限制
由于OSS兼容S3协议,因此您可以通过S3 SDK进行创建Bucket、上传Object等相关操作。执行相关操作过程中其带宽、QPS等限制遵循OSS性能指标,详情请参见使用限制。
- 客户端配置
从AWS S3迁移到OSS后,您仍然可以使用S3 API访问OSS,仅需要对S3的客户端应用进行如下改动:
- 获取阿里云账号或RAM用户的AccessKey ID和AccessKey Secret,并在您使用的客户端和SDK中配置您申请的AccessKey ID与AccessKey Secret。
- 设置客户端连接的Endpoint为OSS Endpoint。OSS Endpoint列表请参见访问域名和数据中心。
- 使用限制
- 使用ossimport迁移数据:
ossimport支持将任意地域的本地存储数据、第三方存储数据、对象存储OSS数据迁移至任意地域的OSS中。本文介绍如何使用ossimport将数据从第三方存储迁移到OSS。
背景信息
某用户的数据存储于腾讯云COS广州(华南)区域,数据大小约500TB。现希望将这些数据,通过ossimport工具,于一周内迁移至OSS华东1(杭州)区域。在迁移的同时,需保证自身业务的正常进行。
ossimport有单机模式和分布式模式两种部署方式:- 对于小于30TB的小规模数据迁移,单机模式即可完成。
- 对于大规模的数据迁移,请使用分布式模式。
此需求需要使用ossimport分布式配置进行数据迁移。
说明 您也可以使用在线迁移服务进行数据的迁移,迁移过程更加简单,详情请参见在线迁移服务。准备工作
- 开通OSS,并创建华东1(杭州)地域的存储空间(Bucket)
- 创建RAM用户,并授予访问OSS的权限
在RAM控制台创建RAM用户,并授权该RAM用户访问OSS的权限,然后保存AccessKey ID和AccessKey Secret。详情请参见创建RAM用户并授予相关权限。
- (可选)购买ECS
购买与OSS相同地域的ECS实例。有关ECS实例规格的更多信息,请参见通用型。如果迁移后ECS实例需释放,建议按需购买ECS。说明 如果分布式部署所需的计算机数量较少时,您可以直接在本地部署;如果所需计算机数量较多时,建议在ECS实例上部署。本示例以ECS实例进行迁移任务。
ECS所需数量的计算公式为:X/Y/(Z/100)台。其中X为需要迁移的数据量、Y为要求迁移完成的时间(天)、Z为单台ECS迁移速度Z Mbps(每天迁移约Z/100 TB数据)。假设单台ECS迁移速度达到200Mbps(即每天约迁移2TB数据),则上述示例中需购买ECS 36台(即500/7/2)。
- 配置ossimport
结合本示例中的大规模迁移需求,您需要在ECS上搭建ossimport分布式模式。有关分布式部署的配置定义信息,如
conf/job.cfg
、conf/sys.properties
、并发控制等配置,请参见说明及配置。有关分布式部署的相关操作,如ossimport下载、配置过程的常见错误及排除等,请参见分布式部署。
迁移方案
使用分布式模式将第三方存储迁移至OSS的过程如下:
说明 在ECS上搭建ossimport分布式环境后,ossimport从腾讯云COS广州(华南)区域下载数据到ECS华东1(杭州),建议使用外网。使用ossimport从ECS华东1(杭州)将数据上传到OSS华东1(杭州),建议使用内网。迁移过程涉及到的成本包含:源和目的存储空间访问费用、源存储空间的流出流量费用、ECS实例费用、数据存储费用、时间成本。如果数据超过TB级别,存储成本和迁移时间成正比。相对流量、存储费用,ECS费用较小,增加ECS数量,会减少迁移时间。
迁移实施
- 从HDFS迁移数据到OSS
-
本文介绍如何使用阿里云Jindo DistCp从HDFS迁移数据到OSS。
背景信息
在传统大数据领域,HDFS经常作为大规模数据的底层存储。在进行数据迁移、数据拷贝的场景中,最常用的是Hadoop自带的DistCp工具。但是该工具不能很好利用对象存储OSS的特性,导致效率低下并且不能保证数据一致性。此外,该工具提供的功能选项较单一,无法很好地满足用户的需求。
阿里云Jindo DistCp(分布式文件拷贝工具)用于大规模集群内部或集群之间拷贝文件。Jindo DistCp使用MapReduce实现文件分发,错误处理和恢复,把文件和目录的列表作为MapReduce任务的输入,每个任务会完成源列表中部分文件的拷贝。全量支持HDFS之间、HDFS与OSS之间、以及OSS之间的数据拷贝场景,提供多种个性化拷贝参数和多种拷贝策略。
相对于Hadoop DistCp,使用阿里云Jindo DistCp从HDFS迁移数据到OSS具有以下优势:- 效率高,在测试场景中最高可达到1.59倍的加速。
- 基本功能丰富,提供多种拷贝方式和场景优化策略。
- 深度结合OSS,对文件提供归档、压缩等操作。
- 实现No-Rename拷贝,保证数据一致性。
- 场景全面,可完全替代Hadoop DistCp,目前支持Hadoop2.7+和Hadoop3.x。
前提条件
- 如果您使用的是自建ECS集群,需要具备Hadoop2.7+或Hadoop3.x环境以及进行MapReduce作业的能力。
- 如果您使用的是阿里云E-MapReduce:
- 对于EMR3.28.0/bigboot2.7.0及以上的版本,可以通过Shell命令的方式使用Jindo DistCp。更多信息,请参见Jindo DistCp使用说明。
- 对于EMR3.28.0/bigboot2.7.0以下的版本,可能会存在一定的兼容性问题,您可以通过提交工单申请处理。
步骤一:下载JAR包
步骤二:配置OSS的AccessKey
您可以通过以下任意方式配置AccessKey:- 在示例命令中配置AccessKey
例如,在将HDFS中的目录拷贝到OSS指定路径的示例命令中结合--ossKey、--ossSecret、--ossEndPoint选项配置AccessKey。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming/examplefile --dest oss://examplebucket/example_file --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com
- 通过配置文件预先配置AccessKey
将OSS的--ossKey、--ossSecret、--ossEndPoint预先配置在Hadoop的core-site.xml文件里。示例命令如下:
<configuration> <property> <name>fs.oss.accessKeyId</name> <value>xxx</value> </property> <property> <name>fs.oss.accessKeySecret</name> <value>xxx</value> </property> <property> <name>fs.oss.endpoint</name> <!-- 阿里云ECS环境下推荐使用内网OSS Endpoint,即oss-cn-xxx-internal.aliyuncs.com --> <value>oss-cn-xxx.aliyuncs.com</value> </property> </configuration>
- 配置免密功能
配置免密功能,避免明文保存AccessKey,提高安全性。具体操作,请参见使用JindoFS SDK免密功能。
步骤三:迁移或拷贝数据
以下以Jindo DistCp 3.7.3版本为例,您可以根据实际环境替换对应的版本号。
- 全量迁移或拷贝数据
将HDFS指定目录/data/incoming下的数据全量迁移或拷贝到OSS目标路径oss://examplebucket/incoming/,示例命令如下:
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --parallelism 10
示例中涉及的各参数或选项说明如下:
参数及选项 说明 示例 --src 待迁移或拷贝的HDFS数据所在的路径。 /data/incoming --dest OSS中存放迁移或拷贝数据的目标路径。 oss://examplebucket/incoming --ossKey 访问OSS的AccessKey ID。关于获取AccessKey ID的具体操作,请参见获取AccessKey。 LTAI5t7h6SgiLSganP2m**** --ossSecret 访问OSS的AccessKey Secret。关于获取AccessKey Secret的具体操作,请参见获取AccessKey。 KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint Bucket所在地域(Region)对应的访问域名(Endpoint)。关于OSS支持的地域和对应的访问域名列表信息,请参见访问域名和数据中心。 注意 ECS环境下推荐使用内网 ossEndPoint,即oss-cn-xxx-internal.aliyuncs.com。oss-cn-hangzhou.aliyuncs.com --parallelism 根据集群资源调整任务并发数。 10 - 增量迁移或拷贝数据
如果您仅希望拷贝在上一次全量迁移或拷贝后源路径下新增的数据,此时您可以结合--update选项完成数据的增量迁移或拷贝。
将HDFS指定目录/data/incoming下的数据增量迁移或拷贝到OSS目标路径oss://examplebucket/incoming,示例命令如下:
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --update --parallelism 10
使用--update选项时,默认开启校验和Checksum。开启后,DistCp将对源路径和目标路径的文件名称、文件大小以及文件的Checksum进行比较。如果源路径或目标路径下的文件名称、文件大小或者文件的Checksum不一致时,将自动触发增量迁移或拷贝任务。
如果您不需要对源路径和目标路径的文件的Checksum进行比较,请增加--disableChecksum选项关闭Checksum校验,示例命令如下:
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --update --disableChecksum --parallelism 10
附录一:Jindo DistCp支持的参数及选项
Jindo DistCp提供一系列的参数及选项。您可以通过以下命令获取各参数及选项的具体用法。
hadoop jar jindo-distcp-3.7.3.jar --help
各参数及选项的含义及其示例如下表所示。
参数及选项 说明 示例 --src 指定拷贝的源路径。 --src oss://exampleBucket/sourceDir --dest 指定拷贝的目标路径。 --dest oss://exampleBucket/destDir --parallelism 指定拷贝的任务并发数,可根据集群资源调节。 --parallelism 10 --policy 指定拷贝到OSS后的文件类型。取值: - ia:低频访问
- archive:归档存储
- coldArchive:冷归档存储
--policy archive --srcPattern 指定通过正则表达式来选择或者过滤需要拷贝的文件,正则表达式必须为全路径正则匹配。 --srcPattern .*\.log --deleteOnSuccess 指定在拷贝任务完成后删除源路径下的文件。 --deleteOnSuccess --outputCodec 指定文件的压缩方式。当前版本支持编解码器gzip、gz、lzo、lzop和snappy,以及关键字none和keep。关键字含义如下: - none:保存为未压缩的文件。如果文件已压缩,则Jindo DistCp会将其解压缩。
- keep(默认值):不更改文件压缩形态。
说明 如果您需要在开源Hadoop集群环境中使用lzo的压缩方式,请确保已安装gplcompression的native库和hadoop-lzo包。如果缺少相关环境,建议使用其他压缩方式进行压缩。--outputCodec gzip --srcPrefixesFile 指定需要拷贝的文件列表,列表里文件以src路径作为前缀。 --srcPrefixesFile file:///opt/folders.txt --outputManifest 指定在dest目录下生成一个gzip压缩的文件,记录已完成拷贝的文件信息。 --outputManifest=manifest-2020-04-17.gz --requirePreviousManifest 指定本次拷贝操作是否需要读取之前已拷贝的文件信息。取值如下: - false:不读取已拷贝的文件信息,直接拷贝全量数据。
- true:读取已拷贝的文件信息,仅拷贝增量数据。
--requirePreviousManifest=false --previousManifest 指定本次拷贝需要读取已拷贝文件信息所在的路径,完成增量更新。 --previousManifest=oss://exampleBucket/manifest-2020-04-16.gz --copyFromManifest 从已完成的Manifest文件中进行拷贝,通常与--previousManifest选项配合使用。 --previousManifest oss://exampleBucket/manifest-2020-04-16.gz --copyFromManifest --groupBy 通过正则表达式将符合规则的文件进行聚合。 --groupBy='.*/([a-z]+).*.txt' --targetSize 指定聚合后的文件大小阈值,单位为MB。 --targetSize=10 --enableBalancePlan 适用于拷贝任务中数据量差异不大的场景,例如均为大于10 GB或者均为小于10 KB的文件。 --enableBalancePlan --enableDynamicPlan 适用于拷贝任务中数据量差异较大的场景,例如10 GB大文件和10 KB小文件混合的场景。 --enableDynamicPlan --enableTransaction 保证Job级别的一致性,默认是Task级别。 --enableTransaction --diff 查看本次拷贝是否完成全部文件拷贝,并对未完成拷贝的文件生成文件列表。 --diff --ossKey 访问OSS的AccessKey ID。 --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret 访问OSS的AccessKey Secret。 --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint Bucket所在地域对应的Endpoint。 --ossEndPoint oss-cn-hangzhou.aliyuncs.com --cleanUpPending 清理OSS残留文件,清理过程需要消耗一定的时间。 --cleanUpPending --queue Yarn队列名称。 --queue examplequeue1 --bandwidth 指定本次DistCp任务所用的单机带宽,单位为 MB。 --bandwidth 6 --disableChecksum 关闭Checksum校验。 --disableChecksum --enableCMS 开启云监控告警功能。 --enableCMS --update 使用增量同步功能,即仅同步上一次全量迁移或拷贝后源路径下新增的数据到目标路径。 --update --filters 通过filters参数指定一个文件路径。在这个文件中,每一行配置一个正则表达式,对应DistCp任务中不需要拷贝或比对的文件。 --filters /path/to/filterfile.txt --tmp 指定在使用DistCp工具的过程中,用于存放临时文件的目录。 --tmp /data --overwrite 使用覆盖同步功能,即使用源路径完全覆盖目标路径。 --overwrite --ignore 忽略数据迁移期间发生的异常,相关报错不会中断任务,并最终以DistCp Counter的形式透出。如果使用了--enableCMS,也会通过指定方式进行通知。 --ignore 附录二:场景示例
场景一:使用JindoDistCp成功传输数据后,如何验证数据完整性?
JindoDistCp提供了以下两种方式用于验证数据的完整性。
- 方式一:DistCp Counters
通过Distcp Counters信息中包含的BYTES_EXPECTED、FILES_EXPECTED等参数验证数据完整性。
示例 JindoDistcpCounter BYTES_COPIED=10000 BYTES_EXPECTED=10000 FILES_COPIED=11 FILES_EXPECTED=11 ... Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0
示例中可能包含的Counter参数如下:
参数 说明 BYTES_COPIED 拷贝成功的字节数。 BYTES_EXPECTED 预期拷贝的字节数。 FILES_COPIED 拷贝成功的文件数。 FILES_EXPECTED 预期拷贝的文件数。 FILES_SKIPPED 增量拷贝时跳过的文件数。 BYTES_SKIPPED 增量拷贝时跳过的字节数。 COPY_FAILED 拷贝失败的文件数,不为0时触发告警。 BYTES_FAILED 拷贝失败的字节数。 DIFF_FILES 源路径与目标路径下不相同的文件数,不为0时触发告警。 DIFF_FAILED 文件比较操作异常的文件数,并计入DIFF_FILE。 SRC_MISS 源路径下不存在的文件数,并计入DIFF_FILES。 DST_MISS 目标路径下不存在的文件数,并计入DIFF_FILES。 LENGTH_DIFF 源文件和目标文件大小不一致的数量,并计入DIFF_FILES。 CHECKSUM_DIFF Checksum校验失败的文件数,并计入COPY_FAILED。 SAME_FILES 源路径与目标路径下完全相同的文件数。 - 方式二:通过--diff选项
您可以在示例中结合--diff选项对源路径和目标路径下文件名和文件大小进行比较。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --diff
场景二:从HDFS迁移数据到OSS过程中,迁移任务可能随时失败,要想支持断点续传,该使用哪些参数?
- 您可以在示例中结合--diff选项查看HDFS指定路径下的文件是否都已迁移至OSS。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --diff
如果所有文件都已迁移完成,则提示如下信息,否则在执行目录下会生成一个manifest文件。
INFO distcp.JindoDistCp: Jindo DistCp job exit with 0
- 对于生成的manifest文件,您可以使用--copyFromManifest和--previousManifest选项迁移剩余文件。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --previousManifest=file:///opt/manifest-2020-04-17.gz --copyFromManifest --parallelism 20
其中,--previousManifest选项后指定的file:///opt/manifest-2020-04-17.gz为当前执行命令的本地路径。
场景三:如果要以低频访问、归档或者冷归档的方式存储写入OSS的文件,该使用哪些参数?
您可以在示例中添加--policy选项来指定写入OSS文件的存储类型。以下以指定为低频访问类型为例:hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --policy ia --parallelism 10
如果需要指定为归档存储类型,请将--policy ia替换为--policy archive。如需指定为冷归档存储类型,请将--policy ia替换为--policy coldArchive。此外,目前冷归档存储仅支持部分地域,更多信息,请参见冷归档存储(Cold Archive)。
场景四:了解待迁移或拷贝的源路径下数据的分布情况后,例如大文件和小文件的占比,该使用哪些参数来优化数据传输速度?
- 小文件较多,大文件较大
例如HDFS源路径下包含50万个大小为100 KB左右的文件,10个5 TB大小的文件,此时您可以结合--enableDynamicPlan选项优化数据传输速度。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --enableDynamicPlan --parallelism 10
- 文件大小无明显差异
例如HDFS源路径下包含100个大小为200 KB的文件,此时您可以结合--enableBalancePlan选项优化数据传输速度。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --enableBalancePlan --parallelism 10
说明 不支持在同一个示例中同时使用--enableDynamicPlan以及--enableBalancePlan选项。场景五:迁移或者拷贝任务完成后,希望仅保留目标路径下的数据,且删除源路径下的指定数据,该使用哪些参数?
您可以结合--deleteOnSuccess选项,在迁移或者拷贝任务完成后,仅保留OSS目标路径下的数据,并删除HDFS源路径下的指定数据。
hadoop jar jindo-distcp-3.7.3.jar --src /data/incoming --dest oss://examplebucket/incoming --ossKey LTAI5t7h6SgiLSganP2m**** --ossSecret KZo149BD9GLPNiDIEmdQ7dyNKG**** --ossEndPoint oss-cn-hangzhou.aliyuncs.com --deleteOnSuccess --parallelism 10