对象业务的修改数据接口

· 浏览次数 : 0

小编点评

本文主要讨论了对象存储服务中的修改数据操作问题,并对比了不同云服务提供商的实施情况。 首先,文章指出AWS S3等业界主流对象存储服务并没有定义修改对象数据的操作,而是要求用户重新上传整个对象及其元数据来修改数据。这一做法对于普通对象的限制较小,但对于使用多段方式上传的对象则存在较大的限制。 然后,文章介绍了国内几家公有云对象存储服务提供商(如华为云OBS)的相关操作文档,这些服务提供了修改对象的元数据功能,但仍然无法直接修改对象的实际数据。 接着,文章提出了一种基于MD5算法的服务端数据一致性校验方法,并解释了为什么现有的修改数据操作会引入额外的成本。 最后,文章总结了修改数据操作的定义、实施情况和相关问题,并提出了改进的方向,包括优化数据切割、提高并发性、支持多版本和生命周期管理等。

正文

依据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,依据实际情况指定。
  • 操作指标,HTTP头部Content-Length,本次操作修改的数据的长度。

实现思路

修改数据的范围

对于普通对象,即使用PUT或者复制方式上传的对象,对象大小的范围为[1, 5GiB],因此

  • 假如position的位置小于1或者大于5GiB,则校验失败。
  • 假如Content-Length的取值小于1或者大于5GiB,则校验失败。
  • 假如positionContent-Length的和大于5GiB,则校验失败。

对于使用多段方式上传的对象,涉及的API,如下:

段的数量上限为10000,每个段大小的范围为[1, 5GiB],因此对象整体的范围可到达到[1, 48.8TiB],因此

  • 假如position的位置小于1或者大于48.8TiB,则校验失败。
  • 假如Content-Length的取值小于1或者大于48.8TiB,则校验失败。
  • 假如positionContent-Length的和大于48.8TiB,则校验失败。

对象大小的规格,参见AWS S3文档

ETag

参考AWS S3数据一致性ETag基于对象的数据,使用MD5算法计算得到。

服务端校验数据一致的流程

  • 客户端使用本次上传的数据,基于MD5算法计算得到MD5X1
  • 客户端在请求中附带的Content-MD5为使用本次数据计算到的MD5X1
  • 对象存储服务端收到数据后,基于MD5算法计算得到本次操作的MD5X2
  • 服务端执行MD5X1X2的比较。
    • 二者一致,则判定数据一致,本次写入操作成功。
    • 二者不一致,则判定数据不一致,本次写入操作失败。
  • 服务端在返回的响应中增加ETag字段,使用服务端计算的MD5X2填充。

客户端校验数据一致的流程

  • 客户端发起请求,并在读数据、写数据的过程中,使用本次上传的数据,基于MD5算法计算得到MD5X1
  • 对象存储服务端收到数据后,基于MD5算法计算得到本次操作的MD5X2
  • 服务端在返回的响应中增加ETag字段,使用服务端计算的MD5X2填充。
  • 客户端使用本地计算的X1和服务端返回的ETag进行比较。
    • 二者一致,则判定数据一致,本次写入操作成功。
    • 二者不一致,则判定数据不一致,本次写入操作失败。考虑到服务端已成功写入,因此需要增加必要的修复措施。

服务端对象的MD5值
由于变更了部分数据,因此对象的ETag值和数据已不一致,需要设计补救方案。

对于普通对象,即使用PUT或者复制方式上传的对象,考虑在后台任务中读取全量数据,计算对象数据的MD5值,保存至ETag字段的值保存下来。

对于使用多段方式上传的对象,涉及的API,如下:

依据Checking object integrity的介绍,该类对象的ETag值样例为C9A5A6878D97B48CC965C1E41859F034-14,由所有的段的MD5值计算得到,因此修复操作相对复杂一些。

  • 依据修改点起始位置positionContent-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 分级中的说明,处于归档状态的对象,需要先取回才能访问。
显而易见,此处为了维护对象语义,照顾对象存储服务的实现,当对象处于归档状态时,不允许更新对象的数据。

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:ObjectDataUpdated:Put

并发一致性

依据AWS S3 data consistency model的说明,对象存储服务提供read-after-write的模型。

当多客户端对相同对象并发的发起修改数据的操作时,参照文件语义,提供最终一致性。

与对象业务的修改数据接口相似的内容:

对象业务的修改数据接口

依据AWS S3,没有定义修改数据的操作,修改数据时,均需要重新上传对象的数据和元数据。 本文有如下假定: 对象存储服务基于文件语义实现。 接口定义 依据前述,业界主流对象存储服务比如AWS S3并未定义修改对象数据的操作,而国内的各家公有云对象存储服务,提供了对象的修改对象数据的操作。 国内的公有

对象存储服务中对象业务的非标接口

本文中讨论的对象存储服务及接口,主要和AWS S3对标。 AWS S3提供的对象存储业务,与传统的POSIX规范相比,舍弃了很多特性,比如: 文件类型 硬链接 软链接 目录 文件相关的操作 追加写 随机写 截断 修改名称 目录相关的操作 创建目录 修改名称 删除目录 元数据 时间 crtime即创建

[转帖]MySQL 8.0 Instant Add Column功能解析

https://zhuanlan.zhihu.com/p/408702204 概述 DDL(Data Definition Language)是数据库内部的对象进行创建、删除、修改的操作语言,主要包括:加减列、更改列类型、加减索引等类型。数据库的模式(schema)会随着业务的发展不断变化,如果没有

[转帖]线上一个隐匿 Bug 的复盘

前言 之前负责的一个项目上线好久了,最近突然爆出一 Bug,最后评估影响范围将 Bug 升级成了故障,只因为影响的数据量有 10000 条左右,对业务方造成了一定的影响。 但因为不涉及到资金损失,Bug 修复后对数据进行修补,所以最终级别也是较低的。 今天和大家分享这个线上隐匿的 Bug,也好在工作

Troubleshooting 专题 - 问正确的问题 得到正确的答案

在很多公司中,IT、数据中心、业务系统一出故障,会有很多人被叫到作战室(就是一个为了解决该问题,而把所有相关人员集中在一起的一个会议室), 但是对于这个问题他们是否可以修复, 是否他们应该负有责任, 经常没有线索. 「证据」(基础架构监控数据, 日志文件, 用户投诉等等) 表明了症状, 但是与 ro

糟糕,数据库异常不可用怎么办?

摘要:糟糕,数据库异常不可用怎么办?挺着急的,在线等。 本文分享自华为云社区《糟糕,数据库异常不可用怎么办?》,作者:GaussDB 数据库。 随着数字化转型的加速,数据量爆发式增长,用户对数据库运维能力要求更高,实现对数据库的高效智能管理,尤其是业务异常时,数据库运维平台能自动定位故障并修复,或者

[转帖]关于 AREX

https://arextest.github.io/website/zh-Hans/docs/intro/ AREX 介绍​ 背景​ 对于一个初上线的简单服务,只需通过常规的自动化测试加上人工即可解决,但我们线上核心的业务系统往往比较复杂,通常也会频繁的需求迭代,如何保证被修改后的系统原有业务的正

drools规则动态化实践

业务逻辑中经常会有一些冗长的判断,需要写特别多的if else,或者一些判断逻辑需要经常修改。这部分逻辑如果以java代码来实现,会面临代码规模控制不住,经常需要修改逻辑上线等多个弊端。这时候我们就需要集成规则引擎对这些判断进行线上化的管理。

浅谈字节码增强技术系列1-字节码增强概览

作者:董子龙 前言 前段时间一直想参照lombok的实现原理写一篇可以生成业务单据修改记录插件的专利,再查阅资料的过程中,偶然了解到了字节码增强工具-byteBuddy。但是由于当时时间紧促,所以没有深入的对该组件进行了解。其实再我们的日常开发中,字节码增强组件的身影无处不在,例如spring-ao

主动写入流对@ResponseBody注解的影响

问题回溯 2023年Q2某日运营反馈一个问题,商品系统商家中心某批量工具模板无法下载,导致功能无法使用(因为模板是动态变化的) 商家中心报错(JSON串): {"code":-1,"msg":"失败"} 负责的同事看到失败后立即与我展开讨论(因为不是关键业务,所以不需要回滚,修复即可),我们发现新功