最终的一致性在简单的英语
我经常听说关于NoSQL,数据网格等不同演讲的最终一致性。似乎最终一致性的定义在许多来源中是不同的(甚至可能取决于具体的数据存储)。
任何人都可以简单地解释一下最终一致性是什么,与任何具体的数据存储没有关系?
最终一致性:
- 我看天气报告,知道明天要下雨。
- 我告诉你明天要下雨了
- 你的邻居告诉他的妻子,明天将会是晴天。
- 你告诉你的邻居明天要下雨了。
最后,所有的服务器(你,我,你的邻居)都知道事实(即明天要下雨),但同时客户(他的妻子)也认为这将是晴天,即使她问在一个或多个服务器(你和我)有一个更新的价值。
与严格一致性/ ACID合规性相反:
- 您的银行余额是$ 50。
- 你存入$ 100。
- 从任何地方的任何一台ATM机查询您的银行存款余额为150美元。
- 你的女儿用你的提款卡取款40美元。
- 从任何地方的任何ATM机上查询的银行余额是110美元。
在任何时候,您的余额都不能反映您帐户中所有交易的实际总和。
这么多的NoSQL系统之所以有最终的一致性,是因为几乎所有的系统都是分布式的,而且在完全分布式的系统中,为了保持严格的一致性,意味着你只能在事情开始缓慢之前进行扩展而当他们这样做的时候,你需要在问题上投入更多的硬件来保持扩展)。
最终一致性:
- 您的数据被复制到多个服务器上
- 您的客户可以访问任何服务器来检索数据
- 有人将一段数据写入其中一台服务器,但尚未复制到其他服务器上
- 客户端使用数据访问服务器,并获取最新的副本
- 一个不同的客户端(甚至是同一个客户端)访问一个不同的服务器(一个还没有得到新的副本),并得到旧的副本
基本上,因为复制跨多个服务器的数据需要时间,所以读取数据的请求可能会转到具有新副本的服务器,然后转到具有旧副本的服务器。 术语“最终”意味着最终数据将被复制到所有的服务器,因此它们都将具有最新的副本。
如果您需要低延迟读取,最终的一致性是必须的,因为响应服务器必须返回自己的数据副本,并且没有时间咨询其他服务器并就数据内容达成共识。 我写了一篇博客文章更详细地解释这一点。
当应用程序对一台机器上的数据项进行更改时,必须将该更改传播到其他副本。 由于变化传播不是即时的,所以有一段时间间隔,其中一些副本将具有最近的变化,而另一些则不会。 换句话说,副本将是相互矛盾的。 然而,这种变化最终会传播到所有的副本,因此也就是“最终的一致性”。 术语最终一致性只是一个承认,在一台机器上所做的更改传播到所有其他副本是无限的延迟。 由于不需要传播,最终的一致性在集中式(单一复制)系统中是没有意义的或相关的。
来源: http : //www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf
最终的一致性更像是一个光谱。 一方面你有很强的一致性,另一方面你有最终的一致性。 之间有像快照水平,读我的写作,有限陈旧。 道格·特里在他的论文中对棒球的最终一致性有一个很好的解释。
就我而言,最终一致性基本上可以容忍随机数据,每次从数据存储区读取时都是随机的。 比这更好的是一个更强的一致性模型。 例如,快照具有陈旧的数据,但是如果再次读取则会返回相同的数据,因此是可预测的。 有时候,应用程序可以容忍在给定数量的时间内陈旧的数据,超过这个时间就会要求一致的数据。
如果你看一致性的含义,它更多地涉及一致性或缺乏偏差。 所以在非计算机系统方面,这可能意味着容忍意想不到的变化。 这可以通过ATM很好地解释。 ATM可能脱机,因此与核心系统的账户余额不同。 然而,对于一个时间窗口来说,显示出不同的平衡是可以宽容的。 一旦自动柜员机上线,它可以与核心系统同步,并反映相同的平衡。 所以ATM可以说是最终一致的。
在一个非常简单的英语句子中,我们可以说:尽pipe你的系统可能处于不一致的状态,但是每个数据的目标总是要达到一致。