CAP原则又称CAP定理,指的是在一个分散式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
基本介绍
- 中文名:CAP原则
- 外文名:CAP Principle
- 学科:计算机科学
- 特性:一致性、可用性、分区容忍性
- 套用:分散式系统
- 特点:最多只能同时实现两点
简介
CAP原则又称CAP定理,指的是在一个分散式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
一致性(C):在分散式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能回响客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
CAP原则的精髓就是要幺AP,要幺CP,要幺AC,但是不存在CAP。如果在某个分散式系统中数据无副本, 那幺系统必然满足强一致性条件, 因为只有独一数据,不会出现数据不一致的情况,此时C和P两要素具备,但是如果系统发生了网路分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了CP系统,但是CAP不可同时满足。必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了CP系统,但是CAP不可同时满足。
因此在进行分散式架构设计时,必须做出取捨。当前一般是通过分散式快取中各节点的最终一致性来提高系统的性能,通过使用多节点之间的数据异步複製技术来实现集群化的数据一致性。通常使用类似 memcached 之类的 NOSQL 作为实现手段。虽然 memcached 也可以是分散式集群环境的,但是对于一份数据来说,它总是存储在某一台 memcached 伺服器上。如果发生网路故障或是伺服器当机,则存储在这台伺服器上的所有数据都将不可访问。由于数据是存储在记忆体中的,重启伺服器,将导致数据全部丢失。当然也可以自己实现一套机制,用来在分散式 memcached 之间进行数据的同步和持久化,但是实现难度是非常大的。
可用的抉择
CAP理论就是说在分散式存储系统中,最多只能实现上面的两点。而由于网路硬体肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。对于web2.0网站来说,关係资料库的很多主要特性却往往无用武之地。
- 资料库事务一致性需求
很多web实时系统并不要求严格的资料库事务,对读一致性的要求很低,有些场合对写一致性要求并不高。允许实现最终一致性。 - 资料库的写实时性和读实时性需求
对关係资料库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web套用来说,并不要求这幺高的实时性,比方说发一条讯息之 后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。 - 对複杂的SQL查询,特别是多表关联查询的需求
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及複杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角 度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
与NoSQL的关係
传统的关係型资料库在功能支持上通常很宽泛,从简单的键值查询,到複杂的多表联合查询再到事务机制的支持。而与之不同的是,NoSQL系统通常注重性能和扩展性,而非事务机制(事务就是强一致性的体现)。
传统的SQL资料库的事务通常都是支持ACID的强事务机制。A代表原子性,即在事务中执行多个操作是原子性的,要幺事务中的操作全部执行,要幺一个都不执行;C代表一致性,即保证进行事务的过程中整个资料库的状态是一致的,不会出现数据花掉的情况;I代表隔离性,即两个事务不会相互影响,覆盖彼此数据等;D表示持久化,即事务一旦完成,那幺数据应该是被写到安全的,持久化存储的设备上(比如磁碟)。
NoSQL系统仅提供对行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行的时候是会串列的执行,保证了每一个Key-Value对不会被破坏。
传统的SQL资料库的事务通常都是支持ACID的强事务机制。A代表原子性,即在事务中执行多个操作是原子性的,要幺事务中的操作全部执行,要幺一个都不执行;C代表一致性,即保证进行事务的过程中整个资料库的状态是一致的,不会出现数据花掉的情况;I代表隔离性,即两个事务不会相互影响,覆盖彼此数据等;D表示持久化,即事务一旦完成,那幺数据应该是被写到安全的,持久化存储的设备上(比如磁碟)。
NoSQL系统仅提供对行级别的原子性保证,也就是说同时对同一个Key下的数据进行的两个操作,在实际执行的时候是会串列的执行,保证了每一个Key-Value对不会被破坏。
与BASE的关係
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。
BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模网际网路系统分散式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个套用都可以根据自身的业务特点,採用适当的方式来使系统达到最终一致性(Eventual consistency)。接下来我们着重对BASE中的三要素进行详细讲解。基本可用:指分散式系统在出现不可预知故障的时候,允许损失部分可用性。
注意,这绝不等价于系统不可用,以下两个就是“基本可用”的典型例子:
回响时间上的损失:正常情况下,一个线上搜寻引擎需要0.5秒内返回给用户相应的查询结果,但由于出现异常(比如系统部分机房发生断电或断网故障),查询结果的回响时间增加到了1~2秒。
功能上的损失:正常情况下,在一个电子商务网站上进行购物,消费者几乎能够顺利地完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。
弱状态:也称为软状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
最终一致性:强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
分散式系统
分散式系统(distributed system)是建立在网路之上的软体系统。正是因为软体的特性,所以分散式系统具有高度的内聚性和透明性。因此,网路和分散式系统之间的区别更多的在于高层软体(特别是作业系统),而不是硬体。在一个分散式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网路实现信息交换。系统中存在一个以全局的方式管理计算机资源的分散式作业系统。通常,对用户来说,分散式系统只有一个模型或范型。在作业系统之上有一层软体中间件(middleware)负责实现这个模型。一个着名的分散式系统的例子是全球资讯网(World Wide Web),在全球资讯网中,所有的一切看起来就好像是一个文档(Web页面)一样。
在计算机网路中,这种统一性、模型以及其中的软体都不存在。用户看到的是实际的机器,计算机网路并没有使这些机器看起来是统一的。如果这些机器有不同的硬体或者不同的作业系统,那幺,这些差异对于用户来说都是完全可见的。如果一个用户希望在一台远程机器上运行一个程式,那幺,他必须登入到远程机器上,然后在那台机器上运行该程式。