1. bucket 的 versioning 状态切换
* 默认状态 unversioned* --> versioning-enabled <--> versioning-suspended
Warning
Once you version-enable a bucket, it can never return to an unversioned state
- Objects stored in your bucket before you set the versioning state have aversion ID of null
- When you enable versioning, existing objects in your bucket do not changes
- What changes is how Amazon S3 handles the objects in future requests
- When you suspend versioning, existing objects in your bucket do not changes
- What changes is how Amazon S3 handles objects in future requests
2. add obj 操作
2.1 unversioned
- 删除同名key的所有内容(标记为'null'的所有 元数据 记录)
- 插入新key的 元数据 , 标记版本为'null'
2.2 enabled
- 不关心是否有同名key存在, 为新key生成新的version_id 作为其数据记录的版本
- 不能覆盖/删除已经存在的 'null' version 的记录(如果有)
- response 中有 version_id(就是新生成的那个)
2.3 suspended [2]
- 如果 'null' 版本的同名key不存在(新key或者 'null' 版本被删除),新增加的key的版本标记为'null'。
- 如果 'null' 版本的同名key存在,新增加的key的数据覆盖已有的 'null' 版本数据记录。
Note
删除 'null' 版本的已有数据(如果有),新增内容作为新的'null'版本的数据
- response 中 version_id 为 None
3. delete obj 操作
3.1 unversioned
- 删除该key版本为'null'的记录 (只可能有这些版本的记录)
3.2 enabled [3]
未指定 version_id:
- 新建 delete maker,并为 delete maker 生成新的 version_id
- response 中,version_id 非空,delete_marker为True
指定了 version_id (要删除该id关联的快照或者delete marker):
- 直接删除用户指定版本的快照/delete marker的所有记录
- response 中,version_id 非空(就是用户指定的那个),delete_marker为 False
- 对于指定 version_id 为 'null'的场景处理相同
3.3 suspended
未指定version_id
| v3 | |null* | +------+ +------+ | null | | v3 | +------+ ==== delete ===> +------+ | v2 | | v2 | +------+ +------+ | v1 | | v1 | +------+ +------+
- 删除 'null' 版本的记录
- 插入一个delete marker,该marker的id为 'null'
- response 中 delete_marker 为 True,version_id 为 None
Note
虽然同为 'null',但右边的 'null*' 已经只是一个delete marker了,没有任何有用的用户数据和其关联了
Note
对于没有指定版本的删除请求,只能删除'null'版本,不会删除任何非'null'版本。如果没有'null'版本,那么什么都不删,仅仅插入'null' delete marker
指定了version_id
同3.2
4. copy obj 操作中 metadata 的处理
A: 源metadata
- A1: 用户提供,使用用户提供的值
- A2: 用户指定源版本,使用源版本的值
- A3: 无用户提示,源bucket 关闭versioning,使用源key的 null 版本
- A4: 无用户提示,源bucket versioning suspend,使用源key的 当前 版本
- A5: 无用户提示,源bucket versioning enabled,使用源key的 当前 版本
B: 目标metadata版本
- B1: 目标bucket versioning 关闭, insert 'null'
- B2: 目标bucket versioning supend, overwrite 'null'
- B3: 目标bucket versioning enabled,目标key的新version id
5. 访问对象
5.1 访问对象快照
- 未指定版本的获取请求,访问的是current version
- 指定版本的获取请求,访问的是对象的指定版本
5.2 有两种方式将对象的非当前版本搞成当前版本
- 拷贝指定版本到相同bucket
- 永久删除指定版本之后的所有版本
参考
[1] Using Versioning http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
[2] Adding Objects to Versioning-Suspended Buckets http://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersionSuspendedBuckets.html
[3] Deleting Object Versions http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectVersions.html
[4] Deleting Objects from Versioning-Suspended Buckets http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectsfromVersioningSuspendedBuckets.html
联系作者
杨红刚 <rtlinux@163.com>