当前位置: 首页 > ds >正文

ZAB 和 RAFT分别是什么?它们的区别是什么?

ZAB(ZooKeeper Atomic Broadcast)和 Raft 是两种广泛使用的分布式一致性协议,均用于解决分布式系统中的数据一致性与领导者选举问题。尽管目标相似,但它们在设计理念、实现机制和适用场景上存在显著差异。以下是它们的核心概念及区别:


1. ZAB(ZooKeeper Atomic Broadcast)

定义与设计目标
  • 目的:为 ZooKeeper 设计的原子广播协议,专注于高吞吐量的顺序一致性,确保所有事务按全局顺序被所有节点接收。
  • 核心功能
    • Leader 选举:快速选出唯一 Leader。
    • 原子广播:保证事务消息的全局有序广播。
关键机制
  1. 崩溃恢复模式(Recovery Phase)
    • 新 Leader 选举后,通过同步所有 Follower 的事务日志(ZXID)恢复一致性。
  2. 消息广播模式(Broadcast Phase)
    • Leader 按 ZXID 顺序广播事务,Follower 按顺序提交。
  3. 两阶段提交
    • Proposal:Leader 发送事务提议。
    • Commit:收到半数以上 ACK 后提交事务。
适用场景
  • 协调服务:如 ZooKeeper 的配置管理、分布式锁、命名服务。
  • 高吞吐场景:需要严格顺序一致性的消息广播。

2. Raft

定义与设计目标
  • 目的:简化 Paxos 的共识算法,强调可理解性和易实现性,适用于通用分布式系统。
  • 核心功能
    • Leader 选举:通过随机超时避免选举冲突。
    • 日志复制:确保所有节点的日志最终一致。
    • 安全性:保证已提交的日志不可被覆盖。
关键机制
  1. 角色划分
    • Leader:处理客户端请求,管理日志复制。
    • Follower:被动接收 Leader 的日志。
    • Candidate:参与 Leader 选举的临时角色。
  2. 任期(Term)
    • 全局递增的任期号,解决旧 Leader 的脑裂问题。
  3. 日志复制
    • Leader 将日志条目广播给 Follower,收到多数派确认后提交。
适用场景
  • 通用分布式系统:如 etcd、Consul 的键值存储。
  • 强调易实现性:适合需要快速开发共识模块的场景。

3. ZAB vs Raft 的核心区别

特性ZABRaft
设计目标高效有序广播(ZooKeeper 专用)通用共识算法(易理解、易实现)
协议阶段两阶段:崩溃恢复 + 消息广播单协议:Leader 选举 + 日志复制
选举机制基于 ZXID 和 SID 的优先级投票基于任期(Term)和随机超时的多数派投票
日志提交顺序严格全局顺序(ZXID 保证)按任期和日志索引顺序
成员变更依赖外部工具(如 ZooKeeper 动态配置)内置成员变更协议(Joint Consensus)
客户端交互写请求仅由 Leader 处理读请求可由 Leader 或 Follower 处理
性能优化批量事务处理(高吞吐)简单日志复制(低延迟)
实现复杂度较高(与 ZooKeeper 深度耦合)较低(模块化设计)

4. 典型应用对比

系统协议场景
ZooKeeperZAB分布式协调服务(配置中心、分布式锁)
etcdRaft键值存储(Kubernetes 元数据管理)
ConsulRaft服务发现与健康检查

5. 选择建议

  • 选择 ZAB
    • 需要严格的全局顺序广播(如 ZooKeeper 的顺序一致性)。
    • 已有 ZooKeeper 生态依赖。
  • 选择 Raft
    • 需要快速实现一个通用的共识模块。
    • 系统设计强调可读性和模块化(如 etcd、TiDB)。

🐮👵

  • ZAB 是 ZooKeeper 的“定制化高速公路”,专注于高效有序的事务广播,适合协调服务。
  • Raft 是“通用铁路网”,简化了共识逻辑,适合需要快速开发且对顺序一致性要求不苛刻的场景。
    两者均是 CAP 定理中 CP 模型的经典实现,选择时需结合系统目标、开发成本与性能需求。

你想要的我全都有:https://pan.q删掉憨子uark.cn/s/75a5a07b45a2

在这里插入图片描述

http://www.xdnf.cn/news/9461.html

相关文章:

  • STM32之FreeRTOS移植(重点)
  • 一次消谐器更换操作流程及注意事项
  • 7系fpga带microblaze做固件及固化
  • leetcode501.二叉搜索树中的众数:迭代中序遍历的众数追踪与数组动态更新
  • 重磅发布 | 复旦533页《大规模语言模型:从理论到实践(第2版)》(免费下载)
  • spring Data JPA详细介绍。
  • 3.20 工程计价数字化与智能化
  • PyTorch 2.1新特性:TorchDynamo如何实现30%训练加速(原理+自定义编译器开发)
  • Spring Ai | 从零带你一起走进AI项目(中英)
  • PXC集群
  • C++数据结构 : 二叉搜索树
  • Java大师成长计划之第32天:使用Kubernetes进行Java应用编排与管理
  • Python页面纸张大小设置
  • 为什么苹果签名会掉签
  • 语音合成之十七 语音合成(TTS)中文自然度:问题、成因、解决方案
  • C++ 初始化大全
  • JavaScript变量宣言三剑客:var、let、const的奇幻冒险
  • 覆盖索引详解:原理、优势与面试要点
  • 循环神经网络(RNN):原理、架构与实战
  • 第1章 计算机系统知识
  • 32. 自动化测试开发之建立mysql和oracle数据库连接池
  • 训练自己的yolo模型,并部署到rk3588上
  • 微元法求解弧长与侧面积
  • 哪些情况索引会失效?
  • ubuntu 24 下使用pip 时碰到Externally Managed Environment Error的解决办法
  • Oracle迁移到瀚高之后,空值问题处理(APP)
  • 数据库相关问题
  • 什么是车间 6S 管理,如何实现人、事、物有序可控
  • [yolov11改进系列]基于yolov11引入全维度动态卷积ODConv的python源码+训练源码
  • QML常用窗口和菜单