分布式系统中几种“一致性”概念的简单解释 - pathelland


一致性一词似乎至少有三种流行用法 :

  • 数据库一致性。 这是完整交易与一些未声明的未声明规则的执行的混合。因为事务内的更新集必须由与数据库上层部分勾结的应用程序限定,所以应用程序和上层数据库可以强制执行一些事务系统不理解的规则。我认为这从交易的角度来看是完整的。
  • 复制对象的最终一致性(收敛)。 当一个对象的所有副本被合并时,它们都具有相同的值。
  • 作为线性化读/写操作的一致性。分布式系统中对每个对象的更新必须看起来好像它们发生在对象看到的单个历史记录中,并且来自客户端的调用和响应必须在每个客户端形成一个明确定义的发生前历史记录。

一致性的用法:
  • 严格的一致性。 这与 Gilbert 和 Lynch 在他们对 CAP 猜想的证明中所证明的线性化读/写操作完全相同。通常,对于可能的非融合操作(例如,读取和写入),它被解释为线性顺序。
  • 顺序一致性。 Lamport 在 How to Make a Multiprocessor Computer That Corrects Executes Multiprocess Programs  (1979) 中定义,顺序一致性弱于严格一致性。从作者的角度来看,每个客户端对变量的写入都是按顺序出现的。客户端的读取不保证对其他客户端的并发写入的可见性。我理解这个定义。

  • 因果一致性。 我最喜欢的一致性形式之一,因果一致性是顺序一致性的弱化形式。它根据操作的因果依赖性对操作进行分类。  
    假设我收到客户端 A 对对象 X 执行的操作 Y。因果一致性表示,在我收到客户端 A 执行的操作 Y 之前,我将首先接收在对象 X 上执行的所有在客户端 A 请求操作 Y 时可见的操作.  这可以通过仔细跟踪到客户端 A 的操作的交付并将这些操作作为一个包在网络周围喷射来完成,捕获客户端 A 看到的交付顺序。 当我开始接收对象 X 上的下一个操作时,管道首先将这些操作交付给我确保我看到客户端 A 在请求操作 Y 之前收到的所有操作。每个客户端看到的操作顺序显示了因果顺序。这在分布式系统中很容易实现。它在偶尔连接的系统中也非常有用。 

其他相关词语:
  • 收敛性Convergence : 是对象的属性。这意味着您有一个 合并算法 ,允许您将不同的副本粉碎在一起并获得相同的结果。
    收敛对象的合并算法必须是关联的、可交换的和幂等的。如果您以任何顺序合并任何两个副本,只要您以任何顺序在任何副本上捕获了相同的一组更改,您将获得相同的结果。这使得跨空间和时间分配工作变得容易。然后,您可以对对象进行 ACID 2.0(关联、交换、幂等和分布式)更改。
  • 最终收敛 :与普通的收敛相同,但听起来更酷,可能有助于您在酒吧结识新朋友时取得成功。
  • 融合性Confluent: 是数据流组件的一个属性。阿尔瓦罗 说:
     如果数据流组件为其输入的所有排序产生相同的输出集,我们将其称为 融合。在任何时候,融合组件的输出(以及该组件的任何冗余副本)都是唯一的“最终”输出的子集。
  • 最终的一致性: 在现在和以后都没有任何意义。然而,它确实让很多人感到困惑。   

公开问题
  • 设计人员何时应该选择以操作为中心的复制方法(例如Convergence )和以对象为中心的复制方法(例如Confluent)?
  • 因果一致性何时、何地以及如何成为任何系统设计师的惊人礼物?
  • 共识是一种机制,允许为对象达成一致的新值。这只是一个分布式写操作吗?为什么我们将共识作为书写新值的一种形式?这和强一致性一样吗?
  • 当你的约会对象谈论最终的一致性时,你应该如何应对第一次约会 ?这是比谈论政治更困难的讨论吗?
  • 是 线性化 真正在旁观者的眼睛?我们能否通过不关心被另一个系统隐藏的缺乏秩序来构建健壮的分布式系统?“不知道它是不是线性的”和“真正的线性”一样吗?