主要概念
CAP理论在分布式架构中起着非常重要的角色。CAP是三个单词的首字母组成,分别是Consistency,Availability,Partion。
-
Consistency - 一致性:即所有的节点在同一时间具有相同的数据;
-
Availability - 可用性:即每一个请求不管成功还是失败,都有响应, 保证服务是可用的;
-
Partion tolerance - 分区容错性:即系统中任意信息的丢失或容错性者失败不会影响系统的继续使用。
在实际的使用中,CAP理论不可能同时满足,只能满足其中两个。假设希望我们的微服务具备分区容错性,需要在可用性和一致性做出取舍,如果一个接口在接收到一个超时的请求的时候,如果节点不可用,那么我们有两种方案进行处理,一个是返回错误,选择一致性牺牲可用性,另外一个是返回成功,选择可用性,牺牲一致性,客户端长时间等待会导致改请求被抛弃,因此时间是一个重要的考虑因素,那么我们的服务节点必须要在两种方案中做出选择。
第一种方案CP (考虑一致性和分区容错性)
比如实现一个分布式存储系统,并且要求数据是强一致的,以mysql 关系型数据库为例,一个master节点同时存在多个备份节点,而master节点是作为数据写入的节点,如果想要获取最新的数据,那么必须要从master节点读取,如果master节点出现故障,那么系统就不再可用。当然处理的方式可以把备份节点中选择一个按照一定的规则升级master节点,切换成功之后,服务恢复可用。
第二种方案 AP 可用性优先
和上面的例子一样,假设有3个节点,当1个节点为写入节点,则另外2个节点作为备份节点,当数据写入其中1个节点之后,同时把数据同步到另外2个节点上,当我们从任意1个节点中读取数据的时候,则会存在两种情况,一种是当前的数据的是最新的(具备一致性),另外一种情况是当前的数据不是最新的(不具备一致性),但是当数据同步完成之后,最终也是具备一致性的。3个节点中,任何一个节点出了问题,还可以向其他另外的2个节点写数据或者读数据,所以系统具备分区容错性和高可用性。
在实际项目中,可以根据自己的业务需要,牺牲可用性,保证强一致性,即选择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阶段提交,主要是解决阻塞问题,把准备阶段拆分成询问阶段+准备阶段。
三阶段提交-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阻塞,并且能在单点故障中保持一致;缺点阶段过程,在网络分区的情况下,出现网络连接超时时,数据会出现不一致,但是不会出现资源永远锁定得不到释放。
在分布式系统协议中,一致性协议算法主要有的算法有Paxos,Raft,ZAB(Zookper Atomic Broadcast)等。