分布式系统基础知识

CAP 定理

在工程上,专业人士和业余爱好者的一个差别在于是否了解极限的存在。
-- 吴军《把事情做好的三条边》,来自得到专栏《谷歌方法论》

CAP 定理(CAP theorem),是分布式系统的基本定理,也是分布式存储在工程实践中无法绕过的理论极限。该定理的内容是,在下面三个特性中,任何一个分布式系统最多只能满足两条:

  1. 一致性 Consistency:任何一次读操作,要么返回最新写入的数据,要么返回 error。任何节点,只要返回了数据,都是一致的(最新写入的版本)。存在数据不一致的情况下,宁可返回错误。
  2. 可用性 Avalibility:任何一次请求都尽量不返回 error,而是返回节点上当前版本的数据,但不保证返回的数据是最新写入的版本,也不保证返回的数据和其他结点相同。即优先返回数据,容忍不同节点间数据不一致。
  3. 分区容忍性 Patrition tolenrance:在节点间通信存在延迟或数据丢失的情况下,整个分布式系统正常运作。满足这个性质,才是真正的分布式系统。

上图是 CAP 定理与开源分布式数据存储方案的对应关系。

其中,传统的关系型数据库 RDBMS 可以保证一致性与可用性,即CA,但无法支持分区容忍性。也就是说,RDBMS本质上还是单体应用,不具备分布式特征,在面临性能瓶颈时,只能通过升级配置来解决问题,并不支持水平扩展。

当单体服务性能超出当前计算机系统的工程极限后,只能通过迁移到分布式系统来进行进一步扩容。真正的分布式系统并不是从CAP中三选二,因为分区容忍性的要求必须满足。因此,任何分布式系统都需要从一致性与可用性中二选一。目前常见的分布式数据存储方案中,MongoDB、HBase、Redis 可保证一致性,而牺牲了可用性(CP)。CounchDB、Cassandra 则优先考虑可用性,牺牲了一致性(AP)。

在进行技术选型时,需要根据实际业务特点,在一致性与可用性间做出取舍。

常见误解

刚开始学习分布式系统的初学者,出于单体应用的开发经验的影响,常常会存在一些误解。这些误解十分普遍,以至于存在专门的维基百科条目(见文末参考链接)。

这些误解包括:

  1. 网络通信是可靠的。
  2. 网络通信没有延迟。
  3. 网络带宽是无限的。
  4. 网络是安全的。
  5. 网络拓扑不会变化。
  6. 只有一个网络管理员。
  7. 组建网络的成本是0。
  8. 不同子系统的网络是同构的。

在分布式系统工程实践中,上面8条,每条都可能会导致严重的故障。分布式系统中故障不可避免,架构与业务设计也应该采用“面向故障”的设计方案。分布式系统中,故障处理相关的代码远超单体应用。

参考