CAP定论

CAP定论:指的是在一个分布式系统中 Consistency(一致性),Availability(可用性),Partition-tolerance(分区容错性) 三者不可得兼.
CAP原则是NOSQL数据库的基石
C:数据同步一一致
A:请求必修在一定时间响应,可以终止,但是不能一致等待
P:节点被分割了,任然要对外提供服务
(1)一致性C:
单机环境下, 数据只有一份,所有的客户端访问的是同一份数据,不会出现两个客户端看到不一样的数据;分布式环境下,同一份数据会保存在多台服务器上,大量客户端来访问数据,负载会分布在各个服务器上,两个不同的客户端C1,C2可能访问的是不同的两台服务器S1,S2, 如果S1,S2上当前数据完全一样,C1,C2会拿到同样的数据,满足一致性;而要保证每个时刻S1,S2上的数据完全一样,在每次对数据更新的时候,就必须等待C1,C2都完成了数据更新, 该次数据更新操作才能成功返回.

(2)可用性A:
可用性要求所有的读写请求必须在一定的时间得到响应,可以终止,但是不可以一直等待。在单机环境中,如果服务没问题,读写服务可以很快返回,如果服务器挂掉,也可以很容易做到返回响应。但是在分布式环境中,一个写请求达到某一个服务器,该服务更新数据后还得和集群中其他服务器同步数据,使得各个服务器数据一致, 但是网络是不可控的,可能某些服务器之间的网络出现故障导致更新请求无法送达,或者更新完成ACK无法返回,这个时候就要选择是直接返回,还是等待更新成功

(3)分区容错性P:
分区容错性要求在发生网络分区的情况下,被分割的节点仍能对外提供服务。单机环境下不会发生网络分区,分布式环境下,任意时刻,当前环境下各个服务器的数据即使存在不一致,也要系统能正常对外提供服务。这就会导致一问题,多个客户端访问不同的服务器,由于数据不一致,会存在对同一份数据的访问,得到不同的结果(也就是违背了一致性原则)。

为什么不能同时满足CAP?

(1)假设当前分布式系统满足CA,C要求各个客户端读到的数据必须是一致的,考虑发生网络分区的情况,当前各个服务器存在数据不一致,那么根据C系统是不可以对外提供服务的(因为不同的客户端访问同一份数据会得到不同的结果),那么也就无法满足分区容错性P。

(2)假设当前分布式系统满足CP, 在网络发生分区的情况下,为达到C, 请求只能一直等待,等待网络分区情况解除,系统数据同步完成才能返回,这就无法满足可用性A。

(3)假设当前分布式系统满足AP, 系统要求在一定的时间内就要返回,在发生网络分区的情况下,为了保证P,即使出现网络分区也要正常提供服务,按时返回数据,可能不同客户端访问同一份数据得到不同的结果,这就不能保证数据的一致性C。

CAP理论就是说在分布式储存系统中,最多只能实现上面的两点,由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的,所以我们只能在一致性与可用性之间进行权衡,没有nosql系统能同时保证这三点

对于web2.0网站来说,关系型数据库的很多主要特征毫无用武之地
1.数据库实物一致性需求
很多web实时系统并不要求严格的数据库事务,对一致性要求很低,有些场合对写一致性要求不高,允许实现最终一致性
2.数据库的写实性和读实性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据来的,但是对于很多web应用来说,并不要求这么高的实时性,比方说发一条消息之后,过了几秒或者十几秒之后,我的订阅者才看到这条动态是完全可以接受的
3.对于复杂的sql查询,特别是多表关联查询的需求
任何大数据量的web系统,都是非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型网站,从需求以及产品设计角度,就避免这种情况的产生.往往更多的是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大弱化了

分布式系统的典型应用

分布式系统是一个非常广泛的概念,它最终要落实到解决实际问题上,不同的问题有不同的方法和架构。所有的开源软件都是以某个应用场景出现,而纯粹以“分布式”概念进行划分的比较少见。
但如果以算法划分,到能分出几类:
1.以Leader选举为主的一类算法,比如paxos、viewstamp,就是现在zookeeper、Chuby等工具的主体
2.以分布式事务为主的一类主要是二段提交,这些分布式数据库管理器及数据库都支持
3.以若一致性为主的,主要代表是Cassandra的W、R、N可调节的一致性
4.以租赁机制为主的,主要是一些分布式锁的概念,目前还没有看到纯粹“分布式”锁的实现
5.以失败探测为主的,主要是Gossip和phi失败探测算法,当然也包括简单的心跳
6.以弱一致性、因果一致性、顺序一致性为主的,开源尚不多,但大都应用在Linkedin、Twitter、Facebook等公司内部
7当然以异步解耦为主的,还有各类Queue

猜你喜欢

转载自blog.csdn.net/weixin_42286175/article/details/84791105
CAP