S3 bucket versioning 总结

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

  • 永久删除指定版本之后的所有版本

联系作者

杨红刚 <rtlinux@163.com>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值