分布式事务

通过这两天对于分布式事务的学习,结合网上的资料,感觉这部分的知识在博客中全都大同小异,无非就是两阶段提交(2PC)、补偿事务(TCC)、MQ 事务消息这三种模式,并没有一种是很完美解决这个问题的,也没有一个对应的规范来告诉我们,分布式事务究竟要如何完美的处理。通过继续的查找资料能够看出来,这种规范和方式不是没有,而是每个大公司都有一套自己的方案来实现,并且不对外公开。但我感觉不论如何变化,如何实现,都是基于业务的,有些业务可以放弃可用性但要保证绝对的数据一致,但有些业务可以容忍数据的少量不一致,但要保证性能。总之既然暂时找不到也接触不到好的方法,就先从上述三种方式来理解,变化的话也不会变化太大。

集群和分布式的区别

对比之前Weblogic服务器集群的配置,通俗易懂的说:一个业务拆分成多个子业务,部署在不同的服务器上,是分布式。同一个业务,部署在多个服务器上,是集群。也就是说集群是解决高可用的,而分布式是解决高性能、高并发的。

CAP定理

首先是CAP原则,又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
  • 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

BASE理论

在分布式系统中,我们往往追求的是可用性,它的重要程序比一致性要高,那么如何实现高可用性呢?BASE理论就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。

  • Basically Available(基本可用)
  • Soft state(软状态)
  • Eventually consistent(最终一致性)

BASE理论是对CAP中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

两阶段提交(2PC)

二阶段提交(Two-phase Commit)是指,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。通常,二阶段提交也被称为是一种协议(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

二阶段提交算法的成立基于以下假设:
  1. 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Cohorts)。且节点之间可以进行网络通信。
  2. 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。
  3. 所有节点不会永久性损坏,即使损坏后仍然可以恢复。
基本算法

第一阶段(提交请求阶段)

  1. 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
  2. 参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。
  3. 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个"同意"消息;如果参与者节点的事务操作实际执行失败,则它返回一个"中止"消息。

有时候,第一阶段也被称作投票阶段,即各参与者投票是否要继续接下来的提交操作。

第二阶段(提交执行阶段)

成功】当协调者节点从所有参与者节点获得的相应消息都为"同意"时:

  1. 协调者节点向所有参与者节点发出"正式提交"的请求。
  2. 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送"完成"消息。
  4. 协调者节点收到所有参与者节点反馈的"完成"消息后,完成事务。

失败】如果任一参与者节点在第一阶段返回的响应消息为"终止",或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:

  1. 协调者节点向所有参与者节点发出"回滚操作"的请求。
  2. 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送"回滚完成"消息。
  4. 协调者节点收到所有参与者节点反馈的"回滚完成"消息后,取消事务。
缺点

二阶段提交算法的最大缺点就在于它的执行过程中间,节点都处于阻塞状态。即节点之间在等待对方的相应消息时,它将什么也做不了。特别是,当一个节点在已经占有了某项资源的情况下,为了等待其他节点的响应消息而陷入阻塞状态时,当第三个节点尝试访问该节点占有的资源时,这个节点也将连带陷入阻塞状态。
另外,协调者节点指示参与者节点进行提交等操作时,如有参与者节点出现了崩溃等情况而导致协调者始终无法获取所有参与者的响应信息,这时协调者将只能依赖协调者自身的超时机制来生效。但往往超时机制生效时,协调者都会指示参与者进行回滚操作。这样的策略显得比较保守。

三阶段提交(3PC)

...

补偿事务(TCC)

...

MQ 事务消息

... 增加近日对 ActiveMQ 的学习总结

这些还都只是大致的了解,感觉也不是什么好的解决办法,之后会查一查谷歌,看看有没有什么好的方法,或对于上面的三种方法好的讲解。
最近在某篇文章上看到分布式事务的唯一一种解决方案便是Paxos算法,上述的所有方法都是Paxos算法的不完整版,而这个算法极其难以理解,Zookeeper的出现,就是为了简化这些难以理解的操作。
下一周决定将上面的算法补全,其中事务消息模式增加最近对MQ的学习,整理Paxos算法以及Zookeeper对于分布式事务的具体作用。
总的来看,分布式事务并不是不能实现,只不过需要借助Zookeeper来实现。

你可能感兴趣的:(分布式事务)