前言
小结一下分布式理论相关基础知识
CAP 概念
C Consistency,一致性,是指所有节点在同一时刻的数据是相同的,及更新执行结束并相应用户完成后,所有节点存储的数据都会保持相同。
- PS: 那应该可以通过同步的方式,等待分布式架构所有的数据都同步完毕后,再返回。
A Availability,可用性,指系统一直处于可用状态,对用户的请求可即时响应。
- PS: 意思是硬件不故障就可以了么?
P Partition Tolerance,分区容错性,指分布式系统遇到网络分区的情况下,仍然能够响应用户的请求。网络分区指因为网络故障导致网络不连通,不同节点分布在不同自网络中,各个子网络内网络正常。
- PS: 意思是网络不故障就可以了么?
- 目前我的理解是,假如硬件一切正常,CAP 就可以同时被满足?答:在稳定且没有更新的情况下,一个存储系统是会处于CAP状态的。
CAP 理论,在分布式系统中 C、A、P 这三个特征不能同时满足,只能满足其中两个。
- 说明来自 极客时间 《分布式技术原理与算法解析》 聂鹏程
CAP 为什么不能同时被满足?

- 一致性,DB1 和 DB2 数据始终相同。
- 可用性,用户无法访问 Server1 还是 Server2 ,都会得到即时响应;
- 分区容错性,Server1 和 Server2 出现网络故障,也不会影响 Server1 和 Server2 处理用户的请求。
一个数据的更新
当这个分布式系统的 Server1 收到请求时,会先把数据更新到 DB1 中,然后再把数据同步到 DB2 。
但一个网络环境是不可能一直稳定的。节点间无法通信的话,会导致集群分区情况的出现,"网络分区"。所有 CAP 的理论中的 P 是一定要被满足的。
- PS: 其实也没有什么是一定的,假如 P 不被满足,意味着一旦有网络波动,系统就直接不可用了,这是不可能的。
P满足后,C 和 A 是否可以同时满足
假如 DB1 和 DB2 出现了通信故障(延迟),则 DB2 是无法即时返回给 User2 返回最新数据的。处理方法有且仅有种:
- 保持一致性 C,即 User2 请求时假如发现 DB2 和 DB1 的网络故障,就一直阻塞,直至网络恢复。因为 User2 要确认自己的数据是最新的。为故障阻塞,就意味着放弃 可用性A。
- 保持可用性 A,DB2 直接返回一个旧数据给 User2,这就意味着放弃一致性 C
CAP 的策略权衡
放弃A,保 CP
放弃可用性,保证一致性和分区容错性。即假如分布式系统发生网络故障,就让系统不可用,直至系统网络恢复。在一些交易场景下,这个是需要保证的。例如支付宝、微信支付那样。
类似系统包括:Redis、ZooKeeper。ZooKeeper 是如何保持 CP 的呢?
- 首先 ZooKeeper 集群会通过 ZAB 算法选举出 Leader 节点;
- 所有对集群发起的数据修改,都会被转发到 Leader 节点;
- Leader 向所有的节点发起一次提议 Proposal,等到超过一半的节点同意后,Leader 才会提供写操作,集群会学习这个写操作。数据一致性得以保持。(详细可查看 Paxos 算法)
- 当出现网络分区,分区分散,都不足以达到节点数一半,则不可用,假如其中一个分区的节点数大于集群节点数的一半,则那个分区可以再选举一个 Leader ,对用户服务,在选举过程中,不可用;
放弃C,保 AP
一般系统都会选择这种方式,保证可用性和分区容错性,放弃一致性。即允许不同的服务短时间内获取不一致的数据。例如,购买商品后,购物车、用户积分等允许少量时间数据不同步。
类似的电商的系统,对用户体验及其看重的,就需要保证 AP,允许数据不一致了。即用户可能见到的数据是假的,但在业务上还是允许的,只要不出现超卖的数据问题(通过分布式事务保证该数据正确)
放弃P,保 AC
要保证可用性和一致性,不允许分区容错,一般表示放弃使用分布式系统。即单点应用,使用 DBMS 去处理数据库时,程序需要保证 AC。
感悟
CAP 分布式理论给分布式系统划了一道上限,最大的作用是告知每一个程序员,在研究一个分布式系统,或阅读分布式代码时,要清楚一个分布式系统的取舍,理解的过程中,也不要企图满足 CAP,因为这都是徒劳的,懂得在边界内做事和理解问题。