分布式系列:分布式系统之聊聊CAP理论

本文于2019年11月25日首发于公众号“码农的修炼之道”,欢迎关注!

在分布式系统中有一个重要的理论,这就是CAP理论。其中C代表单词Consistency,一致性。是指所有节点在同一时刻的数据是相同的,比如更新数据库集群,更新成功后,该集群中的其他数据库也要数据一致。

A代表单词Availability,可用性。是指系统提供的服务一直是可用状态,对于客户端的请求必须有响应。

P代表Partition,分区容错性。在分布式系统中,遇到网络问题仍然可以响应用户的请求。

一致性,可用性,分区容错性构成了分布式系统的CAP理论,在CAP理论中得出结论,C、A、P三者只能满足两个,至于为什么只能满足两个,本文先不介绍了。

CAP理论的选择策略一般有以下三种,也就是CA、AP、CP三种组合。

1、CP组合

对于金钱相关的交易来说,数据一致性就是最重要的。比如2015年发送的支付宝光缆被挖断的情况,当时支付宝的策略就是CP,导致很多用户当时使用支付宝都不是很方便。保证CP的系统一旦发送网络分区会导致数据无法同步,降低系统可用性,直到数据完全同步才提供服务。

保证CP的系统很多,比如Redis系统,zookeeper等。

在Zookeeper集群中包括多个节点,这些节点通过选举算法选出一个Lead节点,这里采用的是ZAB算法。Lead节点之外的是Follower节点,Lead节点专门负责处理用户的写请求。
分布式系列:分布式系统之聊聊CAP理论

  • 当用户向节点发送写请求,如果节点是Lead则之间处理。
  • 如果是Follow节点,则转发请求给Lead节点,Lead先向所有的节点发送Proposal(提案),等超过一半节点同意后就进行提交这次写操作,从而保证了数据的强一致性。如下图所示。
    分布式系列:分布式系统之聊聊CAP理论
    这种方案保证了分区容错性,牺牲了一定的系统可用性。比如,出现了网络分区(脑裂问题),该方案在小范围内还是进行选举出新Lead提供对外服务。只有分区内都不满足选举,才会导致完全不可用。

2、AP组合

对于大部分应用场景来说,只需要做到最终一致性即可。也就是可以容忍短时间内数据的不一致。

这种场景其实也很多,比如很多电商网站或查询系统中,为了用户体验好,会牺牲一定的数据一致性。比如,某电商有三大仓库A,B,C。假设A的网络与B,C发生了故障,导致数据无法互相同步。假如此时出售了一个电风吹,但是A区域的用户可能查询到库存还是之前的结果。只有最终网络恢复了才会进行同步,此时用户刷新一下界面就可以看到现在的库存。但是对于用户来说并不会感知网络故障。

如果此时采用强一致性,A区服务器阻塞进行数据同步,那么无法响应A区域的响应,用户刷半天刷不出来商品,肯定不想看了。

3、CA组合

在分布式系统中,系统之间通过网络进行连接,而网络的不通或故障是很常见的,如果不需要P,也就是放弃了分区容错性,也就意味着放弃了分布式系统,这种情况对应于单机下的应用程序,比如MySQL部署在单机上,因为不存在不同机器的数据库集群相互通信问题,因此保证CA很容易。