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

分布式专题——19 Zookeeper分布式一致性协议ZAB源码剖析 - 指南

1 ZAB 协议

  • Zookeeper Atomic Broadcast(Zookeeper 原子广播协议):

    • ZAB 是 Paxos 算法的简化实现,并非直接采用 Paxos 来解决分布式一致性
    • 专门为分布式协调服务 Zookeeper 设计,支持崩溃恢复原子广播这两个关键能力,Zookeeper 正是基于该协议实现功能;
  • 基于 ZAB 协议,Zookeeper 采用**主备模式(Leader-Follower 模式)**的系统架构,以此保持集群中各个副本之间的数据一致性;

    在这里插入图片描述

    • 客户端所有写入素材的处理,都先发送到Leader 节点

    • 接着由 Leader 负责将资料复制到Follower 节点,从而保证集群内数据的一致性;

      • 数据复制过程(类似两阶段提交 2PC,但有优化);
      • ZAB 协议在数据复制时,只需要Follower(包含 Leader 自己的 ack)有一半以上返回 Ack 信息,就可以执行提交操作;
    • 这种优化大大减小了同步阻塞,同时也提高了可用性

  • ZAB 协议的两种核心模式(Zookeeper 在这两种模式间切换):

    • 消息广播模式:当 Leader 服务可以正常启用时,Zookeeper 进入消息广播模式,进行正常的数据广播等操作;

    • 崩溃恢复模式:当 Leader 服务不可用时,Zookeeper 进入崩溃恢复模式,以恢复集群的正常服务能力。

2 消息广播模式

3 崩溃恢复模式

  • Leader 崩溃(即 Leader 失去与过半 Follower 的联系)时,Zookeeper 会进入崩溃恢复模式。此时需要解决 Leader 崩溃后的素材一致性障碍,比如:

    • 假设 1:Leader 在复制信息给所有 Follower 后,还没收到 Follower 的 ack 就崩溃;

    • 假设 2:Leader 收到 ack 并提交自己,且发送了部分 commit 后崩溃;

  • ZAB 协议为崩溃恢复定义的两个原则

    • 原则 1:ZAB 协议会丢弃那些只在 Leader 提出,但没有提交的事务;

    • 原则 2:ZAB 协议确保那些已经在 Leader 提交的事务,最终会被所有服务器提交

  • ZAB 协议设计了下面这个选举算法,用于崩溃恢复时新 Leader 的选举:

    • 该选举算法要能确保提交已经被 Leader 提交的事务,同时丢弃已经被跳过的事务
    • 为满足这一要求,选举出的新 Leader 需要拥有集群中所有机器里 ZXID(事务 ID,全局递增唯一)最大的事务
    • 这样做的好处是:可以省去 Leader 服务检查事务的提交和丢弃工作这一步操作,提升恢复效率。

4 数据同步

5 ZooKeeper 写数据ZAB协议源码流程图

在这里插入图片描述

http://www.jsqmd.com/news/3389/

相关文章:

  • 关于MCO使用配置
  • 网络运维 --- ntp服务器
  • 向量那点事儿
  • c++输入输出详解
  • docker/docker compose/k8s
  • 中国开发者迎来新选择:Gitee成为研发协作平台转型期的中流砥柱
  • PySpark - Get the number of rows
  • RK3588-ubuntu server - 详解
  • 一文教你上手 Geometric Glovius 6.0:安装、授权与首个项目演示
  • 32单片机+free rtos移植CJSON库函数主要流程
  • Gitee如何重塑中国开发者生态:本土化创新与数字化转型的双重奏
  • 从MESA模型到锁升级:synchronized性能逆袭的底层逻辑
  • 输入输出接口
  • Go语言中的信号捕获与优雅退出:SIGINT、SIGTERM和SIGKILL详解 - 若
  • (二)3.1.9 生产“稳”担当:Apache DolphinScheduler Worker 服务源码全方位解析
  • 实用指南:虚拟机搭建 DHCP 服务器 + 配置 DHCP 中继:完整实操指南
  • 完整教程:生产环境实战:Spring Cloud Sleuth与Zipkin分布式链路追踪实践
  • ibero 2025.1 Run PROGRAM_SPI_IMAGE_Action
  • 训练“系统级思维”,听时序数据库 IoTDB Committer 说说从设计到应用的成长
  • 【设计模式】状态模式 - 详解
  • Kendo UI for jQuery 2025 Q3新版亮点 - AI 智能网格与全新表单体验
  • 关于gradle项目启动
  • 事倍功半是蠢蛋55 ctrl+shift+f 每次搜索都按倒繁体
  • PHP 线上环境 Composer 依赖包更新部署指南-简易版 - 教程
  • 完整教程:Ubuntu 安装和配置 Anaconda
  • DevExpress WPF中文教程:如何使用虚拟源将WPF数据网格绑定到任何数据源?
  • Ini文件的读写
  • 数据跨境传输解决方案助力企业安全合规高效流通
  • 养成合成小游戏抖音快手微信小程序看广告流量主开源 - 实践
  • 题解:P9454 [ZSHOI-R1] 巡城