【问题标题】:Are writes to Amazon S3 atomic (all-or-nothing)?写入 Amazon S3 是原子的(全有或全无)吗?
【发布时间】:2021-08-08 05:26:28
【问题描述】:

我有大量文件正在读写到 S3。 我只是想知道我是否需要为文件“半写”的情况编写代码,例如S3 PUT / Write only "half" 工作。

或者对 S3 的写入是全有还是全无?

我知道存在读写最终一致性问题,(我认为)这在很大程度上是一个单独的问题。

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    S3 PUT documentation:

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

    【讨论】:

    • 对我来说,这就是问题的答案。
    【解决方案2】:

    对于所有地区除了美国标准(us-east-1),您将获得read-after-write-consistency。这意味着,如果您的 PUT 获得 HTTP 200 OK,您可以立即读取该对象。

    如果您的请求在中间被丢弃,您将无法获得 HTTP 200,并且您的对象根本不会被写入。

    更新:所有区域现在都支持写后读一致性(感谢@jeff-loughridge): https://aws.amazon.com/about-aws/whats-new/2015/08/amazon-s3-introduces-new-usability-enhancements/

    【讨论】:

    • aws.amazon.com/s3/faqs "Amazon S3 存储桶在美国西部(俄勒冈)、美国西部(加利福尼亚北部)、欧洲(爱尔兰)、亚太地区(新加坡)、亚太地区(东京)、亚太地区(悉尼)、南美洲(圣保罗)和 GovCloud(美国)区域为新对象的 PUTS 提供写后读一致性,为覆盖 PUTS 和 DELETES 提供最终一致性。美国标准区域中的 Amazon S3 存储桶提供最终一致性。 "
    • 所有区域现在都支持写后读一致性。请参阅 S3 常见问题解答。
    • 感谢上面的链接。在使用“如果(不是 HEAD)然后 PUT;GET”工作流程获得 0.25% 的失败率后,我找到了这张票。您上面的链接列出了以下限制:“需要注意的是,如果您在创建对象之前对键名发出 HEAD 或 GET 请求(以查找对象是否存在),Amazon S3 会为写入后读取提供最终一致性。 "所以现在我知道我的设计行不通,但至少我没有疯。
    • @RobertCalhoun 你可能想检查 Netflix s3mper 项目和 EMRFS 一致视图
    • 只要知道异常情况,在 S3 中编写可以按需要工作的东西很容易!
    【解决方案3】:

    来自docs

    对单个键的更新是原子的。例如,如果您从一个线程 PUT 到现有密钥并同时从第二个线程对同一密钥执行 GET,您将获得旧数据或新数据,但绝不会获得部分或损坏的数据。

    这个答案与现有的答案有些相似,但它强调这样一个事实,即不仅没有留下部分写入的对象的风险,而且读者将永远不会冒着看到(阅读)部分写入的对象的风险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2017-05-11
      • 2018-03-03
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多