暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式系统的可用性和一致性(CAP)

原创 杨磊 2021-02-20
3939

分布式系统是指被部署在不同网络环境、不同节点的系统。
其通过数据的冗余来达到高可用(主备机切换)、高吞吐(备机分担读压力)的能力。

由于分布式系统中引入网络,而网络问题是不可避免的,因此如果还要求数据在各个分布式系统之间的强一致性,就会严重的影响服务的可用性(如:数据库的主从拷贝,需要等到所有的变更拷贝到从库,才能提供服务,特别是其中一个从库不可达的时候,那么服务就变得不可用)。

然而可用性在大部分系统中又是基本性能指标;
因此在设计分布式系统时会根据其业务特性在一致性和可用性之间进行权衡。

其比较著名的理论就是CAP理论,其指分布式系统在一致性Consistency、可用性Availability、分区容错性Partition tolerance只能同时满足其中两种。

CAP理论
首先来看下分布式系统中不可避免的网络问题。
1)通信异常问题
在单机系统中,对于客户端的请求或者一个事务的执行,只会出现成功或者失败两种确定的状态,然而在分布式的系统中还可能出现超时这样一种不确定的状态。超时一般存在两种状态:1)由于网络异常,客户端的请求没有达到服务器端 2)客户请求到达服务器端,并且服务器执行成功,但是在返回响应结果的时候,由于网络异常响应结果丢失,造成客户端请求超时。因此对于网络异常是一种不确定的状态,因此其影响系统的可用性。
2)网络分区
当遇到严重的网络异常时,导致分布式系统中部分节点之间不可达,而其他部分节点内部是可以通信的,使得整个分布式系统分割成了一个一个小的集群,这些小的集群可以正常的处理集群内部的事务,但是跨集群之间的事务总是失败的(拿银行系统来举例,就是单个银行内部的存款取款功能正常,但是跨行的转账业务不可用),这样的想象就是所谓的网络分区或者脑裂想象。
对于网络问题,是分布式系统不可避免的想象,并且是总会发生的现象,因此要求分布式系统必须具有分区容错性,不能因为网络分区现象的存在使得整个服务不可用。

啥是CAP定理?
C(一致性):所有的节点上的数据时刻保持同步,对于事务只能同时的成功或者失败,即所有的备份数据已经完全和主数据完全一致。

强一致性:
这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。对于每个事务在提交后,只能出现成功或者失败两种状态,不存在中间状态。
弱一致性:
这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。
最终一致性:
最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。
顺序一致性:
是指每个提交的事务会根据提交的顺序,使得系统的数据达到最终一致性状态。但是我们知道分布式系统是没有全局时钟的概念,因此在度量分布式事务的顺序时是不准确的,因此顺序一致性大部分是指同一节点提交事务的顺序,不是不同节点之间的顺序性。其中顺序最终一致性常用于redis等分布式数据库系统中。

A(可用性):每个请求都能在指定时间内接受到一个准确的响应(成功或者失败)。然而在分布式系统中还会出现超时这样一种不确定的状态。

在分布式系统中通信异常时最常见的一种异常,其是不可避免的,因此在一个请求发生时,如果发生通信异常,就会产生如下两种情况:
1)请求没有到达目标系统,造成整个请求超时(请求未处理)。
2)请求到达目标系统,但是在目标返回响应的过程中,响应信息丢失,造成整个请求超时(请求已经处理)。因此超时对于客户系统而言都是一种不确定的状态,其服务是不可用的状态。

对于一个分布式系统假设每个机器或者节点产生网络故障的概率是P,那么整个分布式系统的极致可用性是1-P^N(N表示机器或者节点数量)。因此此处所说的可用性是指分布式系统的极致可用性,即只要有一台机器或者节点可用那么就要保证整个服务可用。

P(分区容错性):系统应该能持续提供服务,即使由于网络原因造成系统被分隔成很多个子系统(分区),仍然能够提供服务。

网络问题是分布式系统不可避免的问题,并且是一定会发生的问题。因此对于分布式系统必须要具有分区容错性。例如:一个分布式系统需要有3个备份,其分区容错性为2,及要求必须有2个备份才能继续提供服务。因此如果其中一个备份的机器节点不可达,由于分区容错性的存在,其可以继续提供服务,并且分布式系统会根据情况等待该分区重新连接,恢复失去连接时的新增数据,之后再提供服务。或者由于节点宕机,会重新产生一个分区,并同步所有的数据(时间较长),等数据同步完成再开始进行服务。如果一个分布式系统不允许分区容错性,那么只要一个备份数据不可用,整个服务都不可用,这是用户不可接受的。

综上,来看大部分的分布式系统都是在考虑满足P的情况下,在C和A之间进行选择,并且可能会根据一个系统中业务的不同分别的满足CP或者PA的特性,甚至在C和A之间寻找一个平衡点。

PS: 同时满足CAP的系统是不存在的,因为如果一个分布式系统要在满足分区容错性的情况下,同时满足CA,那么当一个请求同步到一个分区的时候,请求消息被丢失,那么由于一致性的限定,要求这个分区一定要有这个消息的请求,那么就造成了整个服务不可用,即A不满足。在分布式数据库中,对于写操作就会进行回滚,最终就导致了写操作的不可用。

以下为个人公众号,欢迎扫码关注:
image.png

最后修改时间:2021-02-23 10:25:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论