1 AWS S3基础
AWS S3 全名是 Simple Storage Service,简单存储服务。
基本特性:
- 提供了统一的接口 REST/SOAP 来统一访问任何数据
- 对 S3 来说,存在里面的数据就是对象名(键),和数据(值)
- 不限量,单个文件最高可达 5TB
- 高速。每个 bucket 下每秒可达 3500 PUT/COPY/POST/DELETE 或 5500 GET/HEAD 请求
- 具备版本,权限控制能力
- 具备数据生命周期管理能力
常用场景:
- 备份
- 存储内容
- 大数据分析
- 挂载静态网站
- 灾难恢复
2 基本概念
2.1 Bucket
在 S3 里,数据存储的前提是建立一个 Bucket。Bucket 默认是不公开的。
Bucket 有几个特点:
- 命名(Namespace)需全球唯一。每个帐号默认可建 100 个,可申请至最多 1000 个
- 创建者的拥有权不可转让,也不可以从一个 Region 转去别的 Region
- 没有对象存储数量限制
- Bucket 就像是电脑里面的某一个顶层分区。所有的对象都必须保存在某一个 bucket 下面。
访问Bucket的方式:
- Virtual 1:https://bucket.s3.amazonaws.com
- Virtual 2:https://bucket.s3-aws-region.amazonaws.com
- Path:https://s3-aws-region.amazonaws.com/bucket
- Bucket名字必须要全局唯一的原因就是因为Bucket名字也会是域名的一部分
2.2 Object
Bucket 里面每一个存储的数据就是对象,由对象名(键),和数据(值)组成。
- 对象的键(Key)可以很长,甚至按照一定前缀格式来指定,从而模拟文件夹的层级结构,比如
Photo/Family/2020-01-25-new-year/altogether.jpg
。 - 每一个对象其实还包含一些元信息(Meta-data),包括系统指定的文件类型,创建时间,加密算法等,和用户上传时指定的元信息。元信息在对象创建后都无法更改。
- Version ID - 当versioning功能开启后,每个Object都会拥有一个Version ID,用来区分有相同Key的不同的Object(Bucket + Key + Version ID 三要素唯一定义了S3中的一个Object)
- 可以为对象指定最多 10个标签(Tag),标签的键和值的最大长度是 128 和 256 个字符。标签是可以修改和新增的,能与权限控制,生命周期管理,和数据分析等结合使用。
- 单个文件上传最大是 5GB。超过的话,需要使用 multipart upload API。最大支持 5TB。
3 一致性特性
对程序员来说,这么一个类似数据库的东西,肯定需要关心它的读写特性和一致性模型。
没有锁的功能。如果同时(几乎)发起两个更新对象的 PUT 请求,键相同,那么,以到达 S3 时间先后处理更新。
不同对象的更新,没法做到原子操作。
对全新的对象来说,它是 Read-after-Write Consistency 的。也就是写了之后马上读,肯定就是你刚才上传的数据。
如果你要更新数据,那就变成 Eventual Consistency 了。也就是说,更新后马上读,可能是旧的数据,也可能是新的。
这里有一个比较坑的地方是,如果你先调用 GET 请求访问一个不存在的资源,S3 告诉你它不存在。然后你马上上传数据,再调用一个 GET,这时候是有可能拿不回来的。
4 存储类别
S3提供了如下几种存储类型
S3 Standard: 默认的存储类型,提供99.99%可用性,99.999999999%持久性。数据文件会冗余地存储在多个设施的多个设备中。设计目的是可以支持同时两个设施损坏。适合性能敏感的使用案例和需要经常访问的数据。
S3 Standard - Infrequent Access: 提供99.99%可用性,99.999999999%持久性。 针对需要长期储存且不常访问, 但是需要立即能够访问到的数据 (例如备份以及访问频率已减少的较旧数据) 进行了优化。存储费用比S3 Standard要低,但是每个访问请求的费用要远高于S3 Standard。
Reduced Redundancy Storage(RRS): 提供99.99%可用性和99.99%的持久性。适用于能再次生成的数据,比如图片的缩略图等。
Glacier: 最便宜的存储方案,但是没法实时访问数据,必须要先恢复数据后才能进行访问。不适用于需要经常访问的数据。
S3 提供了生命管理周期(Lifecycle Management)的机制,可以将Object从S3 Standard转换到S3 Standard-Infrequent Access,再到Glacier。也可以在设定的时间过后自动删除object。但需要注意的是,不是一到达设定的时间后就立马开始转换,设定Lifecycle Management后,S3会将需要转换的object标记上转换时间,实际转换时间一般会延后。