Zookeeper是什么,为什么要用,怎么用?

关于Zookeeper的全面了解与应用

前言:这几天在开发过程中,遇到了zk相关的一些问题,大体先复习下

Zookeeper作为分布式系统中的协调服务,起着至关重要的角色。本篇文章将从以下几个方面详细讲解什么是Zookeeper,为什么要使用Zookeeper,如何使用Zookeeper,以及它的工作原理。通过本篇文章,大家将全面了解并掌握Zookeeper的使用。

  • 1. 什么是Zookeeper
  • 2. 为什么使用Zookeeper
  • 3. Zookeeper的基本概念
  • 4. 如何使用Zookeeper
    • 4.1 安装Zookeeper
    • 4.2 启动Zookeeper服务器
    • 4.3 使用Zookeeper客户端
  • 5. Zookeeper的工作原理
    • 5.1 Zookeeper的数据结构
    • 5.2 选举过程
    • 5.3 写操作的处理
    • 5.4 读操作的处理
  • 6. 实际案例:实现分布式锁
  • 7. 总结

1. 什么是Zookeeper

Zookeeper是一个开源的分布式协调服务,它提供了一种简单的、高性能的、高可用的协调机制。Zookeeper可以用来做配置管理、命名服务、分布式锁和集群管理等。它最初由雅虎开发,现在是Apache Software Foundation的顶级项目之一。

2. 为什么使用Zookeeper

在一个分布式系统中,多个节点之间需要进行协调和同步。常见的需求包括:

  1. 配置管理:集中管理和发布配置文件,确保多个节点一致性。
  2. 命名服务:提供分布式系统中的命名解析服务,如服务发现。
  3. 分布式锁:实现分布式环境下的互斥锁机制,确保资源的串行访问。
  4. 集群管理:管理和监控集群中的节点状态,进行故障检测和恢复。

Zookeeper基于其设计的强一致性和高可用性特点,高效地满足了分布式系统中的这些需求,增强了系统的稳定性和可靠性。

3. Zookeeper的基本概念

在深入了解Zookeeper的使用之前,我们需要了解一些基本概念:

  • 节点(ZNode):Zookeeper的数据结构是树状的,每个节点称为ZNode,每个ZNode都可以存储数据和子节点。
  • 会话(Session):客户端与Zookeeper服务器之间的连接,每次连接会生成一个唯一的Session ID。
  • 访问控制(ACL):控制对ZNode的访问权限,支持多种权限模式如读、写、创建、删除等。
  • 事件通知(Watchers):Zookeeper支持监听器机制,客户端可以注册监听器,当特定事件发生时,Zookeeper会通知客户端。

4. 如何使用Zookeeper

4.1 安装Zookeeper

从 Apache Zookeeper官网 下载Zookeeper安装包。解压后,配置 conf/zoo.cfg 文件如下:

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
initLimit=10
syncLimit=5server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
4.2 启动Zookeeper服务器

在解压目录下,使用以下命令启动Zookeeper服务器:

bin/zkServer.sh start
4.3 使用Zookeeper客户端

可以通过以下命令启动Zookeeper客户端:

bin/zkCli.sh -server localhost:2181

然后,你可以在客户端执行创建、读取、更新和删除(CRUD)ZNode的命令,如下所示:

# 创建节点
create /myapp "Hello Zookeeper"# 读取节点数据
get /myapp# 更新节点数据
set /myapp "New Data"# 删除节点
delete /myapp

5. Zookeeper的工作原理

Zookeeper在分布式系统中的工作原理涉及多个方面:

5.1 Zookeeper的数据结构

Zookeeper的数据以树状目录结构存储,每个节点称为ZNode。ZNode可以保存数据和子节点。主要有两种类型的ZNode:

  • 持久节点(Persistent ZNode): 节点的生命周期与客户端会话无关,即使客户端断开连接,节点依然存在。
  • 临时节点(Ephemeral ZNode): 节点的生命周期依赖于客户端会话,当客户端断开连接后,节点会自动删除。
5.2 选举过程

Zookeeper使用Zab协议(Zookeeper Atomic Broadcast)来实现分布式一致性。Zab协议包含两种模式:消息广播和领导者选举。在领导者选举过程中,所有节点会进行投票,选出一个唯一的领导者(Leader)。选举过程如下:

  1. 所有服务器启动后进入选举状态。
  2. 每个服务器投票给自己,并发送给其他服务器。
  3. 收到投票后进行比对,更新投票并再次发送。
  4. 重复投票过程,直到大多数服务器达成一致,选出领导者。
5.3 写操作的处理

客户端发送写操作请求到Zookeeper,由Leader处理。Leader为请求分配事务ID(zxid),并将提议发给所有Follower。Follower收到提议并持久化后,发送确认信息给Leader。Leader收到半数以上Follower的确认后,提交事务,并通知所有Follower进行确认。

5.4 读操作的处理

读请求可以由任何服务器处理。客户端连接到某个Zookeeper服务器,发起读请求。该服务器直接读取内容并返回给客户端。

6. 实际案例:实现分布式锁

在分布式系统中,分布式锁是一种常见需求。我们可以通过Zookeeper来实现分布式锁机制:

概述

通过创建临时顺序节点来实现分布式锁的竞争,节点序列最小的获得锁,其余的监听比自己小的节点,释放锁时将节点删除,通知下一个节点进行竞争。

代码示例
import org.apache.zookeeper.*;public class DistributedLock {private static final String LOCK_ROOT = "/locks";private ZooKeeper zk;private String lockNode;public DistributedLock(ZooKeeper zk) {this.zk = zk;try {if (zk.exists(LOCK_ROOT, false) == null) {zk.create(LOCK_ROOT, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}} catch (Exception e) {e.printStackTrace();}}public void lock() {try {lockNode = zk.create(LOCK_ROOT + "/lock_", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);// Watch for the node preceding the created nodewhile (true) {List<String> children = zk.getChildren(LOCK_ROOT, false);Collections.sort(children);if (lockNode.endsWith(children.get(0))) {break;}// Wait for the previous node to be deletedint index = Collections.binarySearch(children, lockNode.substring(LOCK_ROOT.length() + 1));String previousNode = children.get(index - 1);final String previousNodePath = LOCK_ROOT + "/" + previousNode;final CountDownLatch latch = new CountDownLatch(1);zk.getData(previousNodePath, event -> {if (event.getType() == Watcher.Event.EventType.NodeDeleted) {latch.countDown();}}, null);latch.await();}} catch (Exception e) {e.printStackTrace();}}public void unlock() {try {if (lockNode != null) {zk.delete(lockNode, -1);lockNode = null;}} catch (Exception e) {e.printStackTrace();}}
}
使用示例
public class DistributedLockTest {public static void main(String[] args) throws Exception {ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);DistributedLock lock = new DistributedLock(zk);lock.lock();System.out.println("Acquired lock!");// Perform some critical section operationsThread.sleep(2000);lock.unlock();System.out.println("Released lock!");zk.close();}
}

7. 总结

Zookeeper作为分布式协调服务,广泛应用于各种分布式系统中。本篇文章详细介绍了Zookeeper的基本概念、使用方法和工作原理,并通过一个实际例子展示了如何实现分布式锁。希望这篇文章能够帮助大家更好地理解和应用Zookeeper。

如有任何问题或建议,欢迎在评论区讨论交流! 🙌


参考文献

  • Zookeeper 官方网站
  • Zookeeper Documentation

感谢阅读,祝大家在分布式系统开发中遇到的问题迎刃而解!🎉


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

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

相关文章

【Go系列】RPC和grpc

承上启下 介绍完了Go怎么实现RESTFul api&#xff0c;不可避免的&#xff0c;今天必须得整一下rpc这个概念。rpc是什么呢&#xff0c;很多人都想把rpc和http一起对比&#xff0c;但是他们不是一个概念。RPC是一种思想&#xff0c;可以基于tcp&#xff0c;可以基于udp也可以基于…

【STM32嵌入式系统设计与开发---拓展】——1_10矩阵按键

这里写目录标题 1、矩阵按键2、代码片段分析 1、矩阵按键 通过将4x4矩阵按键的每一行依次设为低电平&#xff0c;同时保持其它行为高电平&#xff0c;然后读取所有列的电平状态&#xff0c;可以检测到哪个按键被按下。如果某列变为低电平&#xff0c;说明对应行和列的按键被按下…

Android焦点之FocusWindow切换流程

关键调用是setInputWindows InputDispatcher::dispatchFocusLocked&#xff1a;在这里打印日志"Focus entering" 或 "Focus leaving" SurfaceFlinger::updateInputFlingernotifyWindowInfos();mWindowInfosListenerInvoker->windowInfosChanged(windo…

深度学习落地实战:识别火车票信息

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …

高阶面试-hw算法整理

坚持最近一个星期把每道题搞熟悉 文章目录 1154一年中的第几天[125. 验证回文串](https://leetcode.cn/problems/valid-palindrome/)[344. 反转字符串](https://leetcode.cn/problems/reverse-string/)[20. 有效的括号](https://leetcode.cn/problems/valid-parentheses/)[392.…

【Java】详解抽象类和接口的区别

一、抽象类和接口的主要区别表格 特性抽象类接口声明关键字abstractinterface声明访问修饰符public、protected、default&#xff08;不能用private&#xff09;public、default继承关键字extendsimplements变量跟普通类一样&#xff0c;可以包含实例变量、静态变量等 只能包含…

excel表怎么增乱序单词表 和正序单词表四六级要来了?!Excel帮你构建自己的单词库

excel表怎么增乱序单词表 和正序单词表四六级要来了&#xff1f;&#xff01;Excel帮你构建自己的单词库 1.背单词的第一步&#xff0c;当然是先上网找电子版的单词集。 盘搜搜 2. 建立 xls 格式的表格 3. 把下载的单词数据 复制到 表格 粘贴 4.新建一列 辅助列 生成随机数来…

murmurhash3算法的go语言实现

MurmurHash的定义 MurmurHash 是一种非加密型哈希函数&#xff0c;适用于一般的哈希检索操作。由Austin Appleby在2008年发明&#xff0c;并出现了多个变种&#xff0c;都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比&#xff0c;对于规律性较强的key&…

网络编程-TCP/IP

网络概述 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机组合在一起。 每层实现不同的功能&#xff0c;其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务&#xff0c;同时使用下层提供的服务 网络体系结构…

SpringMVC注解全解析:构建高效Web应用的终极指南 (上)

SpringMVC 是一个强大的 Web 框架&#xff0c;广泛应用于 Java Web 开发中。它通过注解简化了配置&#xff0c;增强了代码的可读性。本文将全面解析 SpringMVC 中常用的注解及其用法&#xff0c;帮助你构建高效的 Web 应用。 一. MVC介绍 MVC 是 Model View Controller 的缩写…

数字通云平台 智慧政务OA PayslipUser SQL注入漏洞复现

0x01 产品简介 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术,为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平,推动电子政务向更高层次发展。 0x02 漏洞概述 数字通云平台 智慧政务OA Paysli…

在vue2中引入一个js文件, 在模版中不能使用js中的变量解决

在 Vue 2 中&#xff0c;如果你引入一个 JavaScript 文件&#xff0c;并希望在模板中使用该文件中的变量&#xff0c;通常有几个常见的问题和解决方法&#xff1a; 1. 作用域问题 在 Vue 模板中&#xff0c;只能访问到 Vue 实例中的数据和方法&#xff0c;而无法直接访问外部…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

差分进化(Differential Evolution)算法

一、差分进化&#xff08;Differential Evolution&#xff09;算法的起源 差分进化算法&#xff08;DE&#xff09;是一种基于群体的进化算法&#xff0c;由Rainer Storn和Kenneth Price在1995年提出。它是一种全局优化算法&#xff0c;适用于处理多种优化问题&#xff0c;包括…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号&#xff08;重要&#xff09;&#xff1a; 1、在mysql没啥区别 2、在pgsql中&#xff0c;实际字符串用单引号&#xff0c;双引号相当于mysql的,用来包含关键字&#xff1b; -- 单引号&#xff0c;表示user_name的字符串实际值 insert into t_user(user_nam…

浏览器跨tab页面通信方式总结

需求&#xff1a; 浏览器不同 tab 标签页之间是独立的&#xff0c; 如果要通信必须通过特殊手段来实现跨标签页通信。 1.StorageEvent 事件 当一个标签页 localStorage 变化时&#xff08;sessionStorage 无效&#xff09;&#xff0c;同源下另一个或其他所有标签页使用 DO…

python多级表头汇总

需求&#xff1a;将图一的数据展示为图二样式 图一&#xff1a; 图二&#xff1a; 图一具体的Excel截图 图二具体样式 python解决办法&#xff1a; # 导入 pandas 库&#xff0c;用于数据处理 import pandas as pd# 加载 Excel 文件 file_path 多级表头读取实例.xl…

科研绘图系列:R语言circos图(circos plot)

介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…

【BUG】已解决:SyntaxError invalid syntax

SyntaxError invalid syntax 目录 SyntaxError invalid syntax 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

C?C++?

c和C的区别主要是&#xff1a; 1、语言使用难度不同C难度大于C#大于C语言。 2、面向的对象不同C 语言是面向过程的&#xff0c;而 C 是面向对象的&#xff0c;C# 是一种完全面向对象的语言。 3、函数形式不同C 语言有标准的函数库&#xff0c;它们松散的&#xff0c;只是把功能…