CAP理论
分布式系统最多满足以下三个特性中的两个。
-
一致性(Consistency) 在分布式系统中对某个数据进行写操作后的任何读操作,都应该读到最新的值,相当于要求分布式系统中各个节点的数据时时刻刻保持一致
-
可用性(Availability)即要求系统可以提供正常的读写操作
-
分区容错性(Partition tolerance)当分布式系统的某个节点出现问题的时候,整个系统依然能对外提供服务,即允许节点出问题(某种程度上是必然)
为什么无法同时都满足
- 保证一致性C的前提下
对某个节点A的数据写操作后,数据需要同步到其他节点B,如果此时访问B节点,则需要等到同步完成之后才能访问,此时满足分区容错性P,无法满足可用性A,如果要保证可用性,则只能取消同步过程,相当于就只有A节点一个分区,这样如果A节点出现问题,系统无法正常提供服务,则又不满足分区容错性P
- 保证可用性A的前提下
此时如果保证分区容错性,则无法保证访问不同节点的数据能得到一致的结果,违反 一致性,如果绕过同步过程,则能保证一致性,但数据没有备份,又不能保证分区容错性
如何取舍
-
CA: 优先保证一致性和可用性,放弃分区容错。 这也意味着放弃系统的扩展性,系统不再是分布式的,无法再保证整个系统的高可用
-
CP: 优先保证一致性和分区容错性,放弃可用性。在数据一致性要求比较高的场合(譬如:zookeeper,Hbase) 是比较常见的做法,一旦发生网络故障或者消息丢失,就会牺牲用户体验,等恢复之后用户才逐渐能访问。
-
AP: 优先保证可用性和分区容错性,放弃一致性。NoSQL中的Cassandra 就是这种架构。跟CP一样,放弃一致性不是说一致性就不保证了,而是逐渐的变得一致。