对象存储服务的完整性检查

· 浏览次数 : 6

小编点评

本文主要介绍了在Amazon S3中如何确保对象存储的数据一致性和完整性。通过使用MD5算法和其他相关算法,可以检测出数据在上传、下载或修改过程中是否发生损坏。 **1. 上上传对象后的数据一致性校验** 在上传对象时,客户端会计算数据的MD5值,并将其添加到请求的头部。服务端在接收到对象后会计算数据的MD5值,并与客户端的MD5值进行比较。如果两者相同,则认为数据一致,上传成功;否则,认为数据不一致,上传失败。 **2. 下载对象后数据的一致性校验** 在下载对象时,客户端会从HTTP流中读取数据并计算其MD5值。然后,客户端会将计算得到的MD5值与从服务端获取的ETag值进行比较。如果两者相同,则认为数据一致,下载成功;否则,认为数据不一致,下载失败。 **3. Amazon S3数据一致性模型相关API** Amazon S3提供了一些API来检查对象完整性,如HeadObject、GetObject、GetObjectAttributes、PutObject等。其中,HeadObject可以用来获取对象的元数据,包括ETag值。GetObjectAttributes可以用来获取对象属性,包括ETag值。PutObject则可以用来上传对象,同时服务端会计算数据的MD5值,并将其返回给客户端。 **4. 客户端计算数据完整性方案** 客户端在上传对象时会同步计算数据的MD5值,并将其存储在本地。在上传过程中,客户端会将计算的MD5值添加到请求的头部。服务端在接收到对象后会同步计算数据的MD5值,并与客户端的MD5值进行比较。如果两者相同,则认为数据一致,上传成功;否则,认为数据不一致,上传失败。 **5. 服务端计算数据完整性方案** 服务端在接收到对象后会计算数据的MD5值,并与客户端的MD5值进行比较。如果两者相同,则认为数据一致,上传成功;否则,认为数据不一致,上传失败。此外,服务端还会在响应消息中使用ETag字段返回MD5值,以便客户端在下载时进行校验。 **6. 将ETag值用于客户端校验** 客户端在下载对象时,会从HTTP流中读取数据并计算其MD5值。然后,客户端会将计算得到的MD5值与从服务端获取的ETag值进行比较。如果两者相同,则认为数据一致,下载成功;否则,认为数据不一致,下载失败。 **7. 使用文件的API与对象的API创建和修改文件** 当使用文件的API创建或修改文件时,ETag的取值为全0。这是因为在这种情况下,文件的元数据还没有被更新,因此使用文件的API创建或修改的文件的ETag始终为全0。 **8. 使用对象的API创建对象** 当使用对象的API创建对象时,如果上传时没有填充Content-MD5,则服务端不会使用对象的数据计算MD5值,而是将Content-MD5的值作为ETag返回给客户端。这样,客户端就可以使用这个ETag值来进行后续的数据一致性校验。 **9. 使用对象的API创建对象并填充Content-MD5** 当使用对象的API创建对象时,如果填充了Content-MD5,则服务端会使用对象的数据计算MD5值,并将其作为ETag返回给客户端。这样,客户端就可以使用这个ETag值来进行后续的数据一致性校验。 **10. 使用对象的API创建对象并使用文件的API修改** 当使用对象的API创建对象后,使用文件的API对其进行修改(如修改写入、截断、追加写入等),则对象的ETag的取值为全0。这是因为在这种情况下,文件的元数据已经发生了变化,但是对象的元数据并没有被更新,因此使用对象的API创建的对象的ETag仍然为全0。 **11. 使用对象的多段API上传的对象** 对于使用对象的多段API上传的对象,可以使用以下策略来确定对象的ETag值: * 合并多段接口的响应中,对象的ETag的取值为全0。 * 如果服务端使用了对象的数据计算MD5值,则ETag按照实际填充填充。 * 如果服务端没有使用对象的数据计算MD5值,则以Content-MD5的值作为ETag,返回给客户端,不执行服务端校验。 * 如果服务端使用了对象的数据计算MD5值,则作为ETag,返回给客户端,执行服务端校验。 **12. 更新对象的ETag值** 在客户端使用HeadObject和GetObject访问对象的元数据时,会更新对象的ETag值。此外,后台可以增加周期性任务,比如基于快照,定时扫描ETag值不正确的对象,重新计算对象的ETag值。这样可以确保对象的ETag值始终与实际数据保持一致。

正文

使用场景有:

  • 上传对象后,如何确定对象存储收到的数据和客户端本地的数据是否一致。
  • 下载对象后,如何确定本地收到的数据和对象存储保存的数据是否一致。

AWS S3

相关API

应用场景

依据文档Checking object integrity,基于MD5算法,介绍完整性实现方案。

上传对象时的服务端校验方案

  • 客户端计算对象的数据的MD5值,x1
  • 客户端使用PutObject上传对象时,在请求的头部中增加Content-MD5,取值为x1
  • 服务端接收对象的数据,同步计算数据的MD5值。
  • 服务端接收对象结束,最终得到数据的MD5值,x2
  • 服务端对比x1x2
    • 如果两者相同,则判定本次上传过程中数据一致,上传成功。
    • 如果两者不相同,则判定本次上传过程中数据不一致,上传失败。
  • 服务端在PutObject的响应消息中,使用ETag字段在头部中返回MD5值,填充x2

上传对象时的客户端校验方案

  • 客户端使用PutObject上传对象。
    • 客户端在上传过程中,同步计算数据的MD5值。
  • 服务端接收对象的数据,同步计算数据的MD5值。
  • 服务端接收对象结束,最终得到数据的MD5值,x2
    • 客户端完成数据的MD5值的计算,x1
  • 服务端在PutObject的响应消息中,使用ETag字段在头部中返回MD5值。
  • 客户端对比x1和响应中的ETag字段的值。
    • 如果两者相同,则判定本次上传过程中数据一致,上传成功。
    • 如果两者不相同,则判定本次上传过程中数据不一致,上传失败。

客户端下载对象时的校验方案

  • 客户端使用GetObject完整读取对象的数据。
    • 从头部中提取ETag,作为x1
  • 客户端从HTTP流中读取数据,同步计算MD5值。
  • 客户端下载对象完毕,最终得到数据的MD5值,x2
  • 客户端对比x1x2
    • 如果两者相同,则判定本次下载过程中数据一致,下载成功。
    • 如果两者不相同,则判定本次下载过程中数据不一致,下载失败。

实现方案

依据文档Working with object metadata的如下描述:

An entity tag (ETag) that represents a specific version of an object. For objects that are not uploaded as a multipart upload and are either unencrypted or encrypted by server-side encryption with Amazon S3 managed keys (SSE-S3), the ETag is an MD5 digest of the data.

对象的ETag值是对象的元数据。

基于文件系统来实现对象存储服务,对于相同的对象,同时提供文件和对象的访问能力,就ETag的实现方案,有如下场景:

  • 使用文件的API创建、修改的文件,使用对象的API访问。
  • 使用对象的API创建的对象。
  • 使用对象的API创建的对象,使用文件的API修改过,比如修改写、截断、追加写等。
  • 使用对象的多段API上传的对象。

ETag的实现策略,如下:

  • 使用文件的API创建、修改过的文件,ETag的取值为全0。
  • 使用对象的API创建的对象,上传时没有填充Content-MD5,则可选策略如下:
    • 服务端不使用对象的数据计算MD5值,ETag的取值为全0。
    • 服务端使用对象的数据计算MD5值,ETag按照实际填填充。
  • 使用对象的API创建的对象,上传时填充了Content-MD5,则可选策略如下:
    • 服务端不使用对象的数据计算MD5值,以Content-MD5的值作为ETag,返回给客户端,不执行服务端校验。
    • 服务端使用对象的数据计算MD5值,作为ETag,返回给客户端,不执行服务端校验。
    • 服务端使用对象的数据计算MD5值,作为ETag,返回给客户端,执行服务端校验。
  • 使用对象的API创建的对象,使用文件的API修改过,比如修改写、截断、追加写等,对象的ETag的取值为全0。
  • 使用对象的多段API上传的对象,则可选策略如下:
    • 合并多段接口的响应中,对象的ETag的取值为全0。
    • 参照Checking object integrity的方案,计算对象的ETag的取值。
  • 使用对象的HeadObjectGetObject访问对象的元数据时,更新对象的ETag值。
  • 后台增加周期性任务,比如可基于快照,定时扫描ETag值不正确的对象,重新计算对象的ETag值。

与对象存储服务的完整性检查相似的内容:

对象存储服务的完整性检查

使用场景有: 上传对象后,如何确定对象存储收到的数据和客户端本地的数据是否一致。 下载对象后,如何确定本地收到的数据和对象存储保存的数据是否一致。 AWS S3 Checking object integrity 实现完整性校验时,AWS S3提供的算法包括CRC32、CRC32C、SHA-1、SH

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

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

体验.NET与文件存储服务MinIO

对象文件存储服务(OSS)主要用于存储零散的文件,和直接存储到本地文件系统中相比,有以下的几个优势: 跨服务器可用 兼容Amazon S3 API 横向扩容 高可用 支持加密 MinIO就是一个高性能的文件服务,我们使用.NET来操作一下。 部署MinIO 最简单的办法,就是在Docker上运行Mi

初步搭建一个自己的对象存储服务---Minio

MinIO 是一个高性能的对象存储解决方案,类似于 Amazon S3,但它是开源的。MinIO 可以用于存储大规模的不结构化数据,比如照片、视频、备份和日志文件等。它设计为兼容 Amazon S3 API,因此可以很容易地与现有的使用 S3 的应用程序集成。

对象业务的修改数据接口

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

对象业务的追加写接口

类似文件的追加写操作,在对象的末尾增加新的数据内容。 本文有如下假定: 对象存储服务基于文件语义实现。 使用PUT方式上传的对象,内部使用一个文件和对应的元数据来承载。 使用多段方式上传的对象,内部使用多个段文件、元数据来承载,其中每个段文件可管理独有的元数据。 下面讨论追加写操作时的方案和注意事项

Simple WPF: WPF实现一个MINIO等S3兼容对象存储上传文件的小工具

之前在阿里云ECS 99元/年的活动实例上搭建了一个测试用的MINIO服务,以前都是直接当基础设施来使用的,这次准备自己学一下S3兼容API相关的对象存储开发,因此有了这个小工具。目前仅包含上传功能,后续计划开发一个类似图床的对象存储应用。

[转帖]Ceph简单搭建

https://cloud.tencent.com/developer/article/1643322 Ceph基础介绍 ​ Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ce

【Azure 存储服务】使用 AppendBlobClient 对象实现对Blob进行追加内容操作

问题描述 在Azure Blob的官方示例中,都是对文件进行上传到Blob操作,没有实现对已创建的Blob进行追加的操作。如果想要实现对一个文件的多次追加操作,每一次写入的时候,只传入新的内容? 问题解答 Azure Storage Blob 有三种类型: Block Blob, Append Bl

[转帖]ceph学习一之基础知识

https://www.cnblogs.com/liuxingxing/p/13551406.html 一、ceph简介 Ceph是一个可靠、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备和文件系统服务。块设备存储是Ceph的强项。 Ceph的主要