ZooKeeper 原理解析及优劣比较

news2025/7/14 13:09:31

大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!

Apache Zookeeper Architecture ...

引言

在分布式系统中,服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭借其轻量级、易用性和强一致性,成为业界主要选择之一。本文将从原理层面剖析 ZooKeeper,给出 Java 快速上手示例,并与同类产品(etcd、Consul、Eureka)进行对比,为架构选型提供参考。


一、ZooKeeper 简介

  • 定位:分布式协调服务,提供命名(Naming)、同步(Synchronization)、配置管理(Configuration)、组管理(Group Management)等基本原语。

  • 优势

    • 读性能优越:针对读多写少场景优化
    • 强一致性:采用 Zab(ZooKeeper Atomic Broadcast)协议保障写操作原子广播
    • Watch 机制:基于事件通知的异步设计

二、ZooKeeper 核心原理

1. 数据模型 —— ZNode 树

  • 类文件系统的树状结构存储数据,称为 ZNode
  • 每个 ZNode 可以存储少量的元数据和数据(默认 1MB 以内)
  • 支持持久节点(Persistent)和临时节点(Ephemeral),及顺序变体
/
├── /app
│   ├── /app/config     (持久节点)
│   └── /app/lock_0001  (临时顺序)
└── /services
    ├── /services/svcA (临时节点)
    └── /services/svcB (临时节点)

2. 集群架构与选举

  • 角色:每个节点启动时会在集群中选举产生一个 Leader,其余为 Follower;也可配置 Observer(只读,不参与选举)

  • 读写分离

    • 读请求:可由任意节点(Follower/Observer)处理
    • 写请求:必须先提交给 Leader,由 Leader 通知 Follower 过半达成一致后应用并回复客户端

3. Zab 协议(Atomic Broadcast)

  1. Proposal:Leader 接收写请求并生成提案(Proposal)
  2. Sync:Leader 将 Proposal 发送给所有 Follower
  3. Ack:Follower 收到 Proposal 后返回确认
  4. Commit:Leader 收到多数 Ack 后发送 Commit,所有节点应用并完成事务

4. 会话与 Watch

  • Session:客户端与集群建立会话,ZK 用心跳维持,有超时机制
  • Watch:客户端可在 ZNode 上注册 Watch,节点数据/子节点变化时触发一次性事件通知

三、ZooKeeper 快速入门示例(Java)

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.util.concurrent.CountDownLatch;

public class ZkDemo {
    private static final String CONNECT_ADDR = "zk1:2181,zk2:2181,zk3:2181";
    private static final int SESSION_TIMEOUT = 5000;
    private ZooKeeper zk;
    private CountDownLatch connectedSignal = new CountDownLatch(1);

    public void connect() throws Exception {
        zk = new ZooKeeper(CONNECT_ADDR, SESSION_TIMEOUT, event -> {
            if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {
                connectedSignal.countDown();
            }
        });
        connectedSignal.await();
    }

    // 创建持久节点
    public String createPersistent(String path, byte[] data) 
            throws KeeperException, InterruptedException {
        return zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    // 读取数据并注册 Watch
    public byte[] getData(String path, Watcher watcher) 
            throws KeeperException, InterruptedException {
        Stat stat = zk.exists(path, true);
        if (stat != null) {
            return zk.getData(path, watcher, stat);
        }
        return null;
    }

    // 更新数据
    public void updateData(String path, byte[] data) 
            throws KeeperException, InterruptedException {
        Stat stat = zk.exists(path, false);
        if (stat != null) {
            zk.setData(path, data, stat.getVersion());
        }
    }

    // 关闭连接
    public void close() throws InterruptedException {
        zk.close();
    }
    
    public static void main(String[] args) throws Exception {
        ZkDemo demo = new ZkDemo();
        demo.connect();
        String path = demo.createPersistent("/app/config", "v1".getBytes());
        System.out.println("节点创建: " + path);
        byte[] data = demo.getData("/app/config", event ->
                System.out.println("节点变更: " + event));
        System.out.println("读取数据: " + new String(data));
        demo.updateData("/app/config", "v2".getBytes());
        demo.close();
    }
}

四、与同类产品对比

特性ZooKeeperetcdConsulEureka
一致性强一致性(CP)强一致性(CP,基于 Raft)可配(默认 CP)弱一致性(AP,基于自选复制)
读写性能读快、写次之写优、读优性能均衡适中
Watch机制一次性 Watch,需重置支持 Watch/WatchStream,可持续监听支持 KV Watch不支持,需客户端轮询
数据模型树形层级(类文件系统)键值对(扁平)KV + 服务健康检查服务注册中心
客户端生态原生 Java/C、众多三方Go/Kotlin/Java/C# 等,多语种支持Go/Java/Python/Node.js 等Java 生态为主
高可用方案集群模式,Observer 可扩展读集群模式,普通节点+LearnerCluster + WAN Federation集群模式,PeerAwareInstance
典型场景分布式锁、配置管理、选举、Naming配置管理、服务发现、Leader 选举服务发现、健康检查、Multi-Datacenter服务发现、负载均衡

对比总结

  • 一致性与性能:若追求强一致性、读多写少场景,首选 ZooKeeper;写密集场景可考虑 etcd。
  • 生态与易用性:Consul 提供内置健康检查、Multi-DC 支持,适合作为全栈服务发现与健康监控;Eureka 更偏向 Java 微服务生态(Spring Cloud)。
  • Watch 能力:持续监听场景下,etcd 和 Consul 更灵活;ZooKeeper 则需客户端自行重置 Watch。

结语

Apache ZooKeeper 以其成熟的协调原语、强一致性和稳定的社区,仍是分布式系统核心组件的首选。但在选型时,应结合业务场景、性能特点和运维成本,综合权衡。希望本文能够帮助你快速理解 ZooKeeper 原理,并在架构设计中做出更明智的决策。

转自:https://mp.weixin.qq.com/s/cSTNX6jaOYnkHhSEjz9ILw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2382135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

是德科技 | 单通道448G未来之路:PAM4? PAM6? PAM8?

内容来源:是德科技 随着数据中心规模的不断扩大以及AI大模型等技术的兴起,市场对高速、大容量数据传输的需求日益增长。例如,AI训练集群中GPU等设备之间的互联需要更高的传输速率来提升效率。在技术升级方面,SerDes技术的不断进步…

OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座

5 月 17 号以“当 SQL 遇见 AI”为主题的 OceanBase 开发者大会在广州举行,因为行程的原因未能现场参会,仍然通过视频直播观看了全部的演讲。总体来说,这届大会既有对未来数据库演进方向的展望,也有 OceanBase 新产品的发布&#…

STM32IIC协议基础及Cube配置

STM32IIC协议基础及Cube配置 一,IC协议简介1,核心特点2,应用场景 二,IC协议基础概念1,总线结构2,主从架构3,设备寻址4,起始和停止条件5,数据传输6,应答机制 三…

CNN vs ViT:图像世界的范式演进

一、图像建模,是不是也可以“大一统” 在前文中我们提到,多模态大模型打破“只能处理文字”的限制。 在 NLP 世界里,Transformer 已经证明自己是理解语言的王者。那么在图像世界,我们是否也能有一种“通用架构”,让模…

cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins

cocos 版本2.4.11 在windows上jenkins的具体配置和部署,可参考上一篇文章cocos creator使用jenkins打包流程,打包webmobile_jenkins打包,发布,部署cocoscreator-CSDN博客 特别注意,windows上运行jenkins需要关闭windows自己的jenkins服务&a…

定时器的两种实现方式

1、基于优先级队列/堆 队列是先进先出,优先级队列是优先级越高就存放在队列之前,我们可以将过期时间越早设置为优先级越高,那么临近过期时间的任务就会在队列前面,距离过期时间越晚的任务就在队列后面。 可以分配一个线程&#…

[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十)

[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十) 一、MinIO简介与核心原理 MinIO 是一款高性能、开源的分布式对象存储系统,兼容 Amazon S3 API,适用于存储图片、视频、日志等非结构化数据。其核心特…

AI在人力资源领域的应用:把握时代浪潮

借鉴历史经验,引领技术变革 历史总是呈现出惊人的相似性。十年前,众多企业未能及时洞察移动技术与社交技术的潜在价值,迟迟没有将这些创新引入职场环境。随着时间推移,这些组织才意识到BYOD(自带设备办公)…

vr制作公司提供什么服务?

随着科技的迅猛进步,虚拟现实(Virtual Reality,简称VR)技术已经悄然渗透到我们的日常生活与工作中,成为推动数字化转型的重要力量。VR制作公司,作为前沿领域的探索者和实践者,以专业的技术和创新…

下一代电子电气架构(EEA)的关键技术

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

matlab慕课学习3.5

于20250520 3.5 用while 语句实现循环结构 3.5.1while语句 多用于循环次数不确定的情况,循环次数确定的时候用for更为方便。 3.5.2break语句和continue语句 break用来跳出循环体,结束整个循环。 continue用来结束本次循环,接着执行下一次…

Qt音视频开发过程中一个疑难杂症的解决方法/ffmpeg中采集本地音频设备无法触发超时回调

一、前言 最近在做实时音视频通话的项目中,遇到一个神奇的问题,那就是用ffmpeg采集本地音频设备,当音频设备拔掉后,采集过程会卡死在av_read_frame函数中,尽管设置了超时时间,也设置了超时回调interrupt_c…

PEFT库PromptTuningConfig 配置

PEFT库 PromptTuningConfig 配置 "Prompt Tuning"的参数高效微调 PromptTuningConfig 核心参数解析 1. task_type="CAUSAL_LM" 作用:指定任务类型为因果语言模型(Causal LM)。说明:因果语言模型从左到右生成文本(如GPT系列),这与任务需求匹配(模…

操作系统----软考中级软件工程师(自用学习笔记)

目录 1、计算机系统层次结构 2、程序顺序执行的特征 3、程序并发执行的特征 4、三态模型 5、同步与互斥 6、信号量机制 7、PV操作 8、死锁 9、进程资源图 10、死锁避免 11、线程 12、程序局部性原理 13、分页存储管理 14、单缓冲器 15、双缓冲区 16、磁盘调度算…

基于 Redis 实现短信验证码登录功能的完整方案

&#x1f9f1; 一、技术栈与依赖配置 使用 Spring Boot Redis 实现短信验证码登录&#xff0c;以下是推荐的 Maven 依赖&#xff1a; <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><ar…

电平匹配电路

1、为什么要电平匹配? 现在很多SOC器件为了降低功耗,都把IO口的电平设计成了1.8V,核电压0.85V,当这种SOC做主平台时,在做接口设计需要格外关注电平的匹配。单板中经常需要将1.8V的电平转换成3.3V或者转成5V。如果没有注意到输入和输出信号之间的电平匹配,系统就无法正常…

JavaScript 日志和调试工具箱-logger2js

原创功能丰富的 JavaScript 日志和调试工具箱&#xff0c;设计这个工具时考虑到了多种实际开发中的需求。该工具不仅提供了高效强大的日志输出显示功能&#xff0c;还包含了界面风格配置、代码格式化、事件处理、性能测试、方法调用栈输出&#xff0c;右键菜单、控制台显示控制…

zData X zStorage 为什么采用全闪存架构而非混闪架构?

点击蓝字 关注我们 最近有用户问到 zData X 的存储底座 zStorage 分布式存储为什么采用的是全闪存架构而非混闪架构&#xff1f;主要原因还是在于全闪存架构在性能和可靠性方面具有更显著的优势。zData X 的上一代产品 zData 的早期版本也使用了SSD盘作为缓存的技术架构&#x…

使用SQLite Studio导出/导入SQL修复损坏的数据库

使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏&#xff0c;在软件中寸步难行&#xff0c;遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具&#xff0c;支持Windows/macOS/Linux。相较于其…

Unity3D仿星露谷物语开发46之种植/砍伐橡树

1、目标 种植一棵橡树&#xff0c;从种子变成大树。 然后可以使用斧头砍伐橡树。 2、删除totalGrowthDays字段 修改growthDays的含义&#xff0c;定义每个值为到达当前阶段的累加天数。此时最后一个阶段就是totalGrowthDays的含义。所以就可以删除totalGrowthDays字段。 &…