我们提供安全,免费的手游软件下载!
依据 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
本接口的关键参数,如下:
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
的模型。
当多客户端对相同对象并发的发起修改数据的操作时,参照文件语义,提供最终一致性。
热门资讯