CAP理论简介

源文: CAP Theorem: Revisited (Robert Greiner)

在当今的技术环境中,当需要更多的资源(计算,存储等)以在合理的时间范围内成功完成工作负载时,对系统进行横向扩展变得尤为迫切,我们正目睹这类需求不断地增长。 正是由于这种扩展策略,在系统中引入了额外的复杂性。 这正是 CAP 定理要解决的问题。

CAP 定理指出,在一个分布式系统中(共享数据的互联节点的集合),在一次读写操作中,你只能获得,一致性可用性分区容错性这三个保证中的二个,必须牺牲其中的一个。 然而,正如接下来你看到的那样,你能选择的并不像你想象的那么多。

  • 一致性(Consistency) - 对于给定的客户端,保证读取返回最新的写入。
  • 可用性(Availability) - 非故障节点能在合理的时间范围内返回合理的响应(没有错误或超时)。
  • 分区容错性(Partition Tolerance) - 当网络分区发生时,系统能继续运行。

[译者注]

分区,来自知乎的定义: 一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。 这就叫分区。当一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。 然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。 总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

在继续之前,我们需要先明确一件事。面向对象编程不等于网络编程。在构建共享内存的应用程序时,有一些我们认为理所当然的假设,一旦节点被跨空间和时间分割后,这些假设就会被打破。

网络是可靠的就是这样一个分布式计算的谬论。 网络是不可靠的! 网络和部分网络会经常意外发生故障。 网络故障在你的系统中迟早会发生,但是故障何时发生是由不得你选择的。

[译者注]

分布式8大谬论 来自维基百科

  1. 网络是可靠的 The network is reliable;
  2. 没有延迟 Latency is zero;
  3. 带宽是无限的 Bandwidth is infinite;
  4. 网络是安全的 The network is secure;
  5. 网络拓扑不会改变 Topology doesn't change;
  6. 系统只有一位管理员 There is one administrator;
  7. 信息传输成本为零 Transport cost is zero;
  8. 网络都是同质的 The network is homogeneous.

鉴于网络不是完全的可靠,在分布式系统中你必须容忍分区。幸运的是当分区分生时,你可以选择如何来做。根据CAP理论,意味着我们还有一致性可用性两项可选。

  • CP - 一致性/分区容错性 - 等待来自分区节点的响应会导致超时发生。 系统可以选择返回一个错误,这取决于你想要的场景。 当业务需求规定原子读写时,选择一致性而不是可用性。

  • AP - 可用性/分区容错性 - 返回你所拥有数据的最新版本,数据可能是过时的。该系统状态也可以接受在分区问题解决之后再处理写操作。当你的业务需求允许数据在系统同步时可以有一定的弹性时选择可用性 而不是一致性。当系统需要在外部错误发生时(购物车等)继续运行时,可用性也是一个令人信服的选择。

在一致性和可用性作出选择是一种软件平衡。在面对网络分区时你可以自己选择如何处理,控制权在你手上。不管是暂时的还是永久的网络故障,都是生活的一部分,不管你愿不愿意,它总会发生,它存在于软件之外。 构建分布式系统提供了许多优势,但是也增加了复杂性。面对网络错误时,理解可用的平衡,并作出正确的选择对你的应用成功至关重要。 如果不能从一开始就做到这一点,那么在第一次部署应用之前,你的应用程序就会失败。

(全文完)