OSS简单介绍

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/ # 上传文件夹路径前缀
  1. endpoint、accessKeyId、accessKeySecret、bucketName、callback、prefix都要改为你自己帐号OSS相关的,callback需要是公网可以访问的地址。
  2. 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实现视频转码/截帧
  • 存储+计算:与阿里云数据计算产品打通,可直接调用计算服务挖掘您的数据价值
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值