OSS
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。
OSS可以被理解成一个即开即用、无限大空间的存储集群。
OSS将数据文件以对象/文件(Object)的形式上传到存储空间(Bucket)中。OSS提供的是一个Key-Value键值对形式的对象存储服务。用户可以根据Object的名称(Key)唯一地址获取该Object的内容。
可以进行以下OSS相关的操作:
- 创建存储空间,并向存储空间中上传文件。
- 获取已上传文件的地址,进行文件的分享和下载。
- 修改存储空间或文件的属性或元信息,为其设置相应的权限。
- 在对象存储OSS控制台进行基础和高级OSS操作。
- 通过开发者工具包SDK或直接在应用程序中调用RESTful API,进行基础和高级OSS操作。
特点
-
易用性:简单易用,便于管理,深度集成数据处理服务
-
高可靠:为数据持久存储提供稳定保障
- 多份副本:多份副本保存,有效应对各类硬件故障
- 冗余架构:OSS全冗余的基础架构,消除单点隐患,保障服务的高可用性
- 异地容灾:提供跨区域复制功能和灾备方案,支持数据自动备份在不同城市,实现异地容灾能力
-
强安全:多重访问控制细粒度的授权管理。Bucket|Object权限控制、Access ID和请求签名、VPC网络链路层访问控制、RAM&STS主子账号授权
-
低成本:数据按照冷热分层提供最具性价比的存储方式
OSS对象存储 传统存储 用相比自建存储降低25%~75%的成本,提供更加稳定安全可靠的数据保障 一次性投入高,资源利用率很低 三种存储类型,不同数据冷热,追求最极致的TCO 存储受硬盘容量限制,需人工扩容 多线带宽接入,上行流量免费 单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容 完全托管的存储模式,0成本运维 需专人运维,成本高 对比项 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的时候要尽量避免类似的操作。 受限于单个设备的性能。访问越深的目录消耗的资源也越大,操作拥有很多文件的目录也会非常慢。
基本概念
数据以对象(Object)的形式存储在OSS的存储空间(Bucket )中。如果要使用OSS存储数据,您需要先创建Bucket,并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后,您可以将数据以Object的形式上传到Bucket,并指定Object的文件名(Key)作为其唯一标识。
OSS以HTTP RESTful API的形式对外提供服务,访问不同地域需要不同的访问域名(Endpoint)。当您请求访问OSS时,OSS通过使用访问密钥(AccessKey ID和AccessKey Secret)对称加密的方法来验证某个请求的发送者身份。
Object操作在OSS上具有原子性和强一致性。
(1)对象/文件(Object)
对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由**元信息(Object Meta)、用户数据(Data)和文件名(Key)**组成。对象由存储空间内部唯一的Key来标识。对象元信息是一个键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。
对象的生命周期是从上传成功到被删除为止。在整个生命周期内,对象信息不可变更,重复上传同名的对象会覆盖之前的对象。因此,OSS不支持修改文件的部分内容等操作。
(2)存储空间(Bucket)
存储空间是用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
- 每个Object必须都包含在Bucket中;
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有对象都直接隶属于其对应的存储空间;
- 每个用户可以拥有多个存储空间,
- 存储空间的名称在OSS范围内必须是全局唯一的,一旦创建之后无法修改名称;
- 存储空间内部的对象数目没有限制,大小总和不能超过2PB。
(3)地域
Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。
(4)访问域名
Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。例如杭州Region的外网Endpoint是oss-cn-hangzhou.aliyuncs.com,内网Endpoint是oss-cn-hangzhou-internal.aliyuncs.com。
如果Bucket的权限为公共读或者公共读写时,Object的访问规则如下:
http://<你的bucket名字>.<数据中心服务域名>/<你的object名字>
示意图:
http://oss-example.oss-cn-hangzhou.aliyuncs.com/aliyun-logo.png
(5)访问密钥
AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。
(6)强一致性
Object操作在OSS上具有原子性,操作要么成功要么失败,不会存在有中间状态的Object。OSS保证用户一旦上传完成之后读到的Object是完整的,OSS不会返回给用户一个部分上传成功的Object。
Object操作在OSS同样具有强一致性,用户一旦收到了一个上传(PUT)成功的响应,该上传的Object就已经立即可读,且数据已经冗余写入到多个设备中。不存在上传的中间状态,即不会出现read-after-write却无法读取到数据的情况。删除操作也类似,即用户成功删除指定的Object后,该Object立即变为不存在。
存储类型
(1)标准存储
-
高性能、高可靠、高可用的对象存储服务
-
吞吐量大,热点文件、需要频繁访问的业务场景,适用于各种社交、分享类的图片、音视频应用、大型网站、大数据分析等业务场景
-
持久性:99.999999999%
-
最低存储时间:无
(2)低频访问
-
较低存储成本和实时访问特性的对象存储服务
-
数据访问实时,读取频率较低的业务场景
-
持久性:99.999999999%
-
最低存储时间:30天,最小计量单位:64KB
(3)归档存储
- 提供了高持久性、极低存储成本的对象存储服务
- 适用于数据长期保存的业务场景,例如档案数据、医疗影像、科学资料、影视素材等。
- 数据需解冻(约1分钟)后访问,解冻会产生数据取回费用。
- 持久性: 99.999999999%
- 最低存储时间:60天,最小计量单位:64KB
(4)冷归档存储
- 数据需解冻(约1分钟)后访问,解冻会产生数据取回费用
- 适用于需要超长时间存放的极冷数据,例如因合规要求需要长期留存的数据、大数据及人工智能领域长期积累的原始数据、影视行业长期留存的媒体资源、在线教育行业的归档视频等业务场景。
- 数据需解冻后访问,解冻时间根据数据大小和选择的解冻模式决定,解冻会产生数据取回费用。
- 最低存储时间:180天,最小计量单位:64KB
权限控制
OSS提供ACL (Access Control List)权限控制方法,OSS ACL提供Bucket级别的权限访问控制,Bucket目前有三种访问权限:
- Public-read-write
- Public-read
- Private
创建Bucket时默认为private权限。可以通过OSS的Put Bucket Acl接口修改该Bucket的权限。
请求路由规则
- OSS使用域名系统(DNS, Domain Name System)将请求发往正确的服务器
- 从URL中通过三级域名提取bucket名称,然后将请求路由到 Bucket所在的数据中心,即所谓的三级域名访问方式
- 当一个数据中心的 OSS服务器收到属于其他数据中心bucket的请求时,OSS服务器会返回HTTP 403(禁止访问)错误码,并在 HTTP消息体内提示正确的数据中心服务域名
文件上传代码
依赖:
<!-- OSS SDK 相关依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
配置文件:
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: dev
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 50MB
# 设置总上传的文件大小
max-request-size: 100MB
aliyun:
oss:
endpoint: xtslife-oss.oss-cn-chengdu.aliyuncs.com # oss对外服务的访问域名
accessKeyId: test # 访问身份验证中用到用户标识
accessKeySecret: test # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
bucketName: xtslife-oss # oss的存储空间
policy:
expire: 300 # 签名有效期(S)
maxSize: 10 # 上传文件大小(M)
callback: http://localhost:8080/aliyun/oss/callback # 文件上传成功后的回调地址
dir:
prefix: xtslife/images/ # 上传文件夹路径前缀
- endpoint、accessKeyId、accessKeySecret、bucketName、callback、prefix都要改为你自己帐号OSS相关的,callback需要是公网可以访问的地址。
- web文件上传大小受spring.servlet.multipart.max-file-size和spring.servlet.multipart.max-request-size配置影响。
是PutObject方法来上传单个文件(Object),属于OSS上传方式中的简单上传。简单上传适用于一次HTTP请求交互即可完成上传的场景,例如小文件(小于5 GB)的上传。
Put Object方式最大不能超过5GB,大文件可以用multipart方式上传,Object大小不能超过48.8TB。
(1)创建OSSClient实例
在此处可通过ClientConfiguration配置OSS连接配置。
private OSSClient getOssClient() {
return new OSSClient(endpoint,
new DefaultCredentialProvider(accessKeyId,secretAccessKey),
new ClientConfiguration());
}
(2)文件上传
/**
* 文件上传
* @param file
* @return
*/
public Map<String, Object> uploadFile (@Nullable MultipartFile file) {
Map<String, Object> map = new HashMap<>();
String fileExt = FileUtil.extName(file.getOriginalFilename());
SimpleDateFormat sm = new SimpleDateFormat("yyyy/MM");
String today = sm.format(new Date());
String fileKey = BASE_FILE_PATH + "/" + today +"/"+getCurrentDate()+"."+fileExt;
OSSClient ossClient = getOssClient();
try {
// 文件存储入OSS,Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
// 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object
ossClient.putObject(bucketName, fileKey, file.getInputStream());
log.info("上传文件:" + fileKey + "存入OSS成功。");
} catch (Exception e) {
log.warn("上传文件异常,errMsg = {}", e);
} finally {
ossClient.shutdown();
}
map.put("fileUrl",fileKey);
map.put("url",getUrl(fileKey,ossClient));
return map;
}
(3)如果想通过链接访问你保存的文件,可使用以下方法生成外链
private String getUrl(String fileKey, OSSClient ossClient) {
// 设置URL过期时间为10年 3600l* 1000*24*365*10
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
// 生成URL
URL url = ossClient.generatePresignedUrl(bucketName, fileKey, expiration);
if (url != null) {
log.info(fileKey + "生成的访问路径为:"+ url);
return url.toString();
}
return null;
}
(4)如果你想删除OSS上保存的文件,可通过deleteObject方法来删除,在此方法上必要条件是保存时的文件内部路径。
public void deleteFile (String fileKey) {
OSSClient ossClient = getOssClient();
try {
// 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
// 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket
ossClient.deleteObject(bucketName, fileKey);
log.info("删除文件:" + fileKey + "删除OSS成功。");
} catch (Exception e) {
log.warn("删除文件异常,errMsg = {}", e);
} finally {
ossClient.shutdown();
}
}
文件下载
三种下载方式:
- 简单下载:下载已经上传的文件(Object) , Object下载是使用HTTP的GET请求来完成的。
- 断线续传下载:OSS提供了从Object指定的位置开始下载的功能,在下载大的Object的时候,可以分多次下载。如果下载中断,重启的时候也可以从上次完成的位置开始继续下载。
- 授权给第三方下载:将私有Bucket内部的Object授权给第三方下载的时候,不应该直接将AccessKey提供给下载者,而应该使用URL签名和临时访问凭证两种方法。
应用场景
(1)图片和音视频等应用的海量存储
OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。
(2)CDN加速与动静分离
利用海量互联网带宽,OSS可以实现海量数据的互联网并发下载。OSS提供原生的传输加速功能,支持上传加速、下载加速,提升跨国、跨洋数据上传、下载的体验。同时,OSS也可以结合CDN产品,提供静态内容存储、分发到边缘节点的解决方案,利用CDN边缘节点缓存的数据,提升同一个文件被同一地区客户大量重复并发下载的体验。
(3)云端数据处理
上传文件到OSS后,可以配合媒体处理服务和图片处理服务进行云端的数据处理。
OSS实践要点
(1)数据备份与跨域复制
异地容灾:通过跨区域复制功能可在另━数据中心维护副本,实现异地容灾
数据合规:在远距离的OSS数据中心之间复制数据以满足数据合规性要求
(2)安全防护与管理
OSS适用于存储各种类型的静态资源,为防止OSS的资源被恶意盗用,OSS提供了几种安全防护功能,还可以集成安全类产品进行安全防护。
-
防盗链
目前OSS提供的防盗链方法主要有以下两种:
- 设置Referer。该操作通过控制台和SDK均可进行,用户可根据自身需求进行选择。http请求发给服务器后,如果服务器要求必须是某个地址或者某几个地址才能访问,而你发送的referer不符合他的要求,就会拦截或者跳转到他要求的觉地址进行访问。
- 签名URL,适合习惯开发的用户。
-
权限控制
Bucket私有的情况下,需要通过签名URL访问object。
由于签名URL存在一个过期时间,所以签名URL会定期过期,增加了一直恶意下载的成本,同时用户需要集成OSS签名URL的API,有一定的开发成本。
例子:
我在www.google.com里有一个www.baidu.com链接,那么点击这个ww.baidu.com,它的header信息里就有:
Referer=http://www.google.com
那么可以利用这个来防止盗链了,比如我只允许我自己的网站访问我自己的图片服务器,那我的域名是ww.google.com,那么图片服务器每次取到Referer来判断一下是不是我自己的域名ww.google.com,如果是就继续访问,不是就拦截。
(3)CDN加速与动静分离
利用海量互联网带宽,OSS可以实现海量数据的互联网并发下载。OSS提供原生的传输加速功能,支持上传加速、下载加速,提升跨国、跨洋数据上传、下载的体验。同时,OSS也可以结合CDN产品,提供静态内容 存储、分发到边缘节点的解决方案,利用CDN边缘节点缓存的数据,提升同一个文件被同一地区客户大量重复并发下载的体验。
(4)云端数据处理
上传文件到OSS后,可以配合媒体转码服务(MTS),图片处理服务(IMG),批量计算服务、离线数据处理服务(ODPS)充分挖掘数据的价值,引领从IT到DT的变革。
能够提供:
- 富媒体数据处理:自带图片处理/自定义函数等增值服务(比如:图片水印),配合MTS实现视频转码/截帧
- 存储+计算:与阿里云数据计算产品打通,可直接调用计算服务挖掘您的数据价值