一、CAP
一个分布式架构最多只能同时满足一致性、可用性和分区容错性这三项中的两项。
C:Consistency
一致性:“all nodes see the same data at the same time”,即所有节点在同一时间的数据完全一致。
- 强一致性。对于关系型数据库,要求更新过的数据,后续的访问都能看到。
- 弱一致性。如果能够容忍后续的部分或者全部访问不到,则是弱一致性。
- 最终一致性。如果经过一段时间后能访问到更新后的数据,则是最终一致性。
A:Availability
可用性:“Reads and writes always succeed”,即服务在正常的响应时间内一直可用。好的可用性主要是指系统能够很好地为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。
P:Partiton tolerance
分区容错性:“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。
例如:有两个节点N1和N2,节点N1和N2部署在不同的服务器上,N1和N2之间网络可以连通。
在满足一致性的情况下,N1和N2的数据是一样的。
在满足可用性的情况下,用户不管是请求N1还是请求N2,都能立即得到相应。
在满足分区容错性的情况下,N1和N2有任何一方宕机或者网络不通,都不会影响N1和N2彼此之间的正常运作。
然而在分布式架构中这只是一种理想的情景。分布式系统和单机系统最大的区别在于网络,假设现在N1和N2之间的网络断开了,我们要支持这种网络异常,相当于要满足分区容错性。能不能同时满足一致性和可用性呢?
N1和N2之间的网络断开了,有用户向N1发送更新数据的请求,N1更新成功,由于N1和N2的网络断开了,N1和N2之间就无法进行数据的同步了,N1和N2的数据是不同的。如果此时用户向N2请求数据,应该怎么办呢?有两种情况:
1、选择可用性,牺牲一致性,N2返回旧数据。
2、选择一致性,牺牲可用性,N2阻塞直至网络连接恢复,N1和N2完成同步之后再给客户响应最新的值。
以上,说明了分布式架构中,在满足分区容错性的情况下,只能在一致性和可用性中的一种。
CP还是AP,如何权衡
对于多数大型互联网应用,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性能达到N个9,即保障AP舍弃C。
而对于银行业务,设计钱财不能有一丝让步的场景,必须保障C,网络发生故障宁可停止服务,即保障CP舍弃A。
需依据自己的场景定夺,合适的才是最好的。
二、BASE理论
BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性,但应用应该采用适合的方式达到最终一致性。
BASE理论是指基本可用(Basically Available)、软状态(Softe state)、最终一致性(Eventual Consistency)。
基本可用(Basically Available)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的表现。
软状态(Softe state)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时,就是软状态的体现。
最终一致性(Eventual Consistency)
最终一致性是指系统中所有数据副本经过一段时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
发现一篇很好的文章