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

Zookeeper实践指南

Zookeeper实践指南

1. 什么是 Zookeeper?

Zookeeper 是 Apache 旗下的一个开源分布式协调框架,主要用于解决分布式系统中的一致性问题,提供高效可靠的分布式数据管理能力。

1.1 Zookeeper 的核心特性

  • 顺序一致性:客户端的更新请求按顺序执行。
  • 原子性:更新操作要么成功要么失败,不存在中间状态。
  • 可靠性:一旦数据写入 Zookeeper,它就不会丢失,除非主动删除。
  • 高可用性:采用主从架构,保证服务的高可用性。
  • 观察者模式:支持 Watch 机制,客户端可以监听数据变更。
  • 支持集群:提供主备模式,保证分布式环境的稳定性。

1.2 Zookeeper 的典型应用场景

  • 分布式配置管理:存储和管理全局配置信息。
  • 分布式锁:实现分布式环境下的互斥锁。
  • 服务注册与发现:跟踪集群中的服务。
  • Leader 选举:在分布式系统中选出一个主节点。
  • 分布式队列:管理任务调度,实现有序执行。
  • 分布式事务协调:保证多个系统间数据一致性。

2. 安装与配置 Zookeeper

2.1 下载与安装

从 Apache Zookeeper 官网 下载最新版 Zookeeper 并解压。

wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.8.0-bin.tar.gz
tar -xzf apache-zookeeper-3.8.0-bin.tar.gz
cd apache-zookeeper-3.8.0-bin

2.2 配置 Zookeeper 集群

conf 目录下创建 zoo.cfg 配置文件,并添加以下内容:

# Zookeeper 配置文件
clientPort=2181
dataDir=/var/lib/zookeeper
tickTime=2000
initLimit=10
syncLimit=5
server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2888:3888
server.3=192.168.1.3:2888:3888

在每个 Zookeeper 节点上创建 myid 文件,并写入唯一的服务器编号,例如:

echo "1" > /var/lib/zookeeper/myid  # 服务器 1
echo "2" > /var/lib/zookeeper/myid  # 服务器 2
echo "3" > /var/lib/zookeeper/myid  # 服务器 3

2.3 启动 Zookeeper

bin/zkServer.sh start

查看 Zookeeper 状态:

bin/zkServer.sh status

3. Zookeeper 的核心概念

3.1 ZNode(数据节点)

Zookeeper 中的数据存储在 ZNode 中,类似于文件系统的目录结构。

  • 持久节点:客户端断开连接后仍然存在。
  • 临时节点:客户端断开连接后自动删除。
  • 顺序节点:创建时自动添加序号,通常用于分布式队列。

3.2 Watcher 机制

Zookeeper 允许客户端对 ZNode 进行监听,一旦数据发生变化,客户端会收到通知。

监听 ZNode 的变化
ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, event -> {System.out.println("事件触发: " + event.getType());
});
zk.exists("/myNode", true);

3.3 Leader 选举与选举机制

Zookeeper 采用 ZAB 协议 进行 Leader 选举,保证分布式系统的一致性。当集群启动时,所有节点会尝试竞选 Leader,投票由多数派决定,获得最多票数的节点成为 Leader。

  • 如果 Leader 故障,剩余 Follower 节点重新选举。
  • 选举过程需要保证超过半数的节点存活,Zookeeper 适用于奇数节点集群(例如 3、5、7 个节点)。

4. 集群可用性与故障处理

4.1 高可用性架构设计

  • 部署 奇数个节点(如 3、5、7)防止脑裂。
  • 采用 多个数据中心部署,保证跨机房容灾。
  • 监控 Leader 选举,防止长时间无 Leader 现象。

4.2 处理节点故障

发现 Leader 故障

当 Leader 故障时,Follower 节点会检测到无法连接 Leader,并触发重新选举过程。

处理 Follower 故障

如果某个 Follower 失效,不影响集群可用性,只要 Leader 存活且半数以上节点可用,Zookeeper 仍可正常运行。

监控与报警

使用 Prometheus + GrafanaZKMonitor 进行监控:

echo mntr | nc 127.0.0.1 2181

如果返回 zk_server_state=leader,表示当前节点是 Leader,否则是 Follower。


5. Zookeeper 进阶功能

5.1 分布式锁

Zookeeper 通过创建 临时顺序节点 实现分布式锁。

InterProcessMutex lock = new InterProcessMutex(client, "/my-lock");
lock.acquire();
try {// 执行业务逻辑
} finally {lock.release();
}

这种方式能够避免多个客户端同时访问资源导致的冲突,确保只有一个客户端能获得锁,从而实现互斥访问。

5.2 服务注册与发现(结合 Dubbo)

Zookeeper 在微服务架构中作为注册中心用于服务注册与发现。下面是一个简单的例子,结合 Dubbo 框架进行服务注册与发现:

服务提供者(Service Provider)

服务提供者通过 Dubbo 注册服务到 Zookeeper 中。

<dubbo:registry address="zookeeper://localhost:2181" />
<dubbo:service interface="com.example.DemoService" ref="demoService" />
服务消费者(Service Consumer)

服务消费者从 Zookeeper 中发现服务并调用。

<dubbo:registry address="zookeeper://localhost:2181" />
<dubbo:reference interface="com.example.DemoService" id="demoService" />

Zookeeper 作为 Dubbo 的注册中心,在服务启动时自动将服务信息(如地址、端口等)注册到 Zookeeper 中,消费者从 Zookeeper 中动态发现可用服务。

5.3 作为服务注册中心使用

Zookeeper 作为服务注册中心,负责存储服务信息并提供高效的服务发现能力。服务实例(Provider)在启动时将服务信息注册到 Zookeeper 上,消费者(Consumer)则通过 Zookeeper 查找和调用可用的服务。

Zookeeper 的 Watcher 机制能够在服务上线或下线时实时通知消费者,确保消费者获取到最新的服务状态。

例如,服务注册的过程:

  1. 服务启动时,客户端将服务信息(如 ip:port)写入 Zookeeper 中指定的目录。
  2. Zookeeper 会创建一个持久节点,存储服务信息。
  3. 服务消费者通过 Watcher 监听 Zookeeper 上的服务信息,当服务变动时,消费者能够收到通知并更新本地服务列表。

6. Zookeeper 与 CAP 理论对比:Zookeeper vs Eureka

CAP 理论(Consistency, Availability, Partition Tolerance)描述了在分布式系统中,如何平衡一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)。根据 CAP 理论,一个系统最多只能同时满足这三者中的两个。

Zookeeper:CP 类型

Zookeeper 优先保证 一致性分区容忍性。它通过 ZAB 协议保证集群中的数据一致性,并容忍网络分区的发生。在网络分区时,Zookeeper 会牺牲可用性,确保数据的一致性。

  • 一致性:所有的节点保持一致的数据视图。
  • 分区容忍性:即使发生网络分区,Zookeeper 依然可以保证数据一致性。

适用场景:需要强一致性保证的场景,如分布式锁、配置管理、Leader 选举等。

Eureka:AP 类型

Eureka 优先保证 可用性分区容忍性。它允许系统在发生网络分区时依然能够继续工作,尽管此时可能存在短暂的数据不一致(比如服务的注册信息未能及时同步)。

  • 可用性:即使某些 Eureka Server 节点无法连接,系统仍能正常提供服务。
  • 分区容忍性:即使网络出现分区,系统依然能继续工作。

适用场景:适用于微服务架构中的服务注册与发现,特别是在大规模分布式环境中需要高可用性的情况下。

总结:

  • Zookeeper 适用于需要强一致性和高可靠性的场景,如分布式锁、Leader 选举等,遵循 CP 模型。
  • Eureka 适用于微服务架构中的服务注册与发现,强调高可用性和分区容忍性,遵循 AP 模型。

7. 总结

Zookeeper 是分布式系统的基石,提供强一致性的数据管理能力。本文介绍了 Zookeeper 的基本概念、安装配置、集群高可用性、Leader 选举及常见故障处理,结合实际应用场景如分布式锁、Dubbo 服务注册和作为注册中心的使用,帮助你更好地理解和使用 Zookeeper。

如果你有任何问题或想深入探讨 Zookeeper 的应用,欢迎留言交流!

相关文章:

Zookeeper实践指南

Zookeeper实践指南 1. 什么是 Zookeeper&#xff1f; Zookeeper 是 Apache 旗下的一个开源分布式协调框架&#xff0c;主要用于解决分布式系统中的一致性问题&#xff0c;提供高效可靠的分布式数据管理能力。 1.1 Zookeeper 的核心特性 顺序一致性&#xff1a;客户端的更新…...

Unity 基础知识总结(持续更新中...)

引擎基础 Unity有哪几个主要窗口&#xff1f; Scene窗口 用于场景搭建和UI界面拼接 Game窗口 游戏运行预览 Hierarchy窗口 查看和调整场景对象层级结构 Project窗口 游戏工程资源 Inspector创建 属性查看器&#xff0c;属性设置、脚本组件挂载 Unity提供了几种光源…...

IDEA接入阿里云百炼中免费的通义千问[2025版]

安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;无奈接入的官方api已经不能使用了&#xff0c;所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼‌是阿…...

中级网络工程师面试题参考示例(1)

一、基础理论 1. OSI七层模型与TCP/IP四层模型的区别是什么&#xff1f;请举例说明第三层&#xff08;网络层&#xff09;和第四层&#xff08;传输层&#xff09;的核心协议。 参考答案&#xff1a; OSI七层模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用…...

主流大语言模型中Token的生成过程本质是串行的

主流大语言模型中Token的生成过程本质是串行的 flyfish 1. 串行生成 自回归模型的核心逻辑&#xff1a; 大模型&#xff08;如GPT-2&#xff09;采用自回归架构&#xff0c;每个Token的生成必须基于已生成的完整历史序列。例如&#xff0c;生成“今天天气很好”时&#xff1a…...

3.03-3.09 Web3 游戏周报:Sunflower Land 周留存率 74.2%,谁是本周最稳链游?

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.03–3.09】Web3 游戏行业动态 Sui 背后开发公司 Mysten Labs 宣布收购游戏开发平台 ParasolYescoin 创始人因合伙人纠纷被警方带走&#xff0c;案件升级为刑事案件Animoca B…...

高级java每日一道面试题-2025年2月18日-数据库篇-MySQL 如何做到高可用方案?

如果有遗漏,评论区告诉我进行补充 面试官: MySQL 如何做到高可用方案? 我回答: 在Java高级面试中&#xff0c;讨论MySQL如何实现高可用性方案是一个重要话题。这不仅涉及到数据库的稳定性和可靠性&#xff0c;还关系到系统的整体性能和用户体验。以下是结合提供的信息进行综…...

【编程题】7-5 堆中的路径

7-5 堆中的路径 1 题目原文2 思路解析3 代码实现 1 题目原文 题目链接&#xff1a;7-5 堆中的路径 将一系列给定数字插入一个初始为空的最小堆 h h h。随后对任意给定的下标 i i i&#xff0c;打印从第 i i i 个结点到根结点的路径。 输入格式: 每组测试第 1 1 1 行包含 …...

Scala 中的访问修饰符

在Scala中&#xff0c;面向对象的权限控制主要通过访问修饰符来实现。Scala提供了以下几种访问修饰符来控制类、对象、成员变量和方法的访问权限&#xff1a; 1. 默认访问权限&#xff08;无修饰符&#xff09; 如果没有指定任何访问修饰符&#xff0c;成员默认是public的&…...

flask_restx 定义任意类型参数

之前定义的content只是string&#xff0c;现在需要支持即可以string也可以list from flask_restx import fieldsclass Messages:def get_model(api):return api.model("Message",{"role": fields.String(requiredTrue, description"The role of messa…...

Unity3D网格简化与LOD技术详解

前言 在Unity3D游戏开发中&#xff0c;网格简化&#xff08;Mesh Simplification&#xff09;和细节层次&#xff08;Level of Detail, LOD&#xff09;技术是优化渲染性能的关键手段&#xff0c;尤其在处理复杂场景和高精度模型时至关重要。这两种技术通过减少模型的几何复杂…...

爬取数据时如何处理可能出现的异常?

在爬取数据时&#xff0c;处理可能出现的异常是确保爬虫稳定运行的关键。以下是一些常见的异常处理策略和具体实现方法&#xff0c;这些方法可以帮助你在爬虫开发中更有效地应对各种问题。 1. 使用 try-catch 块捕获异常 在PHP中&#xff0c;try-catch 块是处理异常的基本工具…...

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

MPPT与PWM充电原理及区别详解

MPPT&#xff08;最大功率点跟踪&#xff09;和PWM&#xff08;脉宽调制&#xff09;是太阳能充电控制器中常用的两种技术&#xff0c;它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比&#xff1a; 1. 工作原理 PWM&#xff08;脉宽调制&#xff09; 核心机制…...

数据量过大的时候导出数据很慢

原因解析 速度慢无非两个原因: sql取数很慢程序很慢 sql很慢有3种原因: sql本身查询不合理,需要优化数据库没有索引多次频繁访问数据,造成了不必要的开销 取消多次获取数据,一次获取 框定一个大致的范围,获取此次查询的所有数据使用map设置数据,没有主键使用傅和主键拼接数据 /…...

NVIDIA k8s-device-plugin源码分析与安装部署

在《kubernetes Device Plugin原理与源码分析》一文中&#xff0c;我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑&#xff0c;本文以nvidia管理GPU的开源github项目k8s-device-plugin为例&#xff0c;来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…...

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…...

聚焦两会:科技与发展并进,赛逸展2025成创新新舞台

在十四届全国人大三次会议和全国政协十四届三次会议期间&#xff0c;代表委员们围绕多个关键议题展开深入讨论&#xff0c;为国家未来发展谋篇布局。其中&#xff0c;技术竞争加剧与经济转型需求成为两会焦点&#xff0c;将在首都北京举办的2025第七届亚洲消费电子技术贸易展&a…...

Xilinx ZYNQ FSBL解读:LoadBootImage()

篇首 最近突发奇想&#xff0c;Xilinx 的集成开发环境已经很好了&#xff0c;很多必要的代码都直接生成了&#xff0c;这给开发者带来了巨大便利的同时&#xff0c;也让人错过了很多代码的精彩&#xff0c;可能有很多人用了很多年了&#xff0c;都还无法清楚的理解其中过程。博…...

flutter的HTTP headers用法介绍

flutter的HTTP headers用法介绍 在 Flutter 中&#xff0c;HTTP headers 是用于在发送 HTTP 请求时传递额外信息的关键部分。它们可以用于身份验证、缓存控制、内容类型声明等。以下是关于 Flutter 中 HTTP headers 的详细说明和用法。 1. 什么是 HTTP Headers&#xff1f; H…...

Flutter开发避坑指南:高频问题排查与性能调优实战

目录 一、使用中常见问题 1.环境与配置问题 2.Widget 重建与状态管理 3.布局与绘制问题 4.动画与卡顿&#xff08;Jank&#xff09;问题 5.平台相关问题 二、Flutter实战14问 1.如何使用 Flutter 进行多语言支持&#xff1f; 1. 添加依赖 2. 配置 Material App 3. 创…...

Uniapp实现地图获取定位功能

摘要&#xff1a;本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取&#xff0c;并解决微信小程序、APP、H5三端的兼容性问题&#x1f680;&#x1f680;&#x1f680; 一、环境准备 地图平台选择 微信小程序&#xff1a;腾讯地图&#xff08;强制使用&#xff09…...

Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南

&#x1f4cc; 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器&#xff0c;可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…...

【AI】神经网络|机器学习——图解Transformer(完整版)

Transformer是一种基于注意力机制的序列模型,最初由Google的研究团队提出并应用于机器翻译任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformer仅使用自注意力机制(self-attention)来处理输入序列和输出序列,因此可以并行计算,极大地提高了计算效率…...

【VUE2】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期&#xff1a;就是…...

贪心算法三

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

猫耳大型活动提效——组件低代码化

1. 引言 猫耳前端在开发活动的过程中&#xff0c;经历过传统的 pro code 阶段&#xff0c;即活动页面完全由前端开发编码实现&#xff0c;直到 2020 年接入公司内部的低代码活动平台&#xff0c;满足了大部分日常活动的需求&#xff0c;运营可自主配置活动并上线&#xff0c;释…...

机器学习 Day02,matplotlib库绘图

1.matplotlib图像结构 容器层&#xff1a;画板&#xff0c;画布&#xff0c;坐标系辅助层&#xff1a;刻度&#xff0c;标题&#xff0c;网格&#xff0c;图例等图像层&#xff1a;折线图&#xff08;主讲&#xff09;&#xff0c;饼图&#xff0c;直方图&#xff0c;柱状图等…...

MySQL中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中有哪几种锁&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;锁是用于确保数据的一致性和并发控制的机…...

Unity单例模式更新金币数据

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在游戏开发中&#xff0c;单例模式非常适合用于管理全局唯一的数据&#xff0c;比如玩家的金币数量。通过使用单例…...