依据AWS S3,没有定义重命名对象的操作。
本文有如下假定:
- 对象存储服务基于文件语义实现。
接口定义
依据前述,业界主流对象存储服务比如AWS S3并未定义重命名对象的操作,而国内的各家公有云对象存储服务,提供了对象的重命名操作。
国内的公有云对象存储服务,相关操作的文档的链接(排名不分先后),如下:
以华为云OBS的重命名对象为例,接口定义如下:
POST /ObjectName?name=Name&rename HTTP/1.1
Host: bucketname.obs.region.myhuaweicloud.com
Authorization: authorization
Date: date
本接口的关键参数,如下:
- 对象名,指定对象名。
- 目标对象名,指定修改后的对象名。
- 操作名,参数名为
rename
,不需要指定参数值。
实现思路
重命名对象的操作,采用Linux命令模拟时,可以有如下方式:
- 方案一,即先复制、再删除原文件。
cp A B rm -f A
- 方案二,移动文件。
mv A B
不涉及文件系统中inode
的变化,仅处理文件系统中目录的元数据,因此基本不受文件大小的影响。
ETag
参考AWS S3数据一致性,ETag
基于对象的数据,使用MD5
算法计算得到。
由于修改名称不涉及数据的变更,因此无需更新对象的ETag
。
多版本
按照AWS S3多版本中的说明,多版本特性的开关作用在桶级,包含如下状态:
Buckets can be in one of three states:
- Unversioned (the default)
- Versioning-enabled
- Versioning-suspended
原对象关联的所有版本,均需要关联到最新的对象名。
分级
参考AWS S3 归档和AWS S3 分级中的说明,处于归档状态的对象,需要先取回才能访问。
显而易见,此处为了维护对象语义,照顾对象存储服务的实现,当对象处于归档状态时,不允许更新对象。
WORM
参考AWS S3 Object Lock中的说明,开启WORM后:
- 在保护期内的对象,不允许修改,不允许删除。
- 在保护期外的对象,不允许修改,允许删除。
因此从维护对象语义的角度讲,在保护期内的对象、保护期外的对象,均不允许修改对象。
生命周期
参考AWS S3 Lifecycle,修改元数据操作的对象可能符合生命周期规则,从而被恰好正在运行的后台任务删除掉。
此时有如下选择:
- 生命周期的后台任务具备更高的优先级,提前中断操作,正常删除掉对象,对象存储服务对客户应用返回操作失败。
- 生命周期的后台任务优先级相对较低,跳过当前对象,待下次运行时再决策是否删除。
数据加密
依据SSE-C的说明,客户应用在执行PUT/GET/Head/Copy操作时,均需要提供加密数据的密钥。
即在发起请求时,提供如下头部:
x-amz-copy-source-server-side-encryption-customer-algorithm
x-amz-copy-source-server-side-encryption-customer-key
x-amz-copy-source-server-side-encryption-customer-key-MD5
如前所述,本操作只涉及对象名的变更,不涉及元数据和数据的变化,因此不涉及加密的处理。
事件通知
依据AWS S3 事件通知中的说明,对象存储服务可以提供事件通知,目前支持的事件类型见文档,显然不包括重命名操作,可以扩展事件名,比如s3:ObjectUpdated:Put
。
并发一致性
依据AWS S3 data consistency model的说明,对象存储服务提供read-after-write
的模型。
当多客户端对相同对象并发的发起重命名操作时,参照文件语义,提供最终一致性。
标签:重命名,存储,对象,AWS,接口,S3,操作 From: https://www.cnblogs.com/jackieathome/p/18239638