一致性协议

为了解决分布式系统中存在的一致性问题,提出了一些经典的一致性协议和算法。

其中著名的有:二阶段提交协议、三阶段提交协议和 Paxos 算法。

2PC 与 3PC

2PC

2pc(Two-Phase Commit),即二阶段提交,是为了分布式系统架构下所有节点在进行事物处理过程中能够保持原子性和一致性而设计的一种算法。

二阶段提交协议也被认为是一种一致性协议,用来保证分布式系统数据的一致性。

大部分的关系型数据库都是采用二阶段提交协议。

核心是先尝试后提交的处理方式;

阶段一:提交事务请求

  1. 事务询问

    1. 协调者向所有参与者广播事务内容,询问是否可以执行事务提交操作,之后开始等待参与者的响应;

  2. 执行事务

    1. 各参与者节点执行事务操作,并将 Undo 和 Redo 信息记入事务日志中;

  3. 各参与者向协调者反馈事务询问的响应

    1. 如果参与者成功执行事务操作,将反馈 Yes 给协调者,表示事务可以执行;如果没有成功执行,则反馈 No;

阶段二:执行事务提交

  1. 如果协调者收到的反馈都是 Yes,则执行事务提交:

    1. 发送提交请求

      1. 协调者向所有参与者节点发送 Commit 请求;

    2. 事务提交

      1. 参与者收到 Commit 请求后,执行事务提交操作,在完成提交后释放事务占用资源;

    3. 反馈事务提交

      1. 参与者完成事务提交后,向协调者发送 Ack 消息;

    4. 完成事务

      1. 协调者收到所有参与者 Ack 消息后,完成事务;

  2. 如果协调者收到一个 No,或等待超时后无法收到所有反馈,则执行中断事务:

    1. 发送回滚请求;

    2. 事务回滚;

      1. 参与者接收到 Rollback 请求后,利用阶段一中记录的 Undo 信息来执行事务回滚操作;

    3. 反馈事务回滚结果;

    4. 中断事务;

缺点

同步阻塞:二阶段提交的执行过程中,各参与者都在等待其他参与者响应过程;

单点问题:协调者出问题,整个流程无法运转;如果阶段二出现问题,那被锁定的事务无法释放;

数据不一致:

太过保守:二阶段提交协议没有完善的容错机制,任意一个节点失败都会导致整个事务失败;

3PC

3pc(Three-Phase Commit),即三阶段提交,是二阶段提交的改进版;

将二阶段提交协议的”提交事务请求“过程一分为二,形成了 CanCommit、PreCommit 和 do Commit 三个阶段组成的事物处理协议。

协调者和参与者都引入超时机制;

优缺点:

相较于二阶段提交协议,三阶段提交协议最大的优点就是降低了参与者的阻塞范围;

在第二接单,如果参与者等待超时,则中断事务;

在第三阶段,如果协调者出现问题,参与者会收不到 do-commit 或者 rollback,等待超时后,还是会继续 commit,相当于解决了阻塞问题,但无法避免数据不一致的问题;

ZAB 协议

Zookeeper 使用 Zookeeper Atomic Broadcast(ZAB,Zookeeper 原子消息广播协议)的协议作为其数据一致性的核心算法。

ZK 使用一个单一的主进程来保持集群中各副本之间数据的一致性;

将服务器数据的状态变更以事物 Proposal 的形式广播到所有的副本进程上去;

ZAB 协议包括两种基本模式:崩溃恢复 和 消息广播

ZXID

消息广播

示意图:

详细过程:

  1. Leader 服务器会为每个事物请求生成对应的 Proposal 来进行广播,并在广播之前为 Proposal 分配一个全局单调递增的唯一 ID(即 ZXID);

  2. Leader 服务器为每个 Follower 服务器各自分配一个单独的队列,将要广播的 Proposal 依次放入队列中,并根据 FIFO 策略进行消息发送;

  3. 每个 Follower 服务器在收到 Proposal 后,会先将其以事物日志的形式写入本地磁盘,写入成功后,给 Leader 返回 Ack;

  4. 当 Leader 收到超过半数 Follower 的 Ack 响应后,就会广播 Commit 消息给所有 Follower 服务器通知其开始事物提交;

存在问题:无法处理 Leader 服务器崩溃退出而带来的数据不一致问题,所以 ZAB 协议增加了 崩溃恢复 模式;

崩溃恢复

当服务框架在启动中或 Leader 服务器出现网络中断、崩溃、重启情况时,ZAB 协议就会进入恢复模式并选举新的 Leader;

  1. 选举 Leader

    1. ZAB 协议要确保已经在 Leader 服务器提交的事物最终被所有服务器都提交;

    2. ZAB 协议需要确保丢弃那些只在 Leader 服务器上被提出的事物;

  2. 完成 Leader 选举后

    1. 正常情况的数据同步

      1. Leader 服务器首先确认本地事物日志中的所有 Proposal 是否都已经被集群中过半的机器提交,即是否已完成数据同步;

      2. Leader 会为每一个 Follower 服务器准备一个队列,并将没有被各 Follower 服务器同步的事物以 Proposal 消息的形式,广播给 Follower 服务器;

      3. 并在 Proposal 消息之后,紧跟发送 Commit 消息,以表示该事物已经提交;

      4. 等 Follower 服务器将所有尚未同步的事物 Proposal 都从 Leader 服务器同步过来并应用到本地数据库后,Leader 会将 Follower 加入真正可用的 Follower 列表中;

    2. 处理需要被丢弃的事物 Proposal

      1. 在 ZAB 协议的事物编号 ZXID 设计中,ZXID 是一个 64 位的数字,低 32 位是简单单调递增计数器,每一个客户端请求 Leader 生成新事物 Proposal 对该计数器 +1;

      2. 高 32 位表示 Leader 周期 epoch 编号,每当选举产生一个新的 Leader 服务器,就会从这个 Leader 服务器上取出本地日志最大失误 Proposal 的 ZXID,并从 ZXID 中解析出对应的 epoch 值,并 +1,之后就以此编号作为新的 epoch,并将低 32 位,置 0 来开始新的 ZXID;

当过半机器与 Leader 完成状态同步后,ZAB 协议退出恢复模式;

Zookeeper 的 Leader 选举过程

集群启动时,Leader 选举

集群运行时,Leader 选举

参考

https://dbaplus.cn/news-141-1875-1.html

Zookeeper —— 一致性协议的更多相关文章

  1. ZooKeeper 一致性协议 ZAB 原理

    一致性协议有很多种,比如 Paxos,Raft,2PC,3PC等等,今天我们讲一种协议,ZAB 协议,该协议应该是所有一致性协议中生产环境中应用最多的了.为什么呢?因为他是为 Zookeeper 设计 ...

  2. Zookeeper一致性协议原理Zab

    ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法, ZAB(ZooKeeper Atomic Bro ...

  3. Zookeeper——一致性协议:Zab协议

    Reference: https://www.jianshu.com/p/2bceacd60b8a 什么是Zab协议 Zab 协议的作用 Zab 协议原理 Zab 协议核心 Zab 协议内容 原子广播 ...

  4. Zookeeper一致性协议——ZAB

    ZAB协议简介 Zookeeper通过ZAB保证分布式事务的最终一致性. ZAB全称Zookeeper Atomic Broadcast(ZAB,Zookeeper原子消息广播协议) ZAB是一种专门 ...

  5. Zookeeper——分布式一致性协议及Zookeeper Leader选举原理

    文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...

  6. Zookeeper的一致性协议:Zab(转)

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  7. Zookeeper的一致性协议:Zab

        Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况: ...

  8. 分布式一致性协议之:Zab(Zookeeper的分布式一致性算法)

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  9. zookeeper中的分布式一致性协议

    1. zookeeper中的一致性协议-ZAB协议 在深入了解ZK之前,相信很多同学都会认为ZK就是Paxos算法的一个实现.但事实上,ZK并没有完全采用Paxos算法,而是使用了一种称为ZooKee ...

随机推荐

  1. Redis自学笔记:4.1进阶-事务

    第4章:进阶 4.1事务 4.1.1概述 redis中的事务是一组命令的集合 事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行, 要么都不执行 事务的原理是先将一个事务的命令发送 ...

  2. node中的cluster模块开启进程,进程共享数据

    说明:共享数据 var collection = [41, 41, 41, 41] master.js console.log('###---start---###') var cluster = r ...

  3. NOIP考纲总结+NOIP考前经验谈

    首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 ...

  4. tcp协议下粘包问题的产生及解决方案

    1 tcp有粘包及udp无粘包 - TCP 是面向连接的,面向流的可靠协议:发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据, 合并成 ...

  5. HDU5518 : John's Fences

    求出平面图的对偶图,那么需要选择一些环,使得这些环可以异或出所有环. 对于两个不同的区域,需要用一个代价最小的环把它们区分开,这对应最小割. 那么求出对偶图的最小割树,所有树边之和就是把所有区域都区分 ...

  6. BZOJ4077 : [Wf2014]Messenger

    二分答案,让$A$推迟出发$mid$的时间. 对于每个相邻的时间区间,两个点都是做匀速直线运动. 以$A$为参照物,那么$A$不动,$B$作匀速直线运动. 若线段$B$到$A$的距离不超过$mid$, ...

  7. 3ds max 学习笔记(四)--创建物体

    添加物体: 1.初创建物体,从单视图进行创建,便于处于同一平面,在透视图观看效果.2.在基本对象处选择“长方体”:左键开始制作,松开左键此时控制的是长方形的高,然后点击左键完成:注:在max里点击右键 ...

  8. C_汉诺塔的故事(递归)

    汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...

  9. Vue(十二)vue实例的属性和方法

    vue实例的属性和方法 1. 属性 vm.$el vm.$data vm.$options vm.$refs <!DOCTYPE html> <html lang="en& ...

  10. python之文件处理

    第一:文件基本处理流程 f=open('text') one_line=f.readline() print('one_line:',one_line) #读取一行 print('分割线'.cente ...