ZooKeeper 入门:初学者指南
在分布式系统领域,协调和同步至关重要。Apache ZooKeeper 是一种分布式协调服务,是帮助管理和同步分布式环境中服务的基本组件。本指南旨在深入分析 ZooKeeper、其架构及其在现代分布式系统中的作用。我们还将探索一个示例来展示其实际影响。
ZooKeeper 简介
ZooKeeper 是 Apache 软件基金会开发的一个开源项目。它旨在提供用于维护配置信息、命名、提供分布式同步和提供组服务的集中服务。ZooKeeper 的目标是使这些任务可靠且易于实现。
主要特征
- 协调服务:ZooKeeper 提供了一组原语来实现更高级别的同步服务,例如分布式锁、领导者选举和障碍。
- 高可用性:ZooKeeper 设计为高可用性和可靠性,确保其提供的服务始终可用。
- 最终一致性:ZooKeeper 通过在服务器仲裁中复制数据来实现最终一致性,这确保即使某些服务器出现故障,数据仍然可访问。
- 原子性:ZooKeeper 中的所有操作都是原子的,确保它们要么成功完成,要么根本不产生任何影响。
- 顺序保证:ZooKeeper 保证数据更新按顺序排序,确保所有客户端的数据视图一致。
ZooKeeper 架构
ZooKeeper 在集群中运行,集群通常由多台服务器组成。该架构基于复制服务模型,集群中的每台服务器都维护整个系统状态的副本。ZooKeeper 架构的关键组件包括:
- Leader:Leader 服务器负责处理所有来自客户端的写入请求,确保所有状态变更都一致地复制到 Follower 服务器。
- 追随者:追随者服务器从领导者那里复制状态。该进程读取来自客户端的请求并参与领导者选举过程。
- 客户端:客户端是与 ZooKeeper 集合交互以执行各种协调任务的应用程序或服务。
领导者选举
领导者选举是 ZooKeeper 架构的一个重要方面。当领导者发生故障时,跟随服务器将参与选举过程以选出新的领导者。这可确保即使领导者服务器发生故障,系统仍可正常运行。
数据模型
ZooKeeper 的数据模型类似于分层文件系统。它将数据存储在称为“znodes”树的树状结构中。树中的每个节点称为 znode,它可以存储数据并具有子 znode。znode 有两种类型:
持久性 Znode:这些 znode 一直存在,直到被明确删除。
临时 Znode:这些 znode 仅在创建它们的会话处于活动状态时存在。
安装和配置 ZooKeeper
设置 ZooKeeper 涉及以下步骤:
步骤 1.下载 ZooKeeper
从Apache ZooKeeper 网站下载 ZooKeeper 的最新稳定版本。
步骤 2.安装 ZooKeeper
解压下载的档案并导航到解压的目录。目录结构应包括以下内容:
- bin:包含启动和停止ZooKeeper的可执行脚本。
- conf:包含配置文件。
- lib:包含所需的库。
步骤 3.配置 ZooKeeper
zoo.cfg在目录中创建一个名为的配置文件conf。以下是示例配置:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=10
syncLimit=5
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
- tickTime:ZooKeeper使用的基本时间单位,以毫秒为单位。
- dataDir:ZooKeeper 存储其数据的目录。
- clientPort:ZooKeeper 将监听客户端连接的端口。
- initLimit:允许追随者与领导者连接并同步的时间(以刻度为单位)。
- syncLimit:允许追随者与领导者同步的时间(以刻度为单位)。
- server.X:ZooKeeper 集合中的服务器列表。
步骤 4.启动 ZooKeeper
使用以下命令启动 ZooKeeper 服务器:
bin/zkServer.sh start
要检查 ZooKeeper 服务器的状态,请使用:
bin/zkServer.sh status
使用 ZooKeeper
一旦 ZooKeeper 启动并运行,客户端就可以连接到 ZooKeeper 集合并执行各种操作。
创建一个Znode
要创建 znode,请使用zkCli.sh命令行界面连接到 ZooKeeper 服务器:
bin/zkCli.sh -server localhost:2181
使用以下命令创建 znode create:
create /myapp "Hello ZooKeeper"
此命令创建一个名为/myapp“Hello ZooKeeper”的znode。
从 Znode 读取数据
要从 znode 读取数据,请使用以下get命令:
get /myapp
此命令检索存储在 znode 中的数据/myapp。
更新 Znode 中的数据
要更新 znode 中的数据,请使用以下set命令:
set /myapp "Updated Data"
此命令将znode中的数据更新/myapp为“已更新的数据”。
删除 Znode
要删除 znode,请使用以下delete命令:
delete /myapp
此命令删除/myappznode。
示例,实现分布式锁
ZooKeeper 的一个常见用例是实现分布式锁。分布式锁用于确保多个进程不会同时执行同一任务。
步骤 1. 创建锁定 Znode
创建一个将用作锁的 znode:
create /lock ""
步骤 2. 获取锁
为了获取锁,客户端在/lockznode 下创建一个临时顺序 znode:
create -e -s /lock/lock_ ""
此命令在 下创建一个临时顺序 znode /lock,例如/lock/lock_0000000001。
步骤 3. 检查锁所有权
然后,客户端检查它创建的 znode 是否在所有 znode 下具有最低的序列号/lock。如果是,则客户端已获取锁定。否则,客户端将监视具有下一个最低序列号的 znode。
步骤 4. 释放锁
当客户端完成其任务时,它会删除其创建的 znode,并释放锁:
delete /lock/lock_0000000001
实际影响
使用 ZooKeeper 实现分布式锁可确保只有一个进程可以在任何给定时间获取锁,从而防止竞争条件并确保数据一致性。此机制在分布式应用程序中特别有用,因为服务的多个实例可能会同时尝试访问共享资源。
结论
Apache ZooKeeper 是一种功能强大且可靠的分布式应用程序协调服务。其架构基于复制服务模型,可确保高可用性和一致性。通过提供分布式同步、配置管理和组服务原语,ZooKeeper 简化了分布式系统中复杂协调任务的实施。
本指南介绍了 ZooKeeper 的基础知识,从其架构和安装到实际使用示例。有了这个基础,您可以开始利用 ZooKeeper 构建强大且可扩展的分布式应用程序。
相关文章:
ZooKeeper 入门:初学者指南
在分布式系统领域,协调和同步至关重要。Apache ZooKeeper 是一种分布式协调服务,是帮助管理和同步分布式环境中服务的基本组件。本指南旨在深入分析 ZooKeeper、其架构及其在现代分布式系统中的作用。我们还将探索一个示例来展示其实际影响。 ZooKeeper…...
【数据结构(邓俊辉)学习笔记】二叉搜索树04——AVL树
文章目录 1.重平衡1.1 AVL BBST1.2 平衡因子1.3 适度平衡1.4 接口1.5 失衡 复衡 2. 插入2.1 单旋2.2 双旋2.3 实现 3. 删除3.1 单旋3.2 双旋3.3 实现 4. (3 4)-重构4.1 "34"重构4.2 "34"实现4.3 rotateAt4.4 综合评价 1.重平衡 1…...
SpringMVC基础详解
文章目录 一、SpringMVC简介1、什么是MVC2、MVC架构模式与三层模型的区别3、什么是SpringMVC 二、HelloWorld程序1、pom文件2、springmvc.xml3、配置web.xml文件4、html文件5、执行Controller 三、RequestMapping注解1、value属性1.1、基础使用1.2、Ant风格(模糊匹配…...
SQL SERVER 设置端口
要在SQL Server中设置端口,可以通过SQL Server Configuration Manager来完成。以下是详细的步骤: 1. 打开SQL Server Configuration Manager 在Windows中,按 Win R 键打开运行窗口。输入 SQLServerManager<version>.msc 并按回车。例…...
华芯微特2024慕尼黑上海电子展预告
7月8日-7月10日,2024慕尼黑上海电子展在上海新国际博览中心举办。华芯微特展号:E4.4815,诚意邀请各位莅临参观。 公司介绍 华芯微特是一家由留美归国资深技术团队创立的中国芯片设计公司,是国家高新技术企业。2014年进军MCU产业,专…...
DETR End-to-End Object Detection with Transformers
End-to-End Object Detection with Transformers 论文链接:http://arxiv.org/abs/2005.12872 代码地址:https://github.com/facebookresearch/detr 一、摘要 提出了一种将目标检测视为直接集合预测问题的新方法。该方法简化了检测流程,有效…...
【后端面试题】【中间件】【NoSQL】ElasticSearch 节点角色、写入数据过程、Translog和索引与分片
中间件的常考方向: 中间件如何做到高可用和高性能的? 你在实践中怎么做的高可用和高性能的? Elasticsearch节点角色 Elasticsearch的节点可以分为很多种角色,并且一个节点可以扮演多种角色,下面列举几种主要的&…...
【TB作品】玩具电子琴,ATMEGA128单片机,Proteus仿真
题目 7 :玩具电子琴 基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴,能够实现弹奏和音符显示功 能。 具有 8 个音阶按键,每按下一个按键时,所对应的 LED 点亮,音符进行显示。 具体要求如下: &…...
1974Springboot医院远程诊断管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 springboot医院远程诊断管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库…...
SQL游标的应用场景及使用方法
SQL游标的应用场景及使用方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨SQL中游标的应用场景及使用方法。游标在SQL中是一种重要的数据…...
LLama-Factory使用教程
本文是github项目llama-factory的使用教程 注意,最新的llama-factory的github中训练模型中,涉及到本文中的操作全部使用了.yaml配置。 新的.yaml的方式很简洁但不太直观,本质上是一样的。新的readme中的.yaml文件等于下文中的bash指令 PS: …...
Java面试题:讨论在Java Web应用中实现安全的认证和授权机制,如使用Spring Security
在Java Web应用中,实现安全的认证和授权是至关重要的,Spring Security是一个强大的框架,可以简化这项工作。以下是详细讨论如何在Java Web应用中使用Spring Security实现安全的认证和授权机制。 Spring Security简介 Spring Security是一个…...
如何在Vue3项目中使用Pinia进行状态管理
**第一步:安装Pinia依赖** 要在Vue3项目中使用Pinia进行状态管理,首先需要安装Pinia依赖。可以使用以下npm命令进行安装: bash npm install pinia 或者如果你使用的是yarn,可以使用以下命令: bash yarn add pinia *…...
【初阶数据结构】深入解析队列:探索底层逻辑
🔥引言 本篇将深入解析队列:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 &#…...
Go 语言环境搭建
本篇文章为Go语言环境搭建及下载编译器后配置Git终端方法。 目录 安装GO语言SDK Window环境安装 下载 安装测试 安装编辑器 下载编译器 设置git终端方法 总结 安装GO语言SDK Window环境安装 网站 Go下载 - Go语言中文网 - Golang中文社区 还有 All releases - The…...
javascript v8编译器的使用记录
我的机器是MacOS Mx系列。 一、v8源码下载构建 1.1 下载并更新depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH/path/to/depot_tools:$PATH 失败的话可能是网络问题,可以试一下是否能ping通,连…...
C语言--vs使用调试技巧
1.什么是bug? 1.产品说明书中规定要做的事情,而软件没有实现。 2.产品说明书中规定不要做的事情,而软件确实现了。 3.产品说明书中没有提到过的事情,而软件确实现了。 4.产品说明书中没有提到但是必须要做的事情,软件确没有实…...
Spring Boot中的国际化配置
Spring Boot中的国际化配置 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中实现国际化配置,使得应用能够轻松…...
WPF的IValueConverter用于校验和格式化TextBox的数字输入
在数据绑定(Data Binding)的上下文中,我们经常使用继承 IValueConverter 接口的类,用于在源值和目标值之间进行转换。该接口定义了两个方法:Convert 和 ConvertBack,这两个方法分别用于从源值到目标值的转换…...
SQL Server的守护神:Always On 高可用性详解
🛡️ SQL Server的守护神:Always On 高可用性详解 在企业级应用中,数据的可用性和业务连续性至关重要。SQL Server的Always On功能提供了一个高可用性解决方案,确保数据库服务的持续运行和快速故障恢复。本文将详细解释SQL Serve…...
别再只会用QProgressBar了!用QPainterPath绘制Qt自定义进度条的完整指南
用QPainterPath实现Qt动态进度条的终极艺术 当标准进度条无法满足现代UI设计需求时,Qt的绘图系统为我们打开了无限可能。想象一下:你的应用加载界面不是单调的横条,而是会呼吸的光环、跳动的粒子流或是随音乐律动的波形——这些令人眼前一亮的…...
C语言main函数怎么写?6种写法教你正确使用入口函数
名为main的函数,是C程序的入口之处的函数,也就是程序的执行,是从main函数起始的,对于其他函数的调用,也是直接或者间接地,在main函数当中被调用的。那么main函数又究竟是被谁所调用的呢?答案是操…...
百川2-13B-4bits开源模型GPU算力适配:验证在RTX 4090D上支持max_new_tokens=2048
百川2-13B-4bits开源模型GPU算力适配:验证在RTX 4090D上支持max_new_tokens2048 1. 引言:当大模型遇上消费级显卡 如果你手头有一块RTX 4090D显卡,可能会好奇:它能流畅运行多大的语言模型?能生成多长的文本ÿ…...
终极指南:如何用DeepSpeech构建离线语音识别系统
终极指南:如何用DeepSpeech构建离线语音识别系统 【免费下载链接】DeepSpeech DeepSpeech is an open source embedded (offline, on-device) speech-to-text engine which can run in real time on devices ranging from a Raspberry Pi 4 to high power GPU serve…...
BJT与MOSFET高频模型对比指南:5个关键差异点帮你选对晶体管
BJT与MOSFET高频模型对比指南:5个关键差异点帮你选对晶体管 在射频电路设计中,晶体管的高频特性往往决定了整个系统的性能上限。对于刚踏入这一领域的设计师而言,BJT(双极型晶体管)和MOSFET(金属氧化物半导…...
Fluent | 动网格技术解析与应用场景
1. 动网格技术到底是什么? 第一次接触动网格这个概念时,我也是一头雾水。简单来说,动网格就是让计算流体力学(CFD)模拟中的网格能够"动起来"的技术。想象一下你在用Fluent模拟一个活塞在气缸里的运动&#x…...
实测AI净界抠图能力:发丝、玻璃杯、薄纱,复杂边缘处理全展示
实测AI净界抠图能力:发丝、玻璃杯、薄纱,复杂边缘处理全展示 1. 为什么我们需要更智能的抠图工具? 在日常工作和创作中,抠图是一个绕不开的环节。无论是电商产品图处理、平面设计还是AI训练数据准备,我们都希望快速获…...
【 MySQL 】第三节 - 约束实战全攻略
🌟【深度剖析】MySQL 约束实战全攻略:从建表到外键行为管理(附避坑指南) 前言 在数据库设计中,约束(Constraint) 是保障数据一致性、完整性和业务逻辑性的“安全锁”。日前我系统学习了 MySQL…...
告别零散烧录:一个脚本搞定Petalinux 2020.1 ZynqMP QSPI全镜像生成与烧写
告别零散烧录:Petalinux 2020.1 ZynqMP QSPI全镜像自动化生成实战 在嵌入式Linux开发中,QSPI Flash烧录往往是最后一道工序,也是最容易出错的环节之一。传统分步烧录方式不仅效率低下,还容易因地址偏移计算错误导致启动失败。本文…...
告别WechatRealFriends:WeFriends帮你实现微信好友关系管理无缝过渡
告别WechatRealFriends:WeFriends帮你实现微信好友关系管理无缝过渡 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRe…...
