比较zab、paxos和raft的算法的异同

2023-11-05

### Zab 与 Paxos

联系

(1)两者构建的系统都有一个 Leader 角色,Leader 进程负责协调多个 Follower 进程的运行(MultiPaxos不在此列)

(2)Leader 进程都会等待超过半数的 Follower 进程做出正确的反馈后,才会将一个提案进行提交(都是基于quorum 机制)

(3)在 Zab 协议中每个 Proposal 中都包含一个 epoch 值,用来代表当前的 Leader 周期;在 Paxos 算法中,同样存在这样一个标识(Ballot)

区别

(1)两者的初衷或者说设计目标不一样

Paxos 算法用于构建一个分布式的一致性状态机系统;

Zab 算法用于构建一个高可用的分布式数据主备系统。

(2)流程上有区别

Paxos 算法,选举出一个新的 Leader 进程需要进行两个阶段。

第一个阶段是读阶段,这个阶段中,这个新的主进程会通过和所有其他进程进行通信的方式收集上一个主进程提出的提案,并将它们提交。

第二个阶段是写阶段,这个阶段中,当前主进程 Leader 开始提出它自己的提案。

Zab 算法存在三个阶段:发现阶段、同步阶段、广播阶段,其中发现阶段等同于 Paxos 的读阶段,广播阶段等同于 Paxos 的写阶段。

同步阶段是 Zab 算法新添加的,在同步阶段,新的 Leader 会确保存在过半的 Follower 已经提交了之前 Leader 周期中的所有事务 Proposal。

同步阶段的引入,能够有效地保证 Leader 在新的周期提出事物 Proposal 之前,所有的进程都已经完成了对之前所有事务的提交。

### Zab 与 Raft

相同点

(1)都使用 timeout 来重新选择 leader

(2)采用 quorum 来确定整个系统的一致性(也就是对某一个值的认可),这个 quorum 一般实现是集群中半数以上的服务器,zookeeper 里还提供了带权重的 quorum 实现

(3)都由 leader 来发起写操作

(4)都采用心跳检测存活性

(5)zookeeper 的 zab 实现里选主要求选出来的主拥有 quorum 里最新的历史,而 raft 的 follower 的选主投票根据 term 的大小+日志完成度来选择投票给谁,这点上来看是比较类似的

(6)日志和状态机

Zab 和 Raft 都是同时存在 log(还有快照技术)和状态机(内存树)的存储结构。

日志是以 log 和快照的形式持久化到磁盘,保存的是数据写的完整过程,为重启加载历史数据提供了便利,避免了服务器宕机造成的数据丢失。

状态机(内存树)把数据加载到内存中,避免了查询操作时磁盘读取,读取的是数据的最终值,从而提升读取的性能。

不同点

(1)zab 用的是 epoch 和 count 的组合来唯一表示一个值, 而 raft 用的是 term 和 index

(2)raft 协议数据只有单向地从 leader 到 follower(成为 leader 的条件之一就是拥有最新的 log),而 zab 的 zookeeper 实现中 ,一个 prospective leader 需要将自己的 log 更新为 quorum 里面最新的 log,然后才好在 synchronization 阶段将 quorum 里的其他机器的 log 都同步到一致

(3)请求的处理方式不同

ZK 集群中的 client 和任意一个 Node 建立 TCP 的长连接,完成所有的交互动作,而 Raft 第一次随机的获取到一个节点,然后找到 Leader 后,后续直接和 leader 交互(存疑)

ZK 中的读请求,直接由连接的 Node 处理,不需要和 leader 汇报,也就是 Consul 中的 stale 模式。这种模式可能导致读取到的数据是过时的,但是可以保证一定是半数节点之前确认过的数据。

为了避免 Follower 的数据过时,ZK 有 sync()方法,可以保证读取到最新的数据。可以调用 sync()之后,再查询,确保所有的数据一致后再返回结果。

角色 ZK 引入了 Observer 的角色来提升性能,既可以大幅提升读取的性能,也可以不影响写的速度和选举的速度,同时一定程度上增加了容错的能力。

(4)选主投票的区别

ZK 集群之间投票消息是单向、网状的,类似于广播,比如 A 广播 A 投票给自己,广播出去,然后 B 接收到 A 的这个消息之后,会 PK A 的数据,如果 B 更适合当 leader(数据更新或者 myid 更大),B 会归档 A 的这个投票,但是不会更新自己的数据,也不会广播任何消息。除非发现 A 的数据比 B 当前存储的数据更适合当 leader,就更新自己的数据,且广播自己的最新的投票消息。

而 Raft 集群之间的所有消息都是双向的,发起一个 RPC,会有个回复结果。比如 A 向 B 发起投票,B 要么反馈投票成功,要么反馈投票不成功。

ZK 集群中,一个节点在一个 epoch 下是可以发起多次投票的,当节点发现有比之前更新的数据更适合的 leader 时,就会广播自己的最新投票消息,结合 recvset 这个 Set 的结构,来更新某个节点最新的投票结果。而 Raft 的 follower 在一个 term 里只能投票一次。

ZK 集群中,因为引入了 myid 的概念,系统倾向让数据最新和 myid 最大的节点当 leader。所以即使有半数节点都投票给同一个 Node 当 leader,这个 Node 也不一定能成为 leader,需要等待 200ms,看是不是有更适合的 leader 产生。但是在 Raft 系统中,只要某个 candidate 发现自己投票过半了,就一定能成为 leader。

ZK 集群中,每一轮的选举一定会选出一个 leader,因为每个节点允许多次投票,而且会广播自己的最新投票结果。而 Raft 系统可能涉及选票瓜分,需要重新发起一轮选举才能选出 leader,是通过选举超时时间的随机来降低选票瓜分的概率。所以 ZK 的选举理论上一般需要花费更多的时间,但是只需要一轮。Raft 每一轮选举的时间是大致固定的,但是不一定一轮就能选出 leader。

ZK 集群中,成为公认的 leader 条件更苛刻,raft 模式下,只要新 leader 发一个命令为空的 Log 出来,大家就会认同这个节点为 leader,但是在 ZK 集群中,追随 leader 的 2 种条件都很苛刻:

要么 recvset 中半数节点的选举 following 投票给 A,才会认可 A 为自己的 leader

要么 outofelection 中半数节点都认可 A 为 leader,自己才会认可 A 为自己的 leader

(5)事务操作的区别

Raft 系统中的事务消息是通过双向的 RPC 来完成的,而 Zab 中,则是单向的,一来一回两个消息来完成的。明显 Zab 的性能更好,不需要浪费 leader 一个线程去等待 follower 完成业务操作。

Zab 中 leader 发送一个 Proposal 消息给 follower,发送完成。当 follower 完成 proposal 过程时,再发送一个消息 ACK 到 leader,发送完成。leader 统计 ACK 数量过半时,触发广播 commit。

(6)操作流程当中,Zab 的即时性做的更好

Raft 的集群模式下:Leader 创建日志,广播日志,半数节点复制成功后,自己 commit 日志,运用到状态机中,反馈客户端,并且在下一个心跳包中,通知小弟们 commit。

Zab 的集群模式下:leader 创建 Proposal,广播之后,半数节点复制成功后,广播 commit。同时自己也 commit,commit 完之后再运用到内存树,反馈客户端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较zab、paxos和raft的算法的异同 的相关文章

随机推荐

  • @Autowired的实现原理

    1 了解 Autowired 在这之前你得了解SpringIOC容器的相关知识 含义 Autowired表示某个属性是否需要进行依赖注入 可以写在属性和方法上 注解中的required属性默认为ture 表示如果没有对象注入给属性则抛出异常
  • linux中kvm配置文件,如何在linux中通过kvm安装虚拟机

    8种机械键盘轴体对比 本人程序员 要买一个写代码的键盘 请问红轴和茶轴怎么选 在centOS中通过kvm安装虚拟机 环境搭建 虚拟机安装 按照常规步骤安装即可 唯一需要注意的点是需要在cpu选项处 将虚拟化选项全部打开 查看配置 查看硬件是
  • Android指纹识别深入浅出分析到实战(6.0以下系统适配方案)

    指纹识别这个名词听起来并不陌生 但是实际开发过程中用得并不多 Google从Android6 0 api23 开始才提供标准指纹识别支持 并对外提供指纹识别相关的接口 本文除了能适配6 0及以上系统 主要还提供6 0以下设备适配解决方案 指
  • 如何使android应用开机时自动启动,如何使APP开机自启动

    方案一 将app做成系统应用 直接安装在 system app 目录下 具体步骤为 1 在AndroidManifest文件中 添加 android sharedUserId android uid system 例如 image png
  • 万字长文详述ClickHouse在京喜达实时数据的探索与实践

    1 前言 京喜达技术部在社区团购场景下采用JDQ Flink Elasticsearch架构来打造实时数据报表 随着业务的发展 Elasticsearch开始暴露出一些弊端 不适合大批量的数据查询 高频次深度分页导出导致ES宕机 不能精确去
  • 利用555定时器的双电源电路原理

    参考电工天下电路原理图 致敬 555单电源变双电源电路 以下是电路图 时基电路555接成无稳态电路 3脚输出频率为20KHz 占空比为1 1的方波 3脚为高电平时 C4被充电 低电平时 C3被充电 由于VD1 VD2的存在 C3 C4在电路
  • Android/Linux EAS优化-schedtune

    Linux cgroups机制中的cpu cpuset schedtune子系统 跟linux android进程调度策略有关 记录下各项功能参数的用法 SchedTune SchedTune是一项与CPU调频相关的性能提升技术 它实现为一
  • matlab如何保存csv文件,Matlab:将输出写入csv文件

    我有一些数据 包括我想将它们存储在csv文件中的字符串和数字 作为函数输出的数字存储在1x20的数组中 所以在csv文件中 我希望有21列 因此 csv文件中的第一列应该是字符串 接下来的20列具有1x20数组中的信息 我怎么能这样做 我使
  • 使用InitializingBean实现策略模式

    1 创建SpringBoot项目 2 创建抽象类AbstractThreeHandler public abstract class AbstractThreeHandler implements InitializingBean Auto
  • 静态功耗与动态功耗

    文章目录 0 功耗源 1 动态功耗 1 1 翻转功耗 1 2 短路功耗 2 静态功耗 2 1 亚阈值泄漏电流 2 2 栅泄漏电流 2 3 结泄漏电流 2 4 竞争电流 2 5 降低静态功耗办法 0 功耗源 功耗的本质是能量耗散 由能量守恒定
  • 变电站仪器仪表检测图像数据集

    数据集中 总共包含8307张图像及对应的VOC格式标签 数据集下载链接 https download csdn net download ncusz 85003005
  • 清华镜像网站

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • 浅谈UML中常用的几种图——鲁棒图

    什么是鲁棒图 鲁棒图包含 3 种元素 如图 8 2 所示 它们分别是边界对象 控制对象 实体对象 边界对象对模拟外部环境和未来系统之间的交互进行建模 边界对象负责接收外部输入 处理内部内容的解释 并表达或传递相应的结果 控制对象对行为进行封
  • Hive的概念及基本语法

    HIVE是什么 HIVE是一个可以将sql翻译为MR程序的工具 HIVE支持用户将HDFS上的文件映射为表结构 然后用户就可以输入SQL对这些表 HDFS上的文件 进行查询分析 HIVE将用户定义的库 表结构等信息存储hive的元数据库中
  • 移动端的屏幕分辨率与浏览器的视口宽度(视口大小)是两回事儿

    问 在移动端的Web设计中 屏幕的分辨率和视口大小是不是是两回事儿 答 是的 屏幕的分辨率和视口大小在移动端的Web设计中是两个不同的概念 屏幕分辨率 Screen Resolution 这指的是移动设备屏幕上的像素数量 通常以水平像素数和
  • linux替换文件内容 awk,Linux awk替换文本字符串内容

    awk是功能强大的文本分析工具 与grep搜索和sed编辑相比 awk在分析数据和生成报告时特别强大 简而言之 awk逐行读取文件 将每一行切成空格作为默认分隔符 然后对剪切的部分执行各种分析处理 awk pattern action fi
  • Python 自动刷新网页

    有些时候刚建的网站 要求达到一定量的浏览量 这个时候你写个小代码就能轻松搞定了 废话不多说直接看下面代码 import time from selenium import webdriver 需pip install selenium de
  • Google类库之一的guava

    1 参考教程 http ifeve com google guava
  • 项目中的通用查询参数类,它体现了项目架构的大局观

  • 比较zab、paxos和raft的算法的异同

    Zab 与 Paxos 联系 1 两者构建的系统都有一个 Leader 角色 Leader 进程负责协调多个 Follower 进程的运行 MultiPaxos不在此列 2 Leader 进程都会等待超过半数的 Follower 进程做出正