分布式事务

简单总结下分布式事务相关二段式、三段式提交以及Paxos算法。

分布式系统的一致性

在分布式领域中,任何一个分布式系统都无法同时满足一致性可用性容错性(也就是CAP理论)。

一般来说系统权衡的结果是达到系统的最终一致,而非强一致性。

分布式系统中数据不一致的问题?

为了提高系统的整体性能,往往采用多机进行分布式部署,为了达到数据的同步必然存在着数据复制。但是数据复制在不同的数据节点之间由于网络等异常原因很容易造成数据不一致的情况。

一致性模型

一致性模型可以分为三种:

  • 强一致性:当更新操作完成后,任何后续操作访问的结果都是最新更新的值;
  • 弱一致性:当更新操作完成后,系统不保证后续操作访问的结构都一致,但会尽可能保证在某个时间点可以让数据达到一致;
  • 最终一致性:可以保证最终数据会达到一致。

二段式提交

二段式提交协议主要保证分布式事务的原子性(保证所有节点的操作一致),为了达到操作的一致引入了一个协调者来掌管所有节点。

二段式提交可以分为两个阶段:准备阶段提交阶段

准备阶段:是一个投票的过程,步骤如下,

  • 协调者向所有节点询问是否提交操作,等带所有参与节点响应;
  • 参与者执行询问发起为止的所有事务操作(已经执行了事务),并把是否执行信息写入日志;
  • 各个参与者向协调者回复询问结果(如果执行成功返回同意,否则返回终止)。

提交阶段:是一个确认的过程,步骤如下,

  • 协调者接收到参与者的询问结果,如果包含终止结果,则需要对所有参与者发送回滚操作,否则向所有参与者发送提交命令;
  • 参与者接受者接收到完成操作,释放整个事务期间占用的资源;
  • 协调者接受到所有参与者完成操作,完成事务。

缺点?

  • 同步阻塞:所有参与者都是事务阻塞型的,当参与者占用公共资源时,其他节点在访问该公共资源的时候不得不阻塞等待。
  • 单点故障:协调者管理所有参与节点,如果协调者异常,参与者都会一直阻塞下去。
  • 数据不一致:对于提交阶段,如果协调者和参与者出现网络问题,参与者无法正常完成事务。

三段式提交

三段式提交是二段式提交的改进版,主要不同在于:

  • 引入超时机制(协调者和参与者)
  • 增加了一个询问阶段(但不会执行)

三个阶段:

  • can commit:协调者询问参与者是否可以执行事务(投票)
  • pre commit:执行事务,并返回执行结果
  • do commit:提交事务,完成

为了避免阻塞,在提交阶段,如果协调者没有接收到参与者的回应,会执行终止事务,另外,如果参与者一直没有接收到协调者的操作命令,那么就会直接提交事务,但是这并不会避免数据不一致的问题。

Paxos算法

http://www.csdn.net/article/2014-01-20/2818197-distributed-system/2