在设计一个分布式项目的时候会遇到三个特性:一致性(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从结点提供服务。
分区容错性特点:
分区容忍性分是布式系统具备的基本能力。