分布式系统中可用性、分区容忍、一致性在不同环境下的妥协

300 阅读6分钟

在可用性上妥协

在极端的情况下,当节点失败时,系统可能会变得完全不可用,直到它被重启并且系统恢复到一致的状态。

尽管可用性似乎对业务连续性非常不利,但有时这是唯一的选择。

您需要在拥有一致的数据状态,或者事务失败中做出抉择。

这是典型的金钱和时间敏感的交易,在失败的情况下补偿交易是完全不可接受的或承担非常高的成本。两个帐户之间的资金转移的典型例子经常被引用作为这种用例的例子。然而,在现实生活中,银行有时也会对这种极端情况采取宽松的替代方案

在许多情况下,系统(包括基于 RDBMS 的系统)提供备份和快速复制以及故障恢复。这意味着系统不可用的时间可能非常短。在大多数情况下,轻微的不可用性并不是灾难性的,而是一个可行的选择。

分区容忍的妥协

在某些情况下,最好不要选择分区容忍。

在水平扩展系统中,节点失效是一个给定的,随着节点数量的增加,失效的机会也增加。那么,分区不容忍怎么可能是一种选择呢?

许多人混淆了分区容忍和错误容忍,但是这两者并不是一回事。

如果系统不为与网络隔离的分区提供服务,但是允许通过几乎瞬间重新配置其他节点进行恢复,那么该系统是容错的,但是不能容忍分区。

Google 的 Bigtable 是数据存储的一个很好的例子,这种数据存储高度可用,提供了强大的一致性,但是在分区容忍方面有所妥协。该系统具有容错性,容易发生节点故障,但不具有分区容错性。

更恰当的做法是,在故障情况下,它标识分区的主要和次要部分,并尝试通过建立仲裁来解决问题。

Bigtable 及其克隆使用 master-worker 模式,其中列族数据一起存储在区域服务器中。区域服务器由主服务器动态配置和管理。在 Google 的 Bigtable 中,数据被保存到底层的 Google FileSystem (GFS)中,整个基础设施由 Chubby 协调,它使用像 Paxos 这样的仲裁算法来确保一致性。对于 HBase,Hadoop 分布式文件系统(HDFS)执行与 GFS 相同的功能,ZooKeeper 取代了 Chubby。ZooKeeper 使用仲裁算法从失败的节点恢复。

失败时,ZooKeeper 确定哪个是主分区,哪个是辅助分区。基于这些推断,ZooKeeper 将所有读写操作指向主分区,并使辅助分区成为只读分区,直到这个问题得到解决。

此外,Bigtable 和 hBase (以及它的底层文件系统分别是 gFS 和 HDFS)存储每个数据集的三个副本。这保证了当三个副本中有一个失败或不同步时,协商一致的一致性。少于三份并不能保证达成一致意见。

在一致性上妥协

在某些情况下,可用性不会受到影响,而且系统是如此分布以至于需要分区容忍。在这种情况下,可能会损害强一致性。

强一致性的对应物是弱一致性,因此所有这种一致性受到损害的情况都可以在这个包中进行处理。弱一致性是一个范围,所以这可能包括没有一致性和最终一致性的情况。对于任何允许任何形式的数据更新的严肃系统来说,不一致的数据可能不是一种选择,但最终一致性可能是一种选择。

“最终一致性”也不是一个定义明确的术语,但它暗示了这样一个事实: 在更新之后,集群中的所有节点最终都会看到相同的状态。如果可能性可以在一定范围内定义,那么最终一致性模型就可以工作。

例如,购物车可以允许订单,即使它不能与库存系统确认可用性。在可能的限量情况下,订购的产品可能缺货。在这种情况下,订单可以作为一个延期订单,并填写时,库存重新进货。在另一个例子中,银行可以允许客户在无法确认可用余额的情况下提取最多一笔透支金额,这样,在最糟糕的情况下,如果资金不足,交易仍然有效,透支便利可以使用。

为了理解最终一致性,我们可以尝试用以下三个标准来说明情况:

  • R-从中读取的节点数。

  • W-写入的节点数。

  • N-群集中的节点总数。

这三个参数的不同组合对总体一致性有不同的影响。保持 R < N 和 W < N 允许更高的可用性。以下是一些常见情况:

  • 在这种情况下,可以很容易地建立一致的状态,因为某些读和写节点之间存在重叠。在 R = N 和 W = N (即 R + W = 2N)的极端情况下,系统是绝对一致的,可以提供 ACID 保证。

  • R = 1,W = N 当系统的读比写多时,将读负载平衡到集群的所有节点是有意义的。当 R = 1时,就读操作而言,每个节点独立于任何其他节点。W = N 写配置意味着为更新而写入所有节点。在出现节点故障的情况下,整个系统将不能进行写操作。

  • R = N,W = 1-当写入一个节点就足够时,数据不一致的可能性非常高。但是,在 R = N 场景中,只有当集群中的所有节点都可用时,才可能进行读操作。

  • R = W = 上限((N + 1)/2)-这种情况提供了一个有效的数量来提供最终一致性。

埃里克 · 布鲁尔和他的追随者创造了“BASE”这个词来表示最终一致性。

BASE,代表基本可用的软状态最终一致,显然是人为的,并被创造出来对抗ACID。然而,ACID和BASE并不是对立的

最终一致性可以多种形式表现出来,并可以多种不同的方式实现。一个可能的策略可能涉及面向消息的系统,另一个可能涉及基于法定人数的共识。在面向消息的系统中,您可以使用消息队列传播更新。在最简单的情况下,可以使用唯一的顺序 id 对更新进行排序。


本文正在参加「金石计划 . 瓜分6万现金大奖」