依据AWS S3,没有定义修改数据的操作,修改数据时,均需要重新上传对象的数据和元数据。
本文有如下假定:
依据前述,业界主流对象存储服务比如AWS S3并未定义修改对象数据的操作,而国内的各家公有云对象存储服务,提供了对象的修改对象数据的操作。
国内的公有云对象存储服务,相关操作的文档的链接(排名不分先后),如下:
以华为云OBS的修改写对象为例,接口定义如下:
PUT /ObjectName?modify&position=Position HTTP/1.1
Host: bucketname.obs.region.myhuaweicloud.com
Content-Type: type
Content-Length: length
Authorization: authorization
Date: date
<object Content>
本接口的关键参数,如下:
modify
,不需要指定参数值。position
,依据实际情况指定。Content-Length
,本次操作修改的数据的长度。对于普通对象,即使用PUT或者复制方式上传的对象,对象大小的范围为[1, 5GiB]
,因此
position
的位置小于1
或者大于5GiB
,则校验失败。Content-Length
的取值小于1
或者大于5GiB
,则校验失败。position
和Content-Length
的和大于5GiB
,则校验失败。对于使用多段方式上传的对象,涉及的API,如下:
段的数量上限为10000
,每个段大小的范围为[1, 5GiB]
,因此对象整体的范围可到达到[1, 48.8TiB]
,因此
position
的位置小于1
或者大于48.8TiB
,则校验失败。Content-Length
的取值小于1
或者大于48.8TiB
,则校验失败。position
和Content-Length
的和大于48.8TiB
,则校验失败。对象大小的规格,参见AWS S3文档。
参考AWS S3数据一致性,ETag
基于对象的数据,使用MD5
算法计算得到。
服务端校验数据一致的流程
MD5
算法计算得到MD5
值X1
。Content-MD5
为使用本次数据计算到的MD5
值X1
。MD5
算法计算得到本次操作的MD5
值X2
。MD5
值X1
和X2
的比较。
ETag
字段,使用服务端计算的MD5
值X2
填充。客户端校验数据一致的流程
MD5
算法计算得到MD5
值X1
。MD5
算法计算得到本次操作的MD5
值X2
。ETag
字段,使用服务端计算的MD5
值X2
填充。X1
和服务端返回的ETag
进行比较。
服务端对象的MD5值
由于变更了部分数据,因此对象的ETag
值和数据已不一致,需要设计补救方案。
对于普通对象,即使用PUT或者复制方式上传的对象,考虑在后台任务中读取全量数据,计算对象数据的MD5
值,保存至ETag
字段的值保存下来。
对于使用多段方式上传的对象,涉及的API,如下:
依据Checking object integrity的介绍,该类对象的ETag
值样例为C9A5A6878D97B48CC965C1E41859F034-14
,由所有的段的MD5
值计算得到,因此修复操作相对复杂一些。
position
和Content-Length
计算涉及变化的段的清单。MD5
值。MD5
值,按照多段对象的ETag
值的生成规则,重新计算,得到最终的结果。对象存储服务在实现时,有如下需求:
MD5
值,数据的起始位置、段的长度。按照AWS S3多版本中的说明,多版本特性的开关作用在桶级,包含如下状态:
Buckets can be in one of three states:
- Unversioned (the default)
- Versioning-enabled
- Versioning-suspended
接口定义中未提供versionId
,因此只支持修改当前版本,不支持修改历史版本。
参考AWS S3 归档和AWS S3 分级中的说明,处于归档状态的对象,需要先取回才能访问。
显而易见,此处为了维护对象语义,照顾对象存储服务的实现,当对象处于归档状态时,不允许更新对象的数据。
参考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:ObjectDataUpdated:Put
。
依据AWS S3 data consistency model的说明,对象存储服务提供read-after-write
的模型。
当多客户端对相同对象并发的发起修改数据的操作时,参照文件语义,提供最终一致性。