ZooKeeper 技术全解:概念、功能、文件系统与主从同步
引言
随着分布式系统变得越来越复杂,对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架,广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战,如配置管理、命名服务、分布式同步和集群管理等。ZooKeeper 通过提供一个可靠的、简单的服务,确保了分布式系统中的数据一致性和协调性。它的设计哲学强调高可用性和高性能,通过内存数据存储和优化算法来实现这些目标,确保在分布式环境中,数据的一致性和协调性不会因为节点故障或网络问题而受到严重影响。
1. ZooKeeper 是什么?
ZooKeeper 是一个由 Apache 软件基金会开发的开源项目,专门为分布式应用程序而设计,提供了一个高效的协调服务。它的核心思想是将复杂的分布式协调问题简化为简单的 API 调用,使开发者能够更专注于业务逻辑而不是协调机制。ZooKeeper 的特性包括:
- 高可用性:通过在集群中设置多个 ZooKeeper 服务器,实现服务的高可用性。即使部分节点失效,系统仍然可以正常运行。
- 高性能:通过内存数据存储和优化协议(如 ZAB 协议),实现高效的事务处理和数据同步。
- 数据一致性:使用 ZAB 协议确保在各种操作中数据的一致性,保证所有节点上的数据都是同步的。
ZooKeeper 通过提供一个简化的数据模型(类似于文件系统的层次结构),使得开发者可以轻松管理分布式系统的状态信息。
2. ZooKeeper 提供了什么?
ZooKeeper 提供了多种服务来支持分布式应用的需求:
-
统一配置管理:这允许应用程序集中管理配置信息,避免了配置文件分散在各个节点的混乱局面。每次配置更新,相关的应用程序都会被通知,确保所有节点使用一致的最新配置。
-
命名服务:在分布式系统中,为各种资源(如服务器、队列等)提供唯一的全局标识,简化了资源的发现和管理。
-
分布式锁:解决并发访问问题,确保在分布式环境中,资源的使用是互斥的,避免了数据竞争和死锁。
-
集群管理:ZooKeeper 可以监控节点的健康状态,进行负载均衡,管理节点的加入和退出,甚至可以进行领导者选举,帮助实现高效的集群操作。
-
通知机制:通过 Watch 机制,客户端可以监控节点数据的变化或节点的创建和删除,实现事件驱动式的编程模型。
示例:配置管理
下面是一个简单的 Java 示例,展示了如何使用 ZooKeeper 进行配置管理:
// 客户端注册监听配置节点的变化
public class ConfigWatcher implements Watcher {private static final String CONFIG_PATH = "/app/config";public void process(WatchedEvent event) {if (event.getType() == Event.EventType.NodeDataChanged) {try {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, this);byte[] data = zk.getData(CONFIG_PATH, this, null);String config = new String(data);System.out.println("配置更新为: " + config);} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, new ConfigWatcher());byte[] data = zk.getData(CONFIG_PATH, true, null);System.out.println("当前配置: " + new String(data));} catch (Exception e) {e.printStackTrace();}}
}
这个例子展示了如何监控配置节点的变化,并在变化发生时更新应用程序的配置。
3. Zookeeper 文件系统
ZooKeeper 的数据模型可以被认为是内存中的树形结构(类似 Unix 文件系统),每个节点称为 znode。znodes 不仅可以存储数据,还可以作为目录组织数据:
-
znode 类型:
- 持久节点(Persistent):一旦创建,除非手动删除,否则一直存在。适用于需要长期保存数据的场景。
- 临时节点(Ephemeral):生命周期与客户端会话绑定,断开连接即消失。常用于锁和租约(Lease)。
- 顺序节点(Sequential):在创建时,ZooKeeper 会在节点名后附加一个递增的序号,适合实现分布式队列或分布式ID生成。
-
znode 操作:
- 创建节点(
create
),设置数据(setData
),读取数据(getData
),删除节点(delete
),监听变化(exists
with watch)。
- 创建节点(
znodes 可以包含数据,也可以作为父节点包含子节点,从而形成一个层次结构,提供了一种灵活的方式来表示分布式系统中的状态和配置。
示例:操作 ZooKeeper 文件系统
下面是一个 Java 代码示例,展示了如何进行基本的 ZooKeeper 文件系统操作:
public class ZNodeOperations {private static final String ZNODE_PATH = "/testZnode";public static void main(String[] args) throws KeeperException, InterruptedException {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);// 创建持久节点zk.create(ZNODE_PATH, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);// 获取节点数据byte[] data = zk.getData(ZNODE_PATH, false, null);System.out.println("节点数据: " + new String(data));// 更新节点数据zk.setData(ZNODE_PATH, "updated data".getBytes(), -1); // -1 表示任何版本// 删除节点zk.delete(ZNODE_PATH, -1);zk.close();}
}
这个例子展示了如何创建、读取、更新和删除 znodes。
4. Zookeeper 怎么保证主从节点的状态同步?
ZooKeeper 使用 ZAB(Zookeeper Atomic Broadcast)协议来确保数据一致性,ZAB 协议分为两个主要阶段:
-
恢复模式(Leader Election):
- 当集群启动或 Leader 失效时,ZooKeeper 节点会进行选举以选出新的 Leader。选举过程考虑节点的 zxid(事务ID)以确保选出持有最新的数据状态的节点。
-
广播模式(Atomic Broadcast):
- 在正常运行时,所有写操作首先由 Leader 处理,Leader 然后将这些事务广播给所有 Follower。通过 Quorum 机制(即大多数节点确认),Leader 确保更新被一致地应用。
同步流程:
- 客户端发起写请求:客户端可以向集群中的任何节点发送更新请求。
- 转发到 Leader:如果请求到达的不是 Leader 节点,该节点会将请求转发给 Leader。
- Leader 广播:Leader 通过 ZAB 协议将更新广播给 Follower 节点。
- 集群共识:一旦有超过半数的节点确认了更新,Leader 会认为更新成功。
- 确认完成:Leader 会将成功信息返回给客户端。
示例:模拟主从同步
下面是一个简化的 Java 代码示例,展示了如何验证 ZooKeeper 的主从同步:
public class SyncExample {public static void main(String[] args) throws KeeperException, InterruptedException {ZooKeeper zkLeader = new ZooKeeper("localhost:2181", 3000, null);ZooKeeper zkFollower = new ZooKeeper("localhost:2182", 3000, null); // 假设有多个 ZooKeeper 实例// 模拟 Leader 进行写操作String path = "/syncTest";zkLeader.create(path, "initialData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);// 等待同步Thread.sleep(5000); // 模拟等待同步时间// 从 Follower 读取数据,验证同步byte[] followerData = zkFollower.getData(path, false, null);System.out.println("Follower 节点数据: " + new String(followerData));zkLeader.close();zkFollower.close();}
}
这个例子展示了如何通过创建一个节点并在不同的 ZooKeeper 实例上验证其同步。
结论
ZooKeeper 通过其简单但功能强大的API、保证数据一致性的ZAB协议,以及灵活的文件系统模型,成为了分布式系统中不可或缺的协调服务工具。通过理解 ZooKeeper 的功能、文件系统和同步机制,开发者可以更有效地设计和维护分布式系统,确保系统的可靠性和效率。对于任何涉及分布式架构的项目,掌握 ZooKeeper 的使用方法是非常有价值的。
相关文章:

ZooKeeper 技术全解:概念、功能、文件系统与主从同步
引言 随着分布式系统变得越来越复杂,对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架,广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战,如配置管…...

Visual Studio Code 的 AI 编程助手
文章目录 1. 写在最前面2. AI 编程助手2.1 Top 10 AI Extensions for Visual Studio Code2.1.1 脑图概括2.1.2 详细介绍 2.2 10 Best AI Code Tools: Quick and Easy Guide (2024)2.2.1 脑图概括2.2.2 详细介绍 3. Cody 插件试用4. 碎碎念5. 参考资料 1. 写在最前面 最近在研究…...

Kafka的ISR是什么,HW是什么,怎么保证可靠性,Kafka怎么实现顺序消息?为什么Kafka的broker上的topic越多,效率越慢?
目录 1. Kafka 的 ISR 是什么 2. Kafka 的 HW 是什么 3. Kafka 如何保证可靠性 4. Kafka 怎么实现顺序消息 5. 为什么 Kafka 的 broker 上的 topic 越多,效率越慢 1. Kafka 的 ISR 是什么 ISR 即 In-Sync Replicas(同步副本集),是 Kafka 中一个重要的概念,用于保障消…...

Ollama系列---【ollama使用gpu运行大模型】
一、安装CudaToolkit 使用控制台命令查看当前显卡驱动中的cuda版本 nvidia-smi 二、下载CudaToolkit 注意:CudaToolkit版本要低于上面的显卡Cuda版本。 Cuda各版本下载地址:CUDA Toolkit Archive | NVIDIA Developer 下载好之后,一路下一步&a…...

使用C语言实现MySQL数据库的增删改查操作指南
使用C语言与MySQL数据库进行交互,通常涉及使用MySQL提供的C API库。这套API允许开发者在C/C++程序中执行SQL查询,从而实现数据库的增删改查操作。下面,我将详细介绍如何在C语言中实现这些基本操作。 准备工作 安装MySQL开发库:确保你的系统上安装了MySQL服务器以及MySQL开发…...

【Golang学习之旅】Go + Redis 缓存设计与优化(项目实战)
文章目录 业务需求1. 缓存设计2. GoRedis代码实现3. 代码解析4. 性能优化 在本节中,我们将通过一个实际的项目案例,演示如何在 Go 中使用 Redis 实现高效的缓存设计与优化。 业务需求 假设我们正在开发一个电商平台,需要缓存商品信息以提高页…...

2、k8s 二进制安装(详细)
k8s 二进制安装 IP规划初始化部署 etcd 集群在 etcd01 节点上操作准备cfssl证书生成工具,加权生成etcd证书上传etcd软件包启动 etcd 服务 部署 Master 组件部署 Worker Node 组件node 节点安装 docker部署组件 部署 CNI 网络组件部署 flannel简介部署 部署 Calico简…...

安卓开发,底部导航栏
1、创建导航栏图标 使用系统自带的矢量图库文件,鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖,并点击Sync Now …...

CWOI-N RER 1 > 2 Solution
CWOI-N RER 1 > 2 Solution 声明:头图为断章取义。 这场比赛得 200 200 200 分是保底,得 300 300 300 分是基操,得 350 350 350 分以上才是实力(但不多)。 A - 机读卡 No solutions yet. 这题数据倒还不能无…...

字节跳动后端一面
📍1. Gzip压缩技术详解 Gzip是一种流行的无损数据压缩格式,它使用DEFLATE算法来减少文件大小,广泛应用于网络传输和文件存储中以提高效率。 🚀 使用场景: • 网站优化:通过压缩HTML、CSS、JavaScript文件来…...

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题
Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题 背景 在使用 Dify 框架进行开发时,遇到了两个主要的技术挑战: 代码节点连接到 PGSQL(PostgreSQL)数据库。解决沙盒环境中由于系统调用限制导致的“oper…...

ModuleJS 与 CommonJS 混用的两种解决方案
目录 方案一 方案二 统一使用 ModuleJS 统一使用CommonJS 方案一 使用构建工具,webpack、vite等系列构建工具。这些构建工具底层则会将两种不同的系统模块语言转为同一种语言,然后代码也能正常执行。 方案二 如果你可以修改文件的文件后缀…...

代码随想录--977有序数组的平方
977 有序数组的平方 题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释&…...

Win11下搭建Kafka环境
目录 一、环境准备 二、安装JDK 1、下载JDK 2、配置环境变量 3、验证 三、安装zookeeper 1、下载Zookeeper安装包 2、配置环境变量 3、修改配置文件zoo.cfg 4、启动Zookeeper服务 4.1 启动Zookeeper客户端验证 4.2 启动客户端 四、安装Kafka 1、下载Kafka安装包…...

MacBook Pro M2安装deepseek
序 本文主要展示一下如何在MacBook Pro M2安装deepseek mac配置 芯片Apple M2,8核(物理),内存16G,os版本Ventura,磁盘500G 步骤 下载ollama 去https://ollama.com/下载mac版本 或者使用go来编译 git clone --depth 1 http…...

springboot的http请求不通原因
Spring Boot 应用中 HTTP 请求不通可能由多种原因引起,以下是一些常见问题及解决方法: 1. 端口冲突 问题:应用端口被占用。 解决:检查端口占用情况,修改 application.properties 或 application.yml 中的端口配置。 …...

【Windows】PowerShell 缓存区大小调节
PowerShell 缓存区大小调节 方式1 打开powershell 窗口属性调节方式2,修改 PowerShell 配置文件 方式1 打开powershell 窗口属性调节 打开 CMD(按 Win R,输入 cmd)。右键标题栏 → 选择 属性(Properties)…...

使用python脚本批量删除redis缓存
首先,安装 redis-py 库: pip install redis 其次,创建一个 Python 脚本来连接到 Redis 并删除匹配的键。假设 Redis 端口是 6379,密码是 mypassword(如果有密码的话)。 import redis# 连接到 Redis r r…...

Python截图轻量化工具
一、兼容局限性 这是用Python做的截图工具,不过由于使用了ctypes调用了Windows的API, 同时访问了Windows中"C:/Windows/Cursors/"中的.cur光标样式文件, 这个工具只适用于Windows环境; 如果要提升其跨平台性的话,需要考虑替换cty…...

Android图片加载框架Coil,Kotlin
Android图片加载框架Coil,Kotlin implementation("io.coil-kt:coil:1.4.0") import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import coil.Coil i…...

重生之我要当云原生大师(十四)分析和存储日志
目录 一、简述常用的日志文件所存储的消息类型。 二、syslog的优先级? 三、维护准确时间的意义? 一、简述常用的日志文件所存储的消息类型。 1. 系统日志文件 /var/log/messages 消息类型:通用的系统日志文件,记录系统启动、…...

C++基础知识学习记录—补充
1、C新增的赋值语法 #include <iostream>using namespace std;int main() {//C新的赋值语法//1、传统的赋值语法int a,b;a100;b99;//C新的赋值语法int c(2);//相当于给c赋值2int d(c);//相当于把c的值赋值给dcout << "c" << c << endl;co…...

Linux常用命令——磁盘管理类
文章目录 du 查看文件和目录占用的磁盘空间df 查看磁盘空间使用情况free 显示内存占用情况lsblk 查看设备挂载情况mount/umount 挂载/卸载fdisk 分区Linux分区分区操作按键说明挂载硬盘操作 du 查看文件和目录占用的磁盘空间 ls-lh是查看文件大小du: disk usage 磁盘占用情况d…...

【AI学习】DeepSeek为什么强?
个人的一些思考,请大家批评指正。 这个问题,首先当然是在恰当的时间出现,模型性能跻身世界一流,又开源,戳破了OpenAI和英伟达潜心构造的叙事逻辑。 DeepSeek为什么强?四个方面:模型的智能水平…...

【快应用】原生广告下载状态监听案例
问题背景: 快应用中下载类原生广告监听下载状态变化接口调用没生效,在上报点击接口里触发下载监听后仅第一次返回状态,之后就不返回了,该如何处理? 问题分析: 快应用在1100版本新增了一个ad-button组件&a…...

C++语言的软件工程
C语言的软件工程 引言 在当今快速发展的技术领域,软件工程作为一门综合性的学科,越来越受到重视。而C语言,作为一种功能强大且具有广泛应用的编程语言,在软件工程中占据着重要的地位。本文将探讨C语言在软件工程中的应用与特点&…...

计算机网络结课设计:通过思科Cisco进行中小型校园网搭建
上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网,当时花了几天时间查阅相关博客总算是做出来了,在验收后一直没管,在寒假想起来了简单分享一下,希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…...

无人机避障——基于ESDF地图的JPS算法前端路径规划
原来是用栅格地图的方式,0表示可通行区域,1表示不可通行区域,然后采用JPS算法做路径规划,从起点到终点规划出一条路径。但是目前我需要做的是将栅格地图更换为ESDF地图,那么JPS算法计算代价的部分是否需要进行变化。 …...

【MQ】RabbitMQ 高可用延时功能的探究
延迟消息如果使用延时交换机来实现,如果数据量过大,就会很占 CPU 资源,轻则时间误差大,重则 RabbitMQ 宕机 一、针对一个 RabbitMQ 节点 (1)利用队列 ttl,将延迟消息根据 delay 的时间进行分级…...

Maven入门核心知识点总结
Maven 1. POM(Project Object Model)2. 坐标(Coordinates)3. 依赖管理(Dependency Management)4. 常用五个生命周期(Life Circle)5. Maven 仓库(Maven Repository&#x…...