AWS S3 最终一致性和先写后读一致性
AWS S3 Eventual Consistency and read after write Consistency
帮助我更好地理解这些我无法完全掌握的概念。
关于 aws S3 一致性模型,我将尝试解释我掌握的内容。
请澄清或确认这些说法。
首先
- 谈论 "read after write" 仅与 "new writings"/创建以前不存在的对象有关。
- 谈论"eventual consistency"与"modifying existing objects"相关(更新或删除)
这些最初的概念是否正确?
那么,
最终一致性:在数据完全写入节点之前访问数据的 "client" 可以读取旧版本的对象,因为写入仍在进行中e 该对象可能尚未提交。
这是分布式系统中普遍容忍的行为,在分布式系统中,这种类型一致性优于其他选项,即在提交对象时等待某种锁被删除。
写入一致性后读取:对象立即可供客户端使用,客户端将读取对象的 "real" 版本,而不是旧版本,如果我理解的话好吧,这仅适用于新对象。
如果是这样,为什么这些复制方法如此不同?并产生这种不同的一致性?
"eventual consistency"的概念更容易理解,因为你必须考虑"latency"将数据传播到不同的节点,客户端可能会在这段时间内访问并且没有新数据还。
但为什么 "read after write" 应该是立即的?在现有数据上传播修改或创建新数据应该具有相同的延迟。我无法理解其中的区别。
能否请你告诉我我的说法是否正确,并以不同的方式解释这个概念。
talking about "read after write" is related only to "new writings"/creation of objects that didn't exist before.
是
talking about "eventual consistency" is related to "modifying existing objects" (updating or deleting)
几乎正确,但请注意一个警告。这是引自 documentation:
The caveat is that if you make a HEAD or GET request to a key name before the object is created, then create the object shortly after that, a subsequent GET might not return the object due to eventual consistency.
关于为什么他们提供不同的一致性模型,这是我的understanding/speculation。 (注意:以下内容可能是错误的,因为我从来没有为S3工作过,不知道它的实际内部实现。)
S3是一个分布式系统,所以S3很可能使用了一些内部缓存服务。想想 CDN 的工作原理,我想你可以在这里使用类似的类比。如果您 GET 一个对象,其键不在缓存中,那就是缓存未命中! S3 将获取所请求对象的最新版本,将其保存到缓存中,然后 return 返回给您。这就是先写后读模型。
另一方面,如果您更新缓存中已有的对象,那么除了将新对象复制到其他可用性区域之外,S3 还需要做更多工作来更新缓存中的现有数据。因此,传播过程可能会更长。 S3 没有让您等待请求,而是决定 return 缓存中的现有数据。此数据可能是此对象的旧版本。最终一致性就此结束。
正如 Phil Karlton 所说,计算机科学中只有两件难事:缓存失效和命名事物。 AWS 没有很好的方法来完全解决这个问题,也必须做出一些妥协。
帮助我更好地理解这些我无法完全掌握的概念。
关于 aws S3 一致性模型,我将尝试解释我掌握的内容。
请澄清或确认这些说法。
首先
- 谈论 "read after write" 仅与 "new writings"/创建以前不存在的对象有关。
- 谈论"eventual consistency"与"modifying existing objects"相关(更新或删除)
这些最初的概念是否正确? 那么,
最终一致性:在数据完全写入节点之前访问数据的 "client" 可以读取旧版本的对象,因为写入仍在进行中e 该对象可能尚未提交。 这是分布式系统中普遍容忍的行为,在分布式系统中,这种类型一致性优于其他选项,即在提交对象时等待某种锁被删除。
写入一致性后读取:对象立即可供客户端使用,客户端将读取对象的 "real" 版本,而不是旧版本,如果我理解的话好吧,这仅适用于新对象。
如果是这样,为什么这些复制方法如此不同?并产生这种不同的一致性?
"eventual consistency"的概念更容易理解,因为你必须考虑"latency"将数据传播到不同的节点,客户端可能会在这段时间内访问并且没有新数据还。
但为什么 "read after write" 应该是立即的?在现有数据上传播修改或创建新数据应该具有相同的延迟。我无法理解其中的区别。
能否请你告诉我我的说法是否正确,并以不同的方式解释这个概念。
talking about "read after write" is related only to "new writings"/creation of objects that didn't exist before.
是
talking about "eventual consistency" is related to "modifying existing objects" (updating or deleting)
几乎正确,但请注意一个警告。这是引自 documentation:
The caveat is that if you make a HEAD or GET request to a key name before the object is created, then create the object shortly after that, a subsequent GET might not return the object due to eventual consistency.
关于为什么他们提供不同的一致性模型,这是我的understanding/speculation。 (注意:以下内容可能是错误的,因为我从来没有为S3工作过,不知道它的实际内部实现。)
S3是一个分布式系统,所以S3很可能使用了一些内部缓存服务。想想 CDN 的工作原理,我想你可以在这里使用类似的类比。如果您 GET 一个对象,其键不在缓存中,那就是缓存未命中! S3 将获取所请求对象的最新版本,将其保存到缓存中,然后 return 返回给您。这就是先写后读模型。
另一方面,如果您更新缓存中已有的对象,那么除了将新对象复制到其他可用性区域之外,S3 还需要做更多工作来更新缓存中的现有数据。因此,传播过程可能会更长。 S3 没有让您等待请求,而是决定 return 缓存中的现有数据。此数据可能是此对象的旧版本。最终一致性就此结束。
正如 Phil Karlton 所说,计算机科学中只有两件难事:缓存失效和命名事物。 AWS 没有很好的方法来完全解决这个问题,也必须做出一些妥协。