最近,S3宣布了强大的 read-after-write 一致性。我很好奇如何编程。它不违反CAP定理吗?
在我看来,最简单的方法是等待复制发生然后返回,但这会导致性能下降。
AWS 表示没有性能差异。这是如何实现的?
另一个想法是亚马逊有一个巨大的索引表,可以跟踪所有 S3 对象及其存储位置(我相信是三重复制)。它需要在每次 PUT/DELTE 时更新此索引。这在技术上可行吗?
最近,S3宣布了强大的 read-after-write 一致性。我很好奇如何编程。它不违反CAP定理吗?
在我看来,最简单的方法是等待复制发生然后返回,但这会导致性能下降。
AWS 表示没有性能差异。这是如何实现的?
另一个想法是亚马逊有一个巨大的索引表,可以跟踪所有 S3 对象及其存储位置(我相信是三重复制)。它需要在每次 PUT/DELTE 时更新此索引。这在技术上可行吗?
正如上面 Martin 所指出的,有一个指向 Reddit 的链接讨论了这个。来自 u/ryeguy 的最高回复给出了这个答案:
如果我不得不猜测,s3 在返回成功之前会同步写入存储节点集群,然后将其异步复制到其他节点,以获得更强的持久性和可用性。曾经存在从尚未收到文件更改的节点读取的风险,这可能会给您一个过时的文件。现在他们添加了逻辑,因此查找路由器知道更新传播了多远,并且可以避免将读取路由到陈旧的副本。
我只是从我的屁股中抽出所有这些,不知道 s3 是如何在幕后实际构建的,但考虑到持久性和可用性保证以及这一变化不会降低它们的事实,它一定是沿着这些思路。
欢迎更好的答案。
我们的假设不适用于云系统。风险分析过程涉及的因素很多,如可用性、一致性、容灾、备份机制、维护负担、费用等。另外,我们在设计时只参考定理。我们可以通过合并其中的多个来创建自己的。因此,我想分享 AWS 提供的链接,该链接详细说明了该过程。
https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-consistent-view.html
当您创建启用了一致视图的集群时,Amazon EMR 使用 Amazon DynamoDB 数据库来存储对象元数据并跟踪与 Amazon S3 的一致性。您必须授予 EMRFS 角色访问 DynamoDB 的权限。如果一致视图确定 Amazon S3 在文件系统操作期间不一致,它会根据您可以定义的规则重试该操作。默认情况下,DynamoDB 数据库具有 400 个读取容量和 100 个写入容量。您可以根据 EMRFS 跟踪的对象数量以及同时使用元数据的节点数量来配置读/写容量设置。您还可以配置其他数据库和操作参数。除了 Amazon EMR 的费用外,使用一致的视图还会产生 DynamoDB 费用,这些费用通常很小。