S3最后修改的时间戳,用于最终一致的重写PUT

时间:2016-11-19 21:57:08

标签: amazon-web-services amazon-s3 eventual-consistency

AWS S3 docs声明:

  

Amazon S3提供了在所有地区覆盖PUTS和DELETES的最终一致性。

     

http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel

达到完全一致性的时间跨度可能会有所不同。在此期间,GET请求可能会返回上一个对象或udpated对象。

我的问题是:

最后修改时间戳何时更新?是否在覆盖PUT成功后立即更新但达到完全一致性之前更新,或者仅在达到完全一致性后才更新?

我怀疑前者,但我找不到任何明确说明这一点的文件。

2 个答案:

答案 0 :(得分:2)

Last-Modified时间戳应与成功Date请求的响应标头中返回的PUT值相匹配。

据我所知,这没有明确记录,但可以从记录的内容中得出。

当你覆盖一个对象时,它不是可能被最终一致性模型延迟的覆盖本身 - 它是给定覆盖内容的可用性 S3节点(S3被复制到S3区域内的多个节点)。

Last-Modified时间戳与其他元数据一样,是在创建对象时建立的,之后是不可变的。

事实上,它不是"修改"对象的时间,它是对象的创建时间。解释可能听起来很迂腐,但从严格意义上说它是准确的:S3对象及其元数据实际上根本无法修改,它们只能被覆盖。当你"覆盖"在S3中的一个对象,你实际在做的是创建一个新对象,重用旧对象的密钥(路径+文件名)。在给定的S3节点(复制)中,此新对象的可用性可能会被最终一致性模型延迟...而不是实际创建覆盖旧对象的新对象...因此,Last-Modified没有理由受复制延迟的影响(假设 复制延迟 - 最终的一致性有时无法与立即一致性区分开来。)

答案 1 :(得分:0)

这是S3所做的事情,绝对可怕。

基本上在Linux中,您拥有mtime,这是文件在文件系统上的最后修改时间。任何S3客户端都可以收集mtime并在S3上设置“ Last-Modified”时间,以便它可以在实际上次修改时保持时间。

相反,Amazon只是根据对象的创建来执行此操作,如果您只是想将数据用作放置它的原始应用程序之外的数据,那么这实际上是一个大问题。

因此,如果您从S3下载文件,则客户端可能会设置修改后的时间,如果该文件在创建后立即上传到s3,则至少会有接近正确的时间戳。但现实情况是,您可能会拍照,而且可能几天后仍无法从手机中通过应用程序,堆栈和S3获取照片!

这甚至都没有考虑将文件重新上传到s3。这可能会使问题更加复杂,因为您可能会在数年后重新上传它。几年后,当文件未真正被修改时,S3的行为就像Last-Modified。

它们确实需要允许您进行设置,但是它们在其他方面仍然模棱两可,而且文档过多,因此很难弄清这一点。

https://github.com/s3tools/s3cmd/issues/524