分布式CAP理论

125 阅读5分钟

主要概念

CAP理论在分布式架构中起着非常重要的角色。CAP是三个单词的首字母组成,分别是Consistency,Availability,Partion。

  1. Consistency - 一致性:即所有的节点在同一时间具有相同的数据;

  2. Availability - 可用性:即每一个请求不管成功还是失败,都有响应, 保证服务是可用的;

  3. Partion tolerance - 分区容错性:即系统中任意信息的丢失或容错性者失败不会影响系统的继续使用。

    在实际的使用中,CAP理论不可能同时满足,只能满足其中两个。假设希望我们的微服务具备分区容错性,需要在可用性和一致性做出取舍,如果一个接口在接收到一个超时的请求的时候,如果节点不可用,那么我们有两种方案进行处理,一个是返回错误,选择一致性牺牲可用性,另外一个是返回成功,选择可用性,牺牲一致性,客户端长时间等待会导致改请求被抛弃,因此时间是一个重要的考虑因素,那么我们的服务节点必须要在两种方案中做出选择。

第一种方案CP (考虑一致性和分区容错性)

比如实现一个分布式存储系统,并且要求数据是强一致的,以mysql 关系型数据库为例,一个master节点同时存在多个备份节点,而master节点是作为数据写入的节点,如果想要获取最新的数据,那么必须要从master节点读取,如果master节点出现故障,那么系统就不再可用。当然处理的方式可以把备份节点中选择一个按照一定的规则升级master节点,切换成功之后,服务恢复可用。

1.jpg

image.png

image.png

第二种方案 AP 可用性优先

和上面的例子一样,假设有3个节点,当1个节点为写入节点,则另外2个节点作为备份节点,当数据写入其中1个节点之后,同时把数据同步到另外2个节点上,当我们从任意1个节点中读取数据的时候,则会存在两种情况,一种是当前的数据的是最新的(具备一致性),另外一种情况是当前的数据不是最新的(不具备一致性),但是当数据同步完成之后,最终也是具备一致性的。3个节点中,任何一个节点出了问题,还可以向其他另外的2个节点写数据或者读数据,所以系统具备分区容错性和高可用性。

image.png

在实际项目中,可以根据自己的业务需要,牺牲可用性,保证强一致性,即选择CP,还是牺牲一致性(短暂时间范围内的),但保证数据的最终一致性,即选择AP,但是最终数据的一致性是要保证的。

一致性协议

关于分布式事物的相关处理,Open Group (国际开放标准组织)定义了DTP模型,模型中定义4种角色,分别是Application,Transaction Manager(TM),Resource Manager(RM),Communication Resource Managers.

两阶段提交协议-2PC

两阶段提交协议即把分布式事物分成2个阶段进行提交:第一阶段为准备阶段,第二阶段为提交阶段;两个阶段都是有 TM-事物管理器发起,RM-资源管理器执行。

准备阶段-PreCommit

TM向RM发起指令,RM评估自己的状态,如果可以完成TM发出的指令,则会写redo或undo日志,然后锁定资源,执行指令,但是不会马上提交。

提交阶段-DoCommit

如果RM确定返回上一步准备的状态为成功,TM则向RM发出提交指令,RM提交资源变更的事物,释放上一步锁定的资源;如果任意一个RM返回上一步准备的状态为失败,TM则向RM发出终止指令,RM则取消已经变更的事物,执行undo 日志,释放锁定资源,即资源回滚。 总结:2pc的有点就是原理简单,实现方便;缺点是同步阻塞,带点故障,脑裂(发出的指令有些RM收到,有些收不到)等,为了改进对应的不足,提出了3阶段提交,主要是解决阻塞问题,把准备阶段拆分成询问阶段+准备阶段。

image.png

image.png

三阶段提交-3PC

询问阶段-CanCommit

TM询问RM是否可以完成指令,RM响应Y 或者 N

准备阶段-PreCommit

如果RM在上一阶段的响应都是Y,则TM向RM发出预执行指令,RM开始写undo log和redo log,但不提交,响应准备Y,如有问题响应N;如果只要有一个RM响应N,TM就发出终止指令,退出所有操作;

提交阶段-DoCommit

如果上一阶段RM响应的都是Y,则TM向RM发出提交指令,RM变更事物,释放锁定的资源;如果任何一个RM响应准备N,则TM就发出终止指令,则RM取消变更事物,执行undo log,释放锁定资源。 总结:3PC有点就是降低了RM阻塞,并且能在单点故障中保持一致;缺点阶段过程,在网络分区的情况下,出现网络连接超时时,数据会出现不一致,但是不会出现资源永远锁定得不到释放。

image.png

在分布式系统协议中,一致性协议算法主要有的算法有Paxos,Raft,ZAB(Zookper Atomic Broadcast)等。