十分钟搞定分布式一致性算法( 三 )

  • 4.完成事务协调者收到所有参与者返回的ack消息,完成事务
  • 情况2.中断事务
  • 1.发送回滚请求协调者向参与者发起rollback请求
  • 2.事务回滚参与者收到rollback请求后,利用undo信息执行事务回滚操作,完成之后释放资源
  • 3.反馈事务回滚结果参与者完成事务之后,向协调者发送ack
  • 4.中断事务协调者接收到所有参与者反馈的ack,完成事务中断
  • 二阶段提交的问题
    • 1.性能问题从流程上看,在执行过程中节点都处于阻塞状态 。各个操作数据库的节点都占用数据库资源,只有当所有节点准备完毕后,事务协调者才会通知进行全局commit/rollback,参与者进行本地事务commit/rollback之后才会释放资源,对性能影响较大
    • 2.单点故障问题事务协调者是整个分布式事务的核心,一旦事务协调者出现故障,会导致参与者收不到commit/rollback的通知,从而导致参与者节点一直处于事务无法完成的中间状态
    • 3.数据不一致在第二阶段的时候,如果发生局部网络问题,一部分事务参与者收不到commit/rollback消息,就会导致节点间数据不一致
    • 4.太多保守必须 收到所有参与的正反馈才提交事务如果有任意一个事务参与者的响应没有收到,则整个事务失败回滚
  • 3pc
    基于2pc出现的一些问题,3pc进行了改进,也就是三阶段提交,将2pc的第二个阶段进行了一分为二,形成了CanCommit(提交询问)、Precommit(预提交)、doCommit阶段(最终提交)三个阶段;其实3pc和2pc的不同点在于3pc增加了超时机制 。

    十分钟搞定分布式一致性算法

    文章插图
     
    • 阶段1:CanCommit(提交询问)协调者向所有参与者发送一个请求,询问是否可以执行事务提交操作,然后开始等待所有响应者的响应正常情况下,所有参与者会反馈yes,然后进入预备状态,否则反馈No
      • 2.各参与者向协调者反馈事务询问的响应
      • 1.事务询问
    • 阶段2:PreCommit(预提交)
      • 情况1:执行事务预提交(即所有参与者都响应yes)
      • 1.发起预提交请求协调者向所有参与者发出preCommit请求,并进入准备阶段
      • 2.事务预提交参与者接收到preCommit请求后,执行事务操作,然后将undo和redo信息记录到事务日志中
      • 3.各参与者向协调者反馈事务执行的响应
      • 情况2:中断事务(任何一个参与者反馈no或者超时就会中断事务)
      • 1.发送中断请求
      • 2.中断事务
    • 阶段3:doCommit(最终提交)
      • 情况1:执行提交
      • 1.发送提交请求
      • 2.事务提交
      • 3.反馈事务提交结果
      • 4.完成事务
      • 情况2:中断事务
      • 1.发送中断请求
      • 2.事务回滚
      • 3.反馈事务回滚结果
      • 4.中断事务
    • 3pc特点
      • 1.降低了参与者阻塞范围,增加了超时自动处理的机制
      • 2.能够在出现单点故障后继续保持一致
      • 3.网络分区会出现不一致的问题即参与者接收到了preCommit消息后,出现了网络分区,即协调者和参与者无法进行正常通信,这个时候该参与者依然会进行事务的提交,就会出现数据不一致的情况
    Paxos
    Paxos算法要解决的问题就是如何保证数据一致性,这是一种基于消息传递且具有高度容错特的一致性算法
    首先要引入拜占庭问题
    拜占庭问题:即不同军队的将军之间必须制定一个统一的行动计划,但是在地理上都是分隔开来的,只能依靠通讯员进行通信,但是通讯员可能会存在叛徒,对消息进行篡改,从而欺骗将军 。
    这种消息篡改的情况在同一个局域网内几乎不会出现,或者简单通过校验算法进行避免 。但是在实际工程实践中,可以假设不存在拜占庭问题,基于这种假设如何保证一致性呢?这个时候又引入Paxos的故事
    古希腊有一个Paxos小岛,岛上采用会议的形式来通过法令,议会上的议员通过信使来传递消息,注意信使和议员都是兼职的,有可能随时会离开议会,而且信使有可能会重复传递消息,也有可能一去不返 。那么在这种情况下议会协议也要保证法令能够正确选举出来,而且不会产生冲突 。
    根据这个故事也就衍生出了Paxos算法,该算法有3个角色:
    1.Proposer(提议者,用来发起提案的,相当于zk中的leader角色)
    2.Acceptor(接受者,可以接受或拒绝提案,相当于zk中的follower角色)
    3.Learner(学习者,学习被选定的提案,相当于zk中的observer角色)
    注意这里讲解的是Basic Paxos,基于Baisc Paxos演化出了Multi Paxos,这里不做过多讲解,有兴趣的同学可自行查阅


    推荐阅读