作者简介:ASCE1885,《Android 高级进阶》 和 《Android 高级进阶(源码剖析篇)》作者
本文由于潜在的商业目的,未经授权不开放全文转载许可,谢谢!
近年来,CAP 定理已经成为分布式系统设计的基本准则之一,CAP 定理表明,任何分布式计算机系统只能同时满足一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance)三者中的任意两个。
那么这三者的具体含义是什么呢?
一致性
- 当数据在多个节点上分区存储时,所有节点在某个指定时间将会看到相同的数据,并且在所有时间点都应该看到相同的数据
- 当客户端查询时,每个节点将返回最新的数据,否则系统将直接出错提示
- 一致性的保证是通过在更新多个节点数据时,同时禁止读取数据的方式来实现的
可用性
- 在任何时间点,对系统发起的每个请求都会产生一个有效的响应
- 当然,这并不意味着系统的每个请求都会收到包含最新数据的响应,可用性是通过在不同服务器节点间进行数据复制实现的
分区容错性
- 即使发生网络故障或者数据丢失,系统也能够连续运行
- 可以通过在节点和网络集群间充分的复制数据和系统功能来实现分区容错。通过这种方式引入的冗余能够确保即使在一个或者多个节点间不能互相通信的情况下,系统整体也能够持续运行
由于任何分布式系统任何时候只能同时满足 CAP 定理中的两个属性,因此,我们可以根据这一点将分布式系统分为三类:
- CA 系统:数据在所有节点之间是一致的,我们也可以从系统的任意节点中进行读和写,但节点间通信网络不能出故障
- CP 系统:数据在所有节点之间是一致的,而且能够容忍分区出错并防止数据不同步
- AP 系统:系统中所有节点总是在线的,但无法保证获取到的是最新数据,但只要网络正常,节点间就会进行同步
在真实的分布式系统网络环境中,网络分区是不可避免的,因此,通常需要保证即使在发生网络分区的情况下,系统作为整体仍然能够正常运行并提供服务,也就是满足分区容错性。因此,留给大多数分布式系统的选择也就只剩下到底是保证系统一致性还是可用性了。
在进行系统设计时,我们要根据具体的业务场景需求来进行选择。例如你设计的是一个类似微博这样的系统,那么肯定要保证系统的高可用,而用户发表一条微博后,其他用户要过一小段时间才能查看到,这并不会产生多大的影响,此时可用性相对一致性而言就重要的多了。
那么常见的中间件存储系统都是什么类型的呢?如下图所示:
最后要强调一点,CAP 定理关注的是对数据的读写操作,而不是分布式系统的所有功能,它要求分布式系统节点间是互相连接且有数据共享的,例如 Memcache 的集群中节点相互间没有连接和数据共享,因此不是 CAP 定理讨论的对象,同理 ZooKeeper 的选举机制也不是 CAP 探讨的对象。
参考资料:
- System Design Interview Concepts – CAP Theorem
- 想成为架构师,你必须知道 CAP 理论 by 李运华