本文共 1690 字,大约阅读时间需要 5 分钟。
我们想要拥有一切,但不幸的是我们做不到。
当使用微服务架构构建的分布式系统()时,一 个数学证明甚至就能证明我们做不到。
在分布式系统中有三方面需要彼 此权衡:一致性(consistency)、可用性(availability)和分区容忍性(partition tolerance)。具体地说,这个定理告诉我们最多只能保证三个中的两个。
首先解释下这三个的意思:
一致性(consistency)
一致性是当访问多个节点时能得到同样的值可用性(availability)
可用性意味着每个请求都能获得响应分区容忍性(partition tolerance)
分区容忍性是指集群中的某些节点在无法联系后,集群整体还能继续进行服务的能力假设我们的库存服务部署在两个独立的数据中心。我们 在每个数据中心的服务实例都有一个数据库支持,并且这两个数据库通过彼此通信进行数据同步。读和写操作都通过本地数据库节点,然后使用副本对不同节点之间的数据进行同步。如图:
- 1.1 牺牲一致性 (用户将看到失效(不一致)数据的可能性) CP假设我们完全不停用库存服务。如果现在我更改了 DC1 上的数据,DC2 的数据库将看不 到它。这意味着,任何访问我们在 DC2 上库存节点的请求,看到的可能是已经失效的数 据。
换句话说,我们的系统仍然可用,两个节点在系统分区之后仍然能够服务请求,但失 去了一致性。这通常被称为一个 AP 系统。在这种分区情况下,如果我们继续接受写操作,那就需要接受这样的一个事实,在将来的 某个时候它们不得不重新同步。分区持续的时间越长,这个重新同步就会越困难。现实情况是,即使我们没有数据库节点之间的网络故障,数据复制也不是立即发生的。
正如前面提到的,系统放弃一致性以保证分区容忍性和可用性的这种做法,被称为最终一致 性;也就是说,我们希望在将来的某个时候,所有节点都能看到更新后的数据,但它不会 马上发生,所以我们必须清楚用户将看到失效数据的可能性。
-1.2 牺牲可用性(拒绝响应请求) AP
如果我们需要保证一致性,相反想要放弃其他方面,会发生什么呢?好吧,为了保证一致 性,
每个数据库节点需要知道,它所拥有的数据副本和其他数据库节点中的数据完全相同。 现在在分区情况下,如果数据库节点不能彼此通信,则它们无法协调以保证一致性。 由于无法保证一致性,所以我们唯一的选择就是拒绝响应请求。换句话说,我们牺牲了可 用性。如果我们需要保证一致性,相反想要放弃其他方面,会发生什么呢?好吧,为了保证一致 性,
每个数据库节点需要知道,它所拥有的数据副本和其他数据库节点中的数据完全相同。 现在在分区情况下,如果数据库节点不能彼此通信,则它们无法协调以保证一致性。 由于无法保证一致性,所以我们唯一的选择就是拒绝响应请求。换句话说,我们牺牲了可 用性。系统是一致的和分区容忍的,即 CP。在这种模式下,我们的服务必须考虑如何做 功能降级,
直到分区恢复以及数据库节点之间可以重新同步。-1.3 牺牲分区容忍性 (在分布式系统中不存在)
-1.4 AP还是CP