说说CAP原则

发布时间:2024-04-14 13:09:50
 

在设计一个分布式项目的时候会遇到三个特性:一致性(consistency)、可用性(Availability)、分区容错(partition-tolerance)都需要的情景.

 

CAP定律说的是在一个分布式计算机系统中,一致性,可用性和分区容错性这三种保证无法同时得到满足,最多满足两个。

 

如下图,CAP的三种特性只能同时满足两个。而且在不同的两两组合,也有一些成熟的分布式产品。

 

 

接下来,我们来介绍一下CAP的三种特性,我们采用一个应用场景来分析CAP中的每个特点的含义。

该场景整体分为5个流程:

流程一、客户端发送请求(如:添加订单、修改订单、删除订单)

流程二、Web业务层处理业务,并修改存储成数据信息

流程三、存储层内部Master与Backup的数据同步

流程四、Web业务层从存储层取出数据

流程五、Web业务层返回数据给客户端

 

 

 

 

(1) 一致性Consistency

一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致

 

一旦数据更新完成并成功返回客户端后,那么分布式系统中所有节点在同一时间的数据完全一致。

 

一致性是指写操作后的读操作可以读取到最新的数据状态,当数据分布在多个节点上,从任意结点读取到的数据都是最新的状态。

 

一致性实现目标:

Web业务层向主Master写数据库成功,从Backup读数据也成功。

 

 

Web业务层向主Master读数据库失败,从Backup读数据也失败。

 

 

必要实现流程:

写入主数据库后,在向从数据库同步期间要将从数据库锁定,待同步完成后再释放锁,以免在新数据写入成功后,向从数据库查询到旧的数据。

 

 

分布式一致性特点:

1.由于存在数据同步的过程,写操作的响应会有一定的延迟。

2.为了保证数据一致性会对资源暂时锁定,待数据同步完成释放锁定资源。

3.如果请求数据同步失败的结点则会返回错误信息,一定不会返回旧数据。

 

(2) 可用性(Availability)

可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间

 

 

对于可用性的衡量标准如下:

可用性分类

可用水平(%)

一年中可容忍停机时间

容错可用性

99.9999

<1 min

极高可用性

99.999

<5 min

具有故障自动恢复能力的可用性

99.99

<53 min

高可用性

99.9

<8.8h

商品可用性

99

<43.8 min

 

可用性实现目标:

1.当Master正在被更新,Backup数据库接收到数据查询的请求则立即能够响应数据查询结果

2.backup数据库不允许出现响应超时或响应错误。

 

 

必要实现流程:

1.写入Master主数据库后要将数据同步到从数据库。

2.由于要保证Backup从数据库的可用性,不可将Backup从数据库中的资源进行锁定。

3.即时数据还没有同步过来,从数据库也要返回要查询的数据,哪怕是旧数据/或者默认数据,但不能返回错误或响应超时。

 

 

分布式可用性特点:

所有请求都有响应,且不会出现响应超时或响应错误。

 

(3) 分区容错性(Partition tolerance)

分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供服务。

 

分布式系统中,尽管部分节点出现任何消息丢失或者故障,系统应继续运行。

 

通常分布式系统的各各结点部署在不同的子网,这就是网络分区,不可避免的会出现由于网络问题而导致结点之间通信失败,此时仍可对外提供服务。

 

分区容错性实现目标:

其一个结点挂掉不影响另一个结点对外提供服务。

 

 

必要实现流程:

1.尽量使用异步取代同步操作,例如使用异步方式将数据从主数据库同步到从数据,这样结点之间能有效的实现松耦合。

2.添加Backup从数据库结点,其中一个Backup从结点挂掉其它Backup从结点提供服务。

 

 

分区容错性特点:

分区容忍性分是布式系统具备的基本能力。


 
上一篇 为什么CAP不可兼得呢
下一篇 返回列表

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题