【问题标题】:s3 concurrent writess3 并发写入
【发布时间】:2013-01-13 17:35:20
【问题描述】:

我认为并发 s3 写入有问题。两个(或更多)进程同时将几乎相同的内容写入同一个 s3 位置。我想确定控制这种情况如何发展的并发规则。

根据设计,在写入 s3 时,除一个之外的所有进程都会被杀死。 (我说过他们正在写“几乎”相同的内容,因为除了一个进程之外的所有进程都被杀死了。如果允许所有进程存活,他们最终会写出完全相同的内容。)

我的理论是,被杀死的进程在 s3 上留下了一个不完整的文件,而另一个文件(大概是完整编写的)没有被选为在 s3 上存在的文件。我想证明或反驳这个理论。 (我试图找出问题是否是由写入 s3 期间的并发问题或其他时间引起的)。

来自http://aws.amazon.com/s3/faqs/ 的常见问题解答:

问:Amazon S3 采用什么数据一致性模型?

美国西部(俄勒冈)、美国西部(北部)的 Amazon S3 存储桶 加利福尼亚)、欧盟(爱尔兰)、亚太地区(新加坡)、亚太地区 (东京)、亚太地区(悉尼)和南美(圣保罗)地区 为新对象的 PUTS 提供写后读一致性和 覆盖 PUTS 和 DELETES 的最终一致性。 Amazon S3 存储桶 在美国标准区域提供最终一致性。

我使用的是美国标准区域。

  • 这个答案对并发写入有什么看法?我想我理解“写后读一致性”与“最终一致性”之间的区别,但仅限于在写完成后读取对象时看到的内容。
  • 被杀死的进程是否有可能“获胜”并因此在 s3 上得到一个不完整的文件?或者 s3 是否以某种方式确保文件仅在整个 PUT 操作完成时才会放在 s3 上?
  • s3 如何决定哪个文件“获胜”?这是真正的问题。

【问题讨论】:

  • 您是说其中一个 PUTS 成功,但在 S3 中没有创建文件?
  • 我不记得了。这是很久以前的事了。 :)
  • 不是AWS,但是如果你使用谷歌云,可以通过使用“前置条件”来避免。基本上,当您写入一个新对象时,您指定前提条件“doesNotExist”,只有一个写入器会成功,其他写入器会收到异常。如果您写入现有对象,则前提条件是该现有对象的“generationIdMatch”。 AWS 似乎没有强一致性来使其成为可能。

标签: concurrency amazon-s3 cloud


【解决方案1】:

我不认为那个常见问题条目中的一致性声明说明了在并发写入同一键期间会发生什么。

但是,S3 中不可能有不完整的文件:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html

Amazon S3 从不添加部分对象;如果您收到成功响应,Amazon S3 会将整个对象添加到存储桶中。

这意味着只有完全上传的文件才会存在于指定的键中,但我想这种并发写入可能会引起一些错误情况,导致没有文件被成功上传。我会做一些测试来确定;您可能还希望在使用对象版本控制时尝试使用它,看看它的行为是否有所不同。

【讨论】:

  • 这可以解释我们看到的奇怪问题。谢谢。我的理论是,在同时将两个文件上传到同一个 s3 密钥时,亚马逊选择一个来“获胜”。有时,它选择“不正确”,这意味着它选择了最终被杀死的那个(不完整的文件),这导致 S3 密钥保持为空(没有文件最终被保存)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2014-10-05
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多