最终一致

γ γ 意见(

我于2007年12月在一致性模型上写了这篇文章的第一个版本,但是我从来没有对它感到满意,因为它是匆忙写成的,并且这个主题很重要,可以接受更彻底的治疗。ACM排队要求我修改它在杂志上的使用,我借此机会改进了这篇文章。.

我在2008年12月贴出了这篇文章的更新。最终始终如一的复活.请阅读这篇文章而不是这篇文章。我离开这里是为了透明度/历史原因,因为这些评论帮助我改进了这篇文章。对此我感激不尽


最近有很多关于这个概念的讨论。最终一致性在数据复制的上下文中。在这个位置中,我想收集一些与大规模数据复制相关的原则和抽象,以及高可用性和数据一致性之间的权衡。我认为这项工作正在进行中,因为我不希望第一次得到每一个定义清晰。.

有两种看待一致性的方法。一个是从Twitter上的Eclipse应用程序/客户端的观点;他们如何观察数据更新。第二种方式是从服务器端;更新如何流过系统,以及什么保证系统可以提供更新。.

历史的

在理想世界中,只有一个一致性模型;当进行更新时,所有观察者都会看到该更新。这是第一次难以实现的是在70年代末期的BayWal88系统。最好的“期片关于这个话题是布鲁斯·林赛等,“关于分布式BETWAY 88标准的注记,研究报告RJ2561(33471),IBM研究,1979年7月。在这些注释中列出了betway88体育场复制的基本原理,并讨论了实现一致性的若干技术。这些技术中的许多试图达到分布透明度;对于系统的用户来说,它看起来好像只有一个系统而不是多个协作系统。许多这样的系统采取的方法是破坏系统的透明性,而不是破坏这种透明性。.

90年代中期,随着互联网系统的兴起,这些实践被重新审视。在那个时候,人们开始考虑这样的想法:也许可用性是这些系统的更重要的属性。结果,人们正在挣扎着什么应该被抵消。.埃里克·布鲁尔伯克利系统教授和当时的英克托米负责人在一起带来了不同的权衡。PODC会议主题2000。埃里克介绍了盖帽定理,它表示共享数据系统的三个属性;数据一致性、系统可用性和对网络划分的容忍度只能在任意给定时间达到两个。一个更正式的确认可以在一篇论文中找到。吉尔伯特和Lynch..

不允许网络分区的系统可以实现数据一致性和可用性,并且通常通过使用事务协议来实现这一点。为了实现这一功能,客户机和存储系统是同一环境的一部分,它们在某些情况下作为一个整体失败,因此客户机不能观察分区。一个重要的观点是,在较大的分布式系统中,网络分区是给定的,因此不能同时实现这种一致性和可用性。这意味着一个人有两种选择:放弃什么;放松一致性将允许系统在可分区条件下保持高可用性,并且优先一致性意味着在某些条件下系统将不可用。.

这两个都需要客户端SlieStAdStEndoStIsApple app Apple Enter ER知道系统所提供的内容。如果系统强调一致性,则应用程序必须处理系统可能不能用于例如写操作的事实。如果由于系统不可用而导致此写入失败,则应用程序必须处理要写入的数据如何处理。如果系统强调可用性,它可能总是接受写操作,但是在某些条件下,读操作不会反映最近完成的写操作的结果。然后,应用程序开发者必须决定客户端是否一直需要访问绝对最新的更新。有一系列应用程序可以处理稍微陈旧的数据,并且在这种模型下服务得很好。.

原则上定义了事务系统的一致性属性。酸性质是一种不同的一致性保证。在ACID中,一致性涉及当事务完成时,betway88体育场处于一致状态的保证;例如,在把钱从一个账户转移到另一个账户时,两个账户中所持有的总额不应该改变。在基于ACID的系统中,这种一致性通常由编写事务的应用程序负责,但是可以通过管理完整性约束的betway88体育网站来辅助。.

客户端一致性

在客户端有四个组成部分:

  • 存储系统.目前我们将把它当作一个黑匣子,但如果您希望的话,您应该假定在封面下面,它是一个大型的、分布式的、为保证持久性和可用性而构建的东西。.
  • 过程A.从存储系统写入和读取的过程。.
  • 工艺流程与工艺.独立于进程A的两个进程,该进程还写入和读取存储系统。不管这些是真正的进程还是同一进程中的线程,都不相关,重要的是它们是独立的,并且需要通信共享信息。.

在客户端,一致性与观察者(在本例中为进程A、B或C)如何以及何时看到对存储系统中的数据对象进行更新有关。在下面的示例中,进程A已经对数据对象进行了更新。.

  • 强一致性.更新完成后,任何后续访问(由A、B或C)将返回更新的值。.
  • 弱一致性.系统不保证后续的访问将返回更新的值。在返回值之前需要满足许多条件。这种情况往往是时间的流逝。从更新到保证任何观察者将始终看到更新值之间的时间段称为不一致性时间窗口..
  • 最终一致性.存储系统保证如果最终(在不一致性窗口关闭之后)没有对对象进行新的更新,则所有访问都将返回最后更新的值。实现最终一致性的最流行的系统是DNS,即域名系统。对名称的更新是根据配置的模式分发的,并且结合时间控制的缓存,最终客户端将看到更新。.

在最终一致性模型中有许多变化是很重要的:

  • 因果一致性.如果进程A已通知进程B它已更新了数据项,则进程B的后续访问将返回更新后的值,并且保证写入取代先前的写入。过程C对过程A没有因果关系的访问服从正常的最终一致性规则。.
  • 读写一致性.这是一个重要的模型,其中进程A在更新数据项之后总是访问更新的值,并且永远不会看到旧的值。这是因果一致性模型的特例。.
  • 会话一致性.这是前一个模型的实际版本,其中进程在会话上下文中访问存储系统。只要会话存在,系统保证读取您的写入一致性。如果会话由于某些失败场景而终止,则需要创建新的会话,并且保证不会与会话重叠。.
  • 单调读一致性.如果进程已经看到对象的特定值,那么任何后续访问将永远不会返回任何先前的值。.
  • 单调写一致性.在这种情况下,系统保证通过相同的进程序列化写入。众所周知,不保证这种一致性的系统很难编程。.

这些属性可以组合在一起。例如,可以获得与会话级一致性相结合的单调读数。从实用的角度来看,这两个属性(单调读取和读写操作)在最终一致的系统中是最理想的,但并非总是必需的。.

正如你可以从不同的变化中看到的,有很多不同的场景是可能的。它取决于特定的应用程序,不管它能否处理它的后果。.

最后,一致性不是极端分布式系统的一些神秘属性。许多提供主备份可靠性的现代RDBMS系统在同步和异步模式下实现它们的复制技术。在同步模式下,副本更新是事务的一部分,在异步模式下,更新以延迟的方式到达备份,通常通过日志传送。在最后一种模式下,如果在日志发送之前主服务器出现故障,则从提升备份读取将产生旧的、不一致的值。为了支持更好的可伸缩读取性能,RDBMS系统已经开始从备份中提供读取,这是提供最终一致性保证的经典情况,其中不一致窗口取决于日志传送的周期性。.

服务器端一致性。.

在开始之前,我们需要建立一些定义:

  • n-存储数据副本的节点数量。
  • W-在更新完成之前需要确认更新收到的副本的数量。
  • R-通过读取操作访问数据对象时所接触的副本的数量。

如果W+R> n大于写集,且读集总是重叠,则可以保证强一致性。在实现同步复制的主备份RDBMS场景中,n=2,w=2,r=1。无论客户端读取哪个副本,它总是会得到一致的答案。在从备份中读取的异步复制情况下启用n=2,w=1,r=1。在这种情况下,R+W=N和一致性不能得到保证。.

作为基本仲裁协议的这些配置的问题在于,当系统由于故障而不能写入W节点时,写入操作必须失败,这标志着系统的不可用性。n=3,w=3,只有2个节点可用,系统将不得不写入失败。.

在需要解决高性能和高可用性的分布式存储系统中,副本的数量通常高于2。仅关注容错的系统通常使用n=3(W=2和R=2配置)。需要提供非常高的读取负载的系统常常复制其数据超出容错所需的范围,其中N可以是几十个甚至数百个节点,并且R配置为1,使得单个读取将返回结果。对于关注一致性的系统,它们为更新设置W=N,但是这可能降低写入成功的概率。这种配置中涉及容错但不一致的系统的常见配置是使用W=3运行以获得更新的基本持久性,然后依靠懒惰(流行)技术来更新其他副本。.

如何配置N、W和R取决于通常的情况和需要优化哪些性能路径。在R=1和n=W时,我们对读取情况进行优化,在W=1和r=n时,我们将对非常快的写入进行优化。当然,在后一种情况下,在存在故障时不能保证耐久性,并且如果W<(N+1)/2,则存在写入冲突的可能性,因为写入集不重叠。.

当W+R <n时,出现弱/最终一致性,这意味着在读写集合中没有重叠。如果这种配置是故意的,而不是基于失败的情况,那么将R设置为其他任何东西都是没有意义的,但是1。出现这种情况有两种非常常见的情况:第一种情况是前面提到的用于读取伸缩的大规模复制,第二种情况是数据访问更加复杂。在简单的键值模型中,比较版本很容易确定哪个是最新的值,但是在返回对象集的系统中,更难确定正确的最新集应该是什么。在写集小于副本集的这些系统中,存在一种机制,该机制以惰性的方式将更新应用于副本集中的其余节点。直到所有复制品被更新的时间段都是以前讨论过的不一致窗口。如果W+R<=N,则系统容易受到尚未收到更新的节点的读取。.

是否可以读取你的写、会话和单调一致性可以实现一般取决于“粘性客户端到执行它们的分布式协议的服务器。如果这是同一个服务器,比它相对容易保证阅读你的写作和单调阅读。这使得管理负载平衡和容错稍微困难一些,但这是一个简单的解决方案。使用具有粘性的会话使其显式,并提供客户端可以推理的曝光级别。.

有时读写和单读是由客户端实现的。通过在写上添加版本,客户机放弃读取最后一次看到的版本之前的值。.

当系统中的某些节点不能到达其他节点时,分区会发生,但是所有的节点都可以由客户端来实现。如果使用传统的多数仲裁方法,则具有副本集的W节点的分区可以在其他分区变得不可用时继续进行更新。对于读集也是一样的。由于这两个集合重叠,根据定义,少数集变得不可用。分区不会频繁发生,但它们确实发生在数据中心和数据中心之间。.

总结

不一致性可以容忍有两个原因:用于在高度并发条件下提高读写性能,以及用于处理分区情况,其中大多数模型将导致系统的一部分不可用,即使节点已启动并正在运行。.

不一致性是否可接受取决于客户端应用程序。一个特定的流行案例是一个网站场景中,我们可以有用户感知一致性的概念;不一致窗口需要小于客户返回下一页加载所需的时间。这允许在预期下一次读取之前通过系统传播更新。.

在这篇文章中,我试图收集一些关于一致性和可用性模型的定义和原则。我期待这份名单是不完整的,甚至可能是错误的或缺乏微妙之处。我将继续更新,直到它更有用和完整。.

评论

博客评论迪斯科