Amazon S3 是否提供单调读取一致性?

Alf*_*Alf 3 amazon-s3

我们知道 Amazon S3 为大多数操作提供最终一致性,但有不同类型的最终一致性。一种特定形式是单调读取一致性,其定义为:

“如果进程看到了对象的特定值,则任何后续访问都将永远不会返回任何先前的值”

因此,如果我执行 PUT 来覆盖一个对象并在一段时间后获取新数据,我是否可以保证一旦我看到新值,后续 GET 就不会看到旧值?

Mic*_*bot 5

不能保证单调一致性。

在收到对象的最新版本后,您不太可能收到对象的旧版本,但不能保证这是不可能的。当然,随着时间的推移,收到旧版本的概率接近于 0,因为收到旧版本意味着 S3 中的故障导致索引更新无限期延迟或丢失。

“指数?”

对象覆盖不会完全覆盖对象。在版本化存储桶中,新对象被持久存储,并且存储桶索引被更新以添加对象的刚刚上传的版本并将其标记为“最新”。这就是您在未指定版本 ID 的情况下请求对象时获得的版本。索引更新的复制被认为是负责最终一致性的机制,因为索引的复制将是读取缩放的明显选择。当您请求以前从未请求过的对象时,会提供对主索引的资源更密集的强一致性读取,以确保您永远不会在新对象上获得 404。(此断言的证明在记录的警告中:当您请求一个不存在的对象时,

返回覆盖...

对单个键的更新是原子的。例如,如果您 PUT 到现有密钥,后续读取可能会返回旧数据或更新数据,但永远不会写入损坏或部分数据。

https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html

没有记录说明这仅适用于版本化存储桶。因此,假设对于未版本控制的存储桶,机制是相似的,这似乎是合理的,因为后备存储中对象的实际覆盖将使“它永远不会[读取]损坏或部分数据”的断言变得不可能。

当然,一旦您了解了版本化存储桶中对象的 version-id,您就可以重复请求该对象的特定版本,并且始终会收到相同的对象,因为新版本的对象始终具有不同的 version-id。