166

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

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

4

7 回答 7

270

最终一致性:

  1. 我看了天气预报,得知明天要下雨。
  2. 我告诉你明天会下雨。
  3. 你的邻居告诉他的妻子明天会是晴天。
  4. 你告诉邻居明天要下雨。

最终,所有的服务员(你、我​​、你的邻居)都知道了真相(明天会下雨),但与此同时,客户(他的妻子)却以为天气会晴朗,尽管她问了在一台或多台服务器(您和我)具有更新的值之后。

与 Strict Consistency / ACID 合规性相反:

  1. 您的银行存款余额为 50 美元。
  2. 你存入 100 美元。
  3. 从任何地方的任何 ATM 查询您的银行余额为 150 美元。
  4. 您的女儿用您的 ATM 卡取款 40 美元。
  5. 从任何地方的任何 ATM 查询您的银行余额为 110 美元。

您的余额在任何时候都不能反映除您账户上所有交易的实际总和之外的任何内容。

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

于 2012-04-09T19:25:06.857 回答
126

最终一致性:

  1. 您的数据被复制到多台服务器上
  2. 您的客户端可以访问任何服务器以检索数据
  3. 有人将一段数据写入其中一台服务器,但尚未复制到其余服务器
  4. 客户端使用数据访问服务器,并获取最新的副本
  5. 不同的客户端(甚至是同一个客户端)访问不同的服务器(尚未获得新副本的服务器),并获取旧副本

基本上,因为跨多个服务器复制数据需要时间,读取数据的请求可能会发送到带有新副本的服务器,然后再发送到带有旧副本的服务器。术语“最终”意味着最终数据将被复制到所有服务器,因此它们都将拥有最新的副本。

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

于 2013-09-29T16:01:00.463 回答
18

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

在此处输入图像描述

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

在此处输入图像描述

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

问题是我们如何才能最终保持一致性

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

在此处输入图像描述 在此处输入图像描述

于 2017-12-10T14:40:28.863 回答
3

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

来源:http ://www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf

于 2016-11-11T07:12:30.857 回答
2

最终一致性意味着更改需要时间来传播,并且在每次操作之后数据可能不会处于相同的状态,即使对于相同的操作或数据转换也是如此。当人们在与这样的系统交互时不知道自己在做什么时,这可能会导致非常糟糕的事情发生。

在您充分理解此概念之前,请不要实施关键业务文档数据存储。搞砸文档数据存储实现比关系模型更难修复,因为将要搞砸的基本事物根本无法修复,因为修复它所需的事物只是不存在于生态系统中。重构飞行存储的数据也比 RDBMS 的简单 ETL 转换困难得多。

并非所有文档存储都是一样的。现在有些(MongoDB)确实支持某种事务,但迁移数据存储可能与重新实现的费用相当。

警告:开发人员甚至架构师不了解或不了解文档数据存储技术,并且因为害怕失去工作而不敢承认这一点,但他们接受过 RDBMS 的经典培训,并且只知道 ACID 系统(这有多大的不同呢? ?) 不了解该技术或不花时间学习它的人会错过设计文档数据存储的机会。他们也可能会尝试将其用作 RDBMS 或用于缓存等用途。他们会将应该对整个文档进行操作的原子事务分解为“关系”片段,忘记复制和延迟是事情,或者更糟糕的是,将第三方系统拖入“事务”。他们这样做是为了让他们的 RDBMS 可以镜像他们的数据湖,不管它是否会工作,也不需要测试,因为他们知道自己在做什么。然后,当存储在像“订单”这样的单独文档中的复杂对象的“订单项目”比预期的要少,或者根本没有时,他们会感到惊讶。但这不会经常发生,也不会经常发生,所以他们只会向前迈进。他们甚至可能无法解决开发中的问题。然后,他们不会重新设计事物,而是会抛出“延迟”、“重试”和“检查”来伪造一个关系数据模型,这不起作用,但会增加额外的复杂性而没有任何好处。但现在为时已晚 - 事情已经部署,现在业务正在运行。最终,整个系统将被淘汰,部门将外包,由其他人维护。它仍然无法正常工作,但它们的失败可能比当前的失败更便宜。

于 2018-10-18T11:02:39.857 回答
1

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

于 2017-10-31T07:58:56.343 回答
0

最终一致性更像是一个频谱。一方面你有很强的一致性,另一方面你有最终的一致性。在这之间有一些级别,例如快照、阅读我的写入、有限的陈旧性。道格·特里在他关于棒球最终一致性的论文中有一个很好的解释 。

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

如果您查看一致性的含义,它更多地与一致性或缺乏偏差有关。因此,在非计算机系统术语中,它可能意味着对意外变化的容忍度。通过ATM可以很好地解释。ATM 可能离线,因此与核心系统的账户余额不同。但是,可以容忍在一段时间内显示不同的余额。一旦 AT​​M 上线,它就可以与核心系统同步并反映相同的余额。因此,可以说 ATM 是最终一致的。

于 2015-10-31T12:02:41.070 回答