分布式CAP理论浅析
Posted 胡强Cian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式CAP理论浅析相关的知识,希望对你有一定的参考价值。
CAP猜想最初由Eric Brewer提出,后由麻省理工学院Nancy Lynch等人证明,上升成分布式计算领域的一个公认定理。
CAP理论是指在一个分布式系统(指互相连接并共享数据的节点集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。需要强调一下,这里的有两个关键点,明确了CAP理论的讨论范围。一是探讨对象是一个互连且共享数据的分布式系统,二是CAP理论关注的粒度是数据。
一致性(Consistency):严格意义上的定义是指对于某个指定的客户端来说,读操作能保证读到最新写入的结果。通俗点说就是在任意时刻,集群中所有节点的状态都是一致的。但是这样通俗的描述是不准确的,因为在一个分布式事务执行过程中,系统处于不一致的状态,不同节点上的数据可能会不一致。对于客户端来说,事务执行过程中是读取不到未提交的数据的,只有等事务提交后,才会读到最后提交后的数据。
可用性(Availability):非故障节点应该在合理的时间内作出合理的响应(不是错误或超时的响应)。这个不用多说,可用性是保证系统能够正常提供服务的首要目标。这里值得注意的是,合理的时间解释了请求不能超时和出错,合理的响应解释了结果的合理性,而非正确性。
分区容错性(Partition Tolerance):当出现网络分区现象后,系统能够继续“履行职责”。在一个分布式系统中,由于网络或者机器故障,导致节点之间不能相互连通,整个网络就形成分区,数据散落在不同分区中。如果数据只在一个节点中保存,那么一旦出现分区,其他分区中的节点就访问不到这份数据了,这是无法容忍的。为了提高分区容错性,可以将数据复制到多个接点上,这样,当出现分区后,这份数据就有可能分散到不同分区中,从而提高了容错性。
我们知道,网络是非常不可靠的,系统必然会出现网络分区的情况,所以分布式系统必然要提供对P的支持。如果选择CA放弃P,那么当发生网络分区现象时,为了保证C,系统就需要禁止写入,当写入请求过来时,系统则会返回不允许写入的error,那么就和可用性(不能超时或出错)冲突了。因此,分布式系统理论上不能设计出同时满足CAP的架构,只能在CP或者AP中选择。
为了保证一致性C,写入节点A上的数据需要同步到节点B上,但当发生网络分区现象时,节点A与节点B的复制通道中断,节点A上的数据无法成功复制到节点B。当客户端访问节点B时,系统需要返回error,这与A冲突了。这就是CP架构。
如果数据成功写入节点A,但此时出现网络分区现象,节点A与节点B的复制通道中断,此时节点A与节点B中的数据是不一致的。为了保证可用性A,当客户端请求节点B的数据时,节点B返回的其实是还未来得及更新的旧数据,这就违背了C(客户端能保证读取到最新写入的结果)。这就是AP架构。
实际上,CAP理论没有考虑到网络延迟的情况,默认当一个事务提交时,数据能够瞬间复制到所有节点,但实际情况下是无法保证任何时刻的绝对一致性的。将数据从节点A复制节点B,总是要消耗一定的时间的,纵使是毫秒级的时间消耗,但对于金钱或者秒杀相关商品库存业务,也是致命的。
另外,当系统正常运行时,没有发生网络分区现象的情况下,其实是可以同时满足CA的,这时就要求架构设计的时候,需要充分考虑当网络没有出现分区时如何保证CA,以及当网络发生分区时,如何取舍A和C。
再者,当网络分区发生时,可以执行日志记录等操作,待分区故障解决后,使系统重新达到CA状态。
以上就是关于CAP理论的全部内容,欢迎批评指正!@_@
以上是关于分布式CAP理论浅析的主要内容,如果未能解决你的问题,请参考以下文章