什么是CAP
CAP定理指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。以下是关系图。
- 一致性(C)
所有在分布式系统下的数据,在同一时刻数据是完全一致的,即所有节点能够实时保持数据的同步,访问同一份数据。 - 可用性(A)
服务是一直可以用的,就算一部分节点故障了,但是整体还能做出正常的响应客户端请求。 - 分区容错性(P)
系统中任意的信息丢失了,但是系统还是继续运行,不会影响系统的继续运作。
分区指的是在分布式系统中,不同节点会分布在不同的子网络中,由于某些因素而导致节点之间网络不通,从而导致整个分布式系统被分成了多个独立的区域,这就是分区。
以上就是CAP三个要素的解释。在CAP理论中,我们只能同时实现两点,不能全都实现。
为什么不能同时满足三个要素
比如说我们系统有两个节点,之间会通过网络通讯。当节点A进行数据库更新操作的时候,也需要同时更新节点B的数据库。(比方说一个微服务节点是更新库存,另一个微服务节点新增订单)。
- 我们如果想保证一致性(C),那么当A节点更新的时候B节点也要更新
- 我们如果想保证可用性(A),那么两个节点都应该给客户端做出正常的响应
- 我们如果想保证分区容错性(P),那么A和B节点出现网络不通时,对外还是可用的
如果出现了网络分区,一致性和可用性就没办法满足,因为A节点连接不上B节点,那么一致性和可用性就不可能成立了,其实如果不满足分区容错性则算是单体服务了,不是分布式。
如果想保证一致性,那么可用性的性能会受到影响,比如处理数据的时候,需要同步处理,处理完数据后才让其他节点调用,这样可用性就会降低。如果作为分布式系统,一个服务出问题会导致其他服务都不能使用,此系统不是很好。
如果想保证可用性,必须要让节点继续对外服务,这样就要抛弃一致性。比如B节点服务不能用,但是A节点还是能对外服务。通常情况下我们分布式服务系统都采用该方案,当出现分区问题后,可以容忍,但是最终会通过一些方法达到最终数据一致性。
所以组合如下:
组合 | 解释 |
---|---|
CA | 满足一致性和可用性,放弃分区容错性。其实就是一个单体服务,不算分布式。 |
CP | 满足一致性和分区容错性,放弃可用性。当系统遇到分区问题后,为了保证一致性,则需要等服务恢复后才能对外提供服务。 |
AP | 满足可用性和分区容错性,放弃一致性。当系统遇到分区问题后,为了保证可用性,必须让服务继续对外服务。 |
总结
CAP的三个要素是一致性(C)、可用性(A)和分区容错性(P)。如果是分布式环境下,必须保证分区容错性,各个服务节点之间必须能通讯。所以对于一致性和可用性我们需要做出选择。一般我们开发分布式系统,都会保证系统的可用性,比如某个服务节点出问题,不会影响其他服务节点对外服务。consul、redis等其实都是保证了一致性和分区容错性。
下一节我会讲下解决方案-BASE,核心思想其实就是我们可以根据自身的业务特点,采用适当的方式使得系统达到最终一致性。
评论区