Nosql 通俗英语中的最终一致性

Nosql 通俗英语中的最终一致性,nosql,computer-science,data-storage,eventual-consistency,Nosql,Computer Science,Data Storage,Eventual Consistency,我经常在关于NoSQL、数据网格等的不同演讲中听到最终的一致性。 似乎最终一致性的定义在许多源中都有所不同(甚至可能取决于具体的数据存储) 有谁能简单地解释一下什么是一般意义上的最终一致性,与任何具体的数据存储无关?最终一致性: 我看了天气预报,得知明天要下雨 我告诉你明天要下雨 你的邻居告诉他的妻子明天将是晴天 你告诉邻居明天要下雨 最终,所有服务器(你、我、你的邻居)都知道真相(明天会下雨),但与此同时,客户(他的妻子)离开时认为天气会转晴,尽管她询问了一个或多个服务器(你和我)的最新值 与

我经常在关于NoSQL、数据网格等的不同演讲中听到最终的一致性。 似乎最终一致性的定义在许多源中都有所不同(甚至可能取决于具体的数据存储)

有谁能简单地解释一下什么是一般意义上的最终一致性,与任何具体的数据存储无关?

最终一致性:

  • 我看了天气预报,得知明天要下雨
  • 我告诉你明天要下雨
  • 你的邻居告诉他的妻子明天将是晴天
  • 你告诉邻居明天要下雨
  • 最终,所有服务器(你、我、你的邻居)都知道真相(明天会下雨),但与此同时,客户(他的妻子)离开时认为天气会转晴,尽管她询问了一个或多个服务器(你和我)的最新值

    与严格的稠度/酸合规性相反:

  • 你的银行存款余额是50美元
  • 你可以存100美元
  • 你的银行余额是150美元,可以在任何ATM机上查询
  • 你女儿用你的ATM卡取款40美元
  • 你的银行余额是110美元,可以在任何ATM机上查询
  • 在任何时候,您的余额都不能反映您账户上所有交易的实际金额

    如此多的NoSQL系统具有最终一致性的原因是,几乎所有的NoSQL系统都是为分布式设计的,而对于完全分布式的系统,要保持严格的一致性,存在着超线性开销(这意味着您只能在事情开始放缓之前扩展到目前为止,而当事情开始放缓时,您需要在问题上投入成倍增加的硬件以保持扩展)。

    最终一致性:

  • 您的数据被复制到多个服务器上
  • 您的客户端可以访问任何服务器来检索数据
  • 有人将一段数据写入其中一台服务器,但尚未将其复制到其余服务器
  • 客户端使用数据访问服务器,并获取最新的副本
  • 不同的客户端(甚至同一个客户端)访问不同的服务器(尚未获取新副本的服务器),并获取旧副本
  • 基本上,由于跨多个服务器复制数据需要时间,因此读取数据的请求可能会先发送到具有新副本的服务器,然后发送到具有旧副本的服务器。“最终”一词意味着最终将数据复制到所有服务器,因此它们都将具有最新副本


    如果您想要低延迟读取,则最终一致性是必须的,因为响应服务器必须返回其自己的数据副本,并且没有时间咨询其他服务器并就数据内容达成一致。我写了一篇文章对此进行了更详细的解释。

    最终一致性更像是一个光谱。在一端,您有很强的一致性,而另一方面,你最终会有一致性。在这两者之间有一些级别,比如快照、读我的文章、有界的陈旧性。道格·特里(Doug Terry)在这方面有一个很好的解释

    据我所知,最终一致性基本上是指每次从数据存储中读取数据时,都能以随机顺序容忍随机数据。比这更好的是一个更强的一致性模型。例如,快照有陈旧数据,但如果再次读取,将返回相同的数据,因此它是可预测的。有时应用程序可以容忍一段时间内陈旧的数据给定的时间量,超过该时间,它需要一致的数据


    如果你看一致性的含义,它更多地与一致性或无偏差有关。因此,在非计算机系统术语中,它可能意味着对意外变化的容忍。这可以通过ATM得到很好的解释。ATM可能脱机,因此与核心系统的账户余额不同。但是,对于显示不同的t在一段时间内保持平衡。一旦ATM联机,它就可以与核心系统同步并反映相同的平衡。因此,可以说ATM最终是一致的。

    当应用程序对一台机器上的数据项进行更改时,该更改必须传播到其他副本。由于更改传播不是即时的,有一段时间间隔,在这段时间内,一些副本将有最新的更改,但其他副本不会。换句话说,副本将相互不一致。但是,更改最终将传播到所有副本,因此术语“最终一致性”。术语“最终一致性”只是确认将一台计算机上所做的更改传播到所有其他副本时存在无限制的延迟。最终一致性在集中式(单副本)系统中没有意义或相关性,因为不需要传播


    来源:

    用简单的英语,我们可以说:虽然您的系统可能处于不一致的状态,但目标始终是在某个点上为每个数据段达到一致性。

    认为您有一个应用程序及其副本。然后您必须向应用程序添加新的数据项

    然后应用程序将数据同步到下面显示的其他副本

    同时,新客户端将从一个尚未更新的复制副本中获取数据。在这种情况下,他无法获取正确的最新数据。因为同步需要一些时间。在这种情况下,它最终没有一致性

    问题是我们怎样才能最终保持一致性

    为此,我们使用中介应用程序来更新/创建/删除数据,并使用直接查询来读取数据。这有助于实现一致性


    最终一致性意味着更改需要时间来传播,并且每次操作后数据可能不处于相同的状态,即使是相同的操作或数据转换。这可能会导致