最终的英语一致性


130

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

任何人都可以简单地解释一下什么是“最终一致性”,它与任何具体的数据存储都没有关系?



21
@OliCharlesworth:不。也许只是我一个人,但即使阅读了两次也绝对不清楚。
罗马

Answers:


228

最终一致性:

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

最终,所有服务器(您,我,您的邻居)都知道真相(明天将要下雨),但是与此同时,客户(他的妻子)走了,认为这将是晴天,即使她询问一台或多台服务器(您和我)的价格更新之后。

与严格一致性/ ACID合规性相反:

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

您的余额在任何时候都无法反映出您在该确切时刻进行的所有交易的实际总和。

原因,为什么如此多的NoSQL系统具有最终一致性是,几乎所有的人都被设计成分布,并与全分布式系统有超线性开销来保持严格一致(这意味着你只能这么远以前的事情开始放缓规模下降,并且当它们出现时,您需要成倍地增加硬件来解决问题,以保持扩展性。


我不明白。增长是线性的还是指数的?
Maciek Kreft

4
由N个严格一致的节点组成的系统的通信开销的增长通常被认为是超线性的(也就是说,不仅仅是线性的)。可能是指数,可能是立方...依赖于通信协议等
克里斯·沙恩

2
好答案。一些后续问题:对服务器的请求会为您提供错误的/过时的信息,这不是“不好的”做法吗?人们只是对此表示满意,还是有解决方案?此外,最终如何在不同服务器之间复制数据?如果其中一台服务器出现故障,并且正在跨服务器复制数据,如果该服务器又恢复了,那么如何使它的数据保持最新状态?
noblerare

5
@noblerare对于不同程度的不良情况是“不好的”。如果我的ATM余额过期,那将是非常糟糕的。如果我的日志记录数据库还没有完全赶上,或者我的Facebook提要落后了几秒钟,情况也就不那么糟糕了。数据复制和持久性机制千差万别,并且取决于特定的平台。对于Cassandra(作为示例),编写者可以决定某个特定写入是否成功,是否需要在一个,所有或仲裁(多数)节点上进行提交。HBase采用不同的方法,其中特定节点是每一行数据的“主”。
克里斯·沙恩

实际上,大多数银行系统最终都是一致的。
混沌”

106

最终一致性:

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

基本上,由于需要花费时间在多个服务器之间复制数据,因此读取数据的请求可能会转到带有新副本的服务器,然后再转到带有旧副本的服务器。术语“最终”表示最终将数据复制到所有服务器,因此它们都将具有最新副本。

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


2
不错的博客文章。值得一读的人对最终一致性的新概念值得一读。如果将其重写以解释博客文章中的更多内容,则此答案会更好。
axiopisty 2015年

1
好在您的博客中解释。感谢分享。
Ataur Ra​​hman Munna

12

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

在此处输入图片说明

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

在此处输入图片说明

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

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

为此,我们使用调解器应用程序来更新/创建/删除数据,并使用直接查询来读取数据。帮助最终实现一致性

在此处输入图片说明 在此处输入图片说明


3

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

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


1

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


1

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

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

并非所有文档存储均创建为相等。这些天(MongoDB)确实支持某种事务,但是迁移数据存储很可能与重新实现的开销相当。

警告:不了解或不了解文档数据存储技术的开发人员,甚至是架构师,也害怕承认这一点,因为担心失去工作,但是经过RDBMS的经典培训并且只知道ACID系统(这有何不同) ?)谁不了解该技术或花时间学习它,就会错过设计文档数据存储的机会。他们还可以尝试将其用作RDBMS或用于诸如缓存之类的事情。他们将应该在整个文档上进行操作的原子事务分解为“关系”部分,而忘记了复制和等待时间就是问题,或者更糟的是,将第三方系统拖到了“事务”中。他们将这样做,以便他们的RDBMS可以镜像其数据湖,而无需考虑其是否工作,并且无需测试,因为他们知道自己在做什么。然后,当存储在单独的文档(如“订单”)中的复杂对象的“订单项”比预期的少,或者根本没有时,他们将感到惊讶。但这不会经常发生,也不会经常发生,因此他们只会前进。他们甚至可能没有解决开发中的问题。然后,与其重新设计事物,不如将它们放入“延迟”,“重试”和“检查”以伪造一个关系数据模型,该模型虽然行不通,但会增加额外的复杂性而无济于事。但是现在为时已晚-事情已经部署完毕,现在业务可以在上面运行了。最终,整个系统将被淘汰,部门将被外包,其他人将对其进行维护。它仍然无法正常工作,但是与当前的故障相比,它们的故障损失更低。


0

最终的一致性更像一个频谱。一方面,您具有很强的一致性,而另一方面,您最终具有一致性。在这两者之间有一些级别,例如快照,阅读我的文章,有限的陈旧性。道格•特里(Doug Terry)在论文中对棒球的最终一致性做出了美丽的解释 。

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

如果您查看一致性的含义,则它更多地与一致性或没有偏差有关。因此,以非计算机系统的术语来说,这可能意味着可以承受意外的变化。通过ATM可以很好地解释它。ATM可能处于离线状态,因此与核心系统的帐户余额有所不同。但是,可以容忍在一段时间内显示不同的余额。ATM联机后,便可以与核心系统同步并反映出相同的平衡。因此,可以说ATM最终是一致的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.