CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这三个基本需求,最多只能同时知足其中的2个。算法
选项 | 描述 |
---|---|
Consistency(一致性) | 指数据在多个副本之间可以保持一致的特性(严格的一致性) |
Availability(可用性) | 指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应(不保证获取的数据为最新数据) |
Partition tolerance(分区容错性) | 分布式系统在遇到任何网络分区故障的时候,仍然可以对外提供知足一致性和可用性的服务,除非整个网络环境都发生了故障 |
什么是分区?数据库
在分布式系统中,不一样的节点分布在不一样的子网络中,因为一些特殊的缘由,这些子节点之间出现了网络不通的状态,但他们的内部子网络是正常的。从而致使了整个系统的环境被切分红了若干个孤立的区域,这就是分区。编程
如图所示,是咱们证实CAP的基本场景,网络中有两个节点N1和N2,能够简单的理解N1和N2分别是两台计算机,他们之间网络能够连通,N1中有一个应用程序A,和一个数据库V,N2也有一个应用程序B和一个数据库V。如今,A和B是分布式系统的两个部分,V是分布式系统的数据存储的两个子数据库。后端
如图所示,这是分布式系统正常运转的流程,用户向N1机器请求数据更新,程序A更新数据库V0为V1。分布式系统将数据进行同步操做M,将V1同步的N2中V0,使得N2中的数据V0也更新为V1,N2中的数据再响应N2的请求。缓存
根据CAP原则定义,系统的一致性、可用性和分区容错性细分以下:网络
这是正常运做的场景,也是理想的场景。做为一个分布式系统,它和单机系统的最大区别,就在于网络。如今假设一种极端状况,N1和N2之间的网络断开了,咱们要支持这种网络异常。至关于要知足分区容错性,能不能同时知足一致性和可用性呢?仍是说要对他们进行取舍?多线程
假设在N1和N2之间网络断开的时候,有用户向N1发送数据更新请求,那N1中的数据V0将被更新为V1。因为网络是断开的,因此分布式系统同步操做M,因此N2中的数据依旧是V0。这个时候,有用户向N2发送数据读取请求,因为数据尚未进行同步,应用程序没办法当即给用户返回最新的数据V1,怎么办呢?架构
这里有两种选择:框架
这个过程,证实了要知足分区容错性的分布式系统,只能在一致性和可用性二者中,选择其中一个。异步
经过CAP理论,咱们知道没法同时知足一致性、可用性和分区容错性这三个特性,那要舍弃哪一个呢?
若是不要求P(不容许分区),则C(强一致性)和A(可用性)是能够保证的。但其实分区不是你想不想的问题,而是始终会存在,所以CA的系统更多的是容许分区后各子系统依然保持CA。
若是不要求A(可用),至关于每一个请求都须要在Server之间强一致,而P(分区)会致使同步时间无限延长,如此CP也是能够保证的。不少传统的数据库分布式事务都属于这种模式。
要高可用并容许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每一个节点只能用本地数据提供服务,而这样会致使全局数据的不一致性。如今众多的NoSQL都属于此类。
对于多数大型互联网应用的场景,主机众多、部署分散。并且如今的集群规模愈来愈大,因此节点故障、网络故障是常态。这种应用通常要保证服务可用性达到N个9,即保证P和A,只有舍弃C(退而求其次保证最终一致性)。虽然某些地方会影响客户体验,但没达到形成用户流程的严重程度。
对于涉及到钱财这样不能有一丝让步的场景,C必须保证。网络发生故障宁肯中止服务,这是保证CA,舍弃P。貌似这几年国内银行业发生了不下10起事故,但影响面不大,报到也很少,广大群众知道的少。还有一种是保证CP,舍弃A,例如网络故障时只读不写。
孰优孰劣,没有定论,只能根据场景定夺,适合的才是最好的。
欢迎扫码关注公众号: 零壹技术栈
本账号将持续分享后端技术干货,包括虚拟机基础,多线程编程,高性能框架,异步、缓存和消息中间件,分布式和微服务,架构学习和进阶等学习资料和文章。