分布式系统基础知识
CAP 定理
在工程上,专业人士和业余爱好者的一个差别在于是否了解极限的存在。
-- 吴军《把事情做好的三条边》,来自得到专栏《谷歌方法论》
CAP 定理(CAP theorem),是分布式系统的基本定理,也是分布式存储在工程实践中无法绕过的理论极限。该定理的内容是,在下面三个特性中,任何一个分布式系统最多只能满足两条:
- 一致性 Consistency:任何一次读操作,要么返回最新写入的数据,要么返回 error。任何节点,只要返回了数据,都是一致的(最新写入的版本)。存在数据不一致的情况下,宁可返回错误。
- 可用性 Avalibility:任何一次请求都尽量不返回 error,而是返回节点上当前版本的数据,但不保证返回的数据是最新写入的版本,也不保证返回的数据和其他结点相同。即优先返回数据,容忍不同节点间数据不一致。
- 分区容忍性 Patrition tolenrance:在节点间通信存在延迟或数据丢失的情况下,整个分布式系统正常运作。满足这个性质,才是真正的分布式系统。
上图是 CAP 定理与开源分布式数据存储方案的对应关系。
其中,传统的关系型数据库 RDBMS 可以保证一致性与可用性,即CA,但无法支持分区容忍性。也就是说,RDBMS本质上还是单体应用,不具备分布式特征,在面临性能瓶颈时,只能通过升级配置来解决问题,并不支持水平扩展。
当单体服务性能超出当前计算机系统的工程极限后,只能通过迁移到分布式系统来进行进一步扩容。真正的分布式系统并不是从CAP中三选二,因为分区容忍性的要求必须满足。因此,任何分布式系统都需要从一致性与可用性中二选一。目前常见的分布式数据存储方案中,MongoDB、HBase、Redis 可保证一致性,而牺牲了可用性(CP)。CounchDB、Cassandra 则优先考虑可用性,牺牲了一致性(AP)。
在进行技术选型时,需要根据实际业务特点,在一致性与可用性间做出取舍。
常见误解
刚开始学习分布式系统的初学者,出于单体应用的开发经验的影响,常常会存在一些误解。这些误解十分普遍,以至于存在专门的维基百科条目(见文末参考链接)。
这些误解包括:
- 网络通信是可靠的。
- 网络通信没有延迟。
- 网络带宽是无限的。
- 网络是安全的。
- 网络拓扑不会变化。
- 只有一个网络管理员。
- 组建网络的成本是0。
- 不同子系统的网络是同构的。
在分布式系统工程实践中,上面8条,每条都可能会导致严重的故障。分布式系统中故障不可避免,架构与业务设计也应该采用“面向故障”的设计方案。分布式系统中,故障处理相关的代码远超单体应用。