文章目录
CAP 概述
- C、一致性、Consistency: 所有节点在同一时间具有相同的数据。
- A、可用性、Availability): 保证每个请求不管成功或者失败都有响应。
- P、分区容错性、Partition tolerance: 在分布式中,由于网络的原因无法避免有时候出现数据不一致的情况,系统如果不能在时限内达成数据一致性,不会影响系统的继续运作。
CAP理论的核心: 一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
- CA: 单点集群,满足一致性,可用性的系统,通常在可扩展上不太强大。应用:传统的Oracle数据库。
- CP: 满足一致性,分区容错性的系统,通常性能不是特别高。应用:Redis,MongoDB,银行。
- AP: 满足可用性,分区容错性,通常可能对一致性要求低一些。应用:大多数网站架构的选择。
CAP理论就是说在分布式存储系统中,最多只能实现上面的两个。
而由于当前的网络硬件肯定会出现延迟丢包等问题。
所以分区容忍性P是我们必须需要实现的。
所以我们只能在一致性C和高可用A之间进行权衡,没有哪个系统能同时保证三点。
为何CAP三者不可兼得
假设有两台服务器,一台放着应用A和数据库V,一台放着应用B和数据库V,他们之间的网络可以互通,也就相当于分布式系统的两个部分。
在满足一致性的时候,两台服务器 N1和N2,一开始两台服务器的数据是一样的,DB0=DB0。在满足可用性的时候,用户不管是请求N1或者N2,都会得到立即响应。在满足分区容错性的情况下,N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作。
当用户通过N1中的A应用请求数据更新到服务器DB0后,这时N1中的服务器DB0变为DB1,通过分布式系统的数据同步更新操作,N2服务器中的数据库V0也更新为了DB1,这时,用户通过B向数据库发起请求得到的数据就是即时更新后的数据DB1。
上面是正常运作的情况,但分布式系统中,最大的问题就是网络传输问题,现在假设一种极端情况,N1和N2之间的网络断开了,但我们仍要支持这种网络异常,也就是满足分区容错性,那么这样能不能同时满足一致性和可用性呢?
假设N1和N2之间通信的时候网络突然出现故障,有用户向N1发送数据更新请求,那N1中的数据DB0将被更新为DB1,由于网络是断开的,N2中的数据库仍旧是DB0;
如果这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据DB1,怎么办呢?有二种选择,第一,牺牲数据一致性,响应旧的数据DB0给用户;第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作完成之后,再给用户响应最新的数据DB1。
上面的过程比较简单,但也说明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。也就是说分布式系统不可能同时满足三个特性。这就需要我们在搭建系统时进行取舍了。