Amazon S3的bucket中,可以支持同时保留一个对象的多个版本的变体。
bucket通过对象的Version ID来标识对象版本信息。打开多版本之前,对象的Version ID被设置为null。打开多版本之后,对象不会立刻发生变化,而是在收到新变更请求后,才会发生变化。
bucket对多版本的支持,有3种模式可以选择,它们的主要区别是,对不指定具体Version ID的操作方式。
- Unversioned (the default):不支持对象多版本,每次对象操作Version ID均为null。
- Versioning-enabled:强制对象多版本,即使不指定Version ID,每次对象操作系统也会为其分配具体唯一的Version ID。
- Versioning-suspended:非指定即为null的多版本控制,如果不指定Version ID,系统便认为其Version ID为null。
unversioned --> versioning-enabled <--> versioning-suspended
versioning-enabled和versioning-suspended模式的bucket可以相互转换,但都无法回退到unversioned模式。
下面介绍对象在添加、删除和读取时,不同versioning类型,其Version ID的处理方式。
unversioned模式,不支持对象多版本,对象每次操作的Version ID都为null,添加和删除都会覆盖旧值,读取只读取最新的值,故不做过多讨论。
1. Add Objects Versions
【Adding objects to versioning-enabled buckets】:Adding objects to versioning-enabled buckets - Amazon Simple Storage Service
向versioning-enabled buckets添加object时,存储会每次默认为对象,分配一个具体唯一的版本号。
【Adding objects to versioning-suspended buckets】:Adding objects to versioning-suspended buckets - Amazon Simple Storage Service
向versioning-suspended bucket添加object时,如果不指定Version ID,默认指定null。如果已有Version ID为null的相同key的对象,则会对其进行覆写。
如果指定Version ID,并已有相同key和版本的对象,则指定版本号会被设置为null。
如果已有相同key的null版本,则会覆写上一个null版本。
2. Delete Objects Versions
【Deleting object versions from a versioning-enabled bucket】:Deleting object versions from a versioning-enabled bucket - Amazon Simple Storage Service
从versioning-enabled bucket中删除对象时,如果不指定Version ID,则并不会删除之前的任何版本,而是插入一个新Version ID的delete marker作为对象的当前版本。
要想真正删除对象版本,则必须指定版本号,DELETE Object versionId。
【Deleting objects from versioning-suspended buckets】:
Deleting objects from versioning-suspended buckets - Amazon Simple Storage Service
从versioning-suspended的bucket删除对象,不指定Version ID时,便认为是要删除对象的null版本。
如果对象没有的null版本,则会增加一个Version ID为null的Delete Marker版本,即读取对象且不指定版本时,会读取到这个Version ID为null的Delete Marker版本。
删除对象时指定版本,则只会删除对象的指定版本。
3. Get Objects Versions
【Retrieving object versions from a versioning-enabled bucket】:Retrieving object versions from a versioning-enabled bucket - Amazon Simple Storage Service
从versioning-enabled bucket中,读取对象,如果不指定Version ID,则返回对象的最新current版本。
如果指定Version ID,则会返回对应的版本。
【Retrieving objects from versioning-suspended buckets】:Retrieving objects from versioning-suspended buckets - Amazon Simple Storage Service
从versioning suspened bucket中读取对象,如果不指定Version ID,则返回null版本,指定Version ID则返回对象的指定版本。