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

ZooKeeper学习专栏(四):单机模式部署与基础操作详解

文章目录

  • 前言
  • 一、单机模式部署
    • 架构图
    • 部署流程:
  • 二、zkCli.sh命令行工具基础操作
  • 三、ACL权限控制实践
  • 学习资源


前言

本文是Zookeeper学习系列的第四篇,将详细讲解Zookeeper的单机模式部署过程以及基础命令行操作,包括节点管理、Watcher机制和ACL权限控制。


一、单机模式部署

架构图

Zookeeper单机模式架构
架构图说明:

  1. 客户端连接(蓝色部分)
    • 客户端应用:使用Zookeeper的应用程序
    • zkCli.sh:官方命令行工具
    • SDK:各种语言客户端库
    • 均通过TCP协议连接到Zookeeper服务端(默认端口2181)
  2. Zookeeper服务端(绿色部分)
    • 请求处理器:处理客户端请求的组件
    • 内存数据库:存储所有ZNode节点数据(DataTree)
    • 核心工作流程
客户端请求 → 请求处理器 → 更新内存数据库 → 写入事务日志
  1. 本地存储(紫色部分)
    • 事务日志:所有写操作的顺序记录(保证持久性)
    • 快照文件:内存数据库的定期序列化(加速恢复)
    • 配置文件:zoo.cfg中的核心配置项:
dataDir=/tmp/zookeeper/data  # 数据存储目录
clientPort=2181              # 客户端连接端口

部署流程:

1. 下载Zookeeper发行版
首先访问Apache Zookeeper官网下载最新稳定版。以3.8.0版本为例:

# 下载发行版
wget https://downloads.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz# 解压文件
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz# 进入目录
cd apache-zookeeper-3.8.0-bin

2. 修改基础配置文件
Zookeeper的配置文件位于conf/zoo_sample.cfg,我们需要复制并修改它:

cp conf/zoo_sample.cfg conf/zoo.cfg

编辑conf/zoo.cfg文件,重点关注以下两个参数:

# 数据存储目录(需要手动创建)
dataDir=/tmp/zookeeper/data# 客户端连接端口
clientPort=2181# 其他保持默认配置
tickTime=2000
initLimit=5
syncLimit=2

创建数据目录:

mkdir -p /tmp/zookeeper/data

3. 启动服务端和客户端
启动Zookeeper服务:

# 启动服务端
bin/zkServer.sh start# 查看服务状态
bin/zkServer.sh status

启动客户端连接:

bin/zkCli.sh -server 127.0.0.1:2181

二、zkCli.sh命令行工具基础操作

1. 基本节点操作
在客户端命令行中执行以下操作:

# 创建持久节点
[zk: localhost:2181(CONNECTED) 0] create /first_node "Hello Zookeeper"
Created /first_node# 获取节点数据
[zk: localhost:2181(CONNECTED) 1] get /first_node
Hello Zookeeper# 修改节点数据
[zk: localhost:2181(CONNECTED) 2] set /first_node "Updated data"# 列出节点
[zk: localhost:2181(CONNECTED) 3] ls /
[first_node, zookeeper]# 删除节点(只能删除无子节点的节点)
[zk: localhost:2181(CONNECTED) 4] delete /first_node

2. 节点类型实验
Zookeeper支持多种节点类型:

# 创建临时节点(会话结束自动删除)
[zk: localhost:2181(CONNECTED) 5] create -e /ephemeral_node "Temp data"# 创建顺序节点(自动追加序号)
[zk: localhost:2181(CONNECTED) 6] create -s /sequential_node "Seq data"
Created /sequential_node0000000001# 创建临时顺序节点(会话结束自动删除)
[zk: localhost:2181(CONNECTED) 7] create -e -s /ephemeral_seq_node "Both"
Created /ephemeral_seq_node0000000002

3. Watcher机制实践
Watcher是Zookeeper的核心特性,用于监听节点变化:

# 在会话1中注册监听
[zk: localhost:2181(CONNECTED) 8] create /watch_node "Initial"
[zk: localhost:2181(CONNECTED) 9] get -w /watch_node# 在会话2中修改节点
[zk: localhost:2181(CONNECTED) 0] set /watch_node "Changed"# 会话1将收到通知:
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node

同样可以监听子节点变化:

# 注册子节点监听
ls -w /parent_node# 当创建/删除子节点时会收到通知

4. 理解stat命令
stat命令提供节点的元数据信息:

[zk: localhost:2181(CONNECTED) 10] create /stat_demo "data"
[zk: localhost:2181(CONNECTED) 11] stat /stat_democZxid = 0x2f              # 创建事务ID
ctime = Mon Jul 21 15:30:00 CST 2025  # 创建时间
mZxid = 0x2f              # 最后修改事务ID
mtime = Mon Jul 21 15:30:00 CST 2025  # 最后修改时间
pZxid = 0x2f              # 最后子节点变更事务ID
cversion = 0              # 子节点版本号
dataVersion = 0           # 数据版本号(每次修改+1)
aclVersion = 0            # ACL版本号
ephemeralOwner = 0x0      # 临时节点所有者(0表示持久节点)
dataLength = 4            # 数据长度
numChildren = 0           # 子节点数量

三、ACL权限控制实践

Zookeeper通过ACL(Access Control Lists)实现节点权限控制:

# 1. 创建带ACL的节点(world:anyone只有读权限)
create /protected_node "sensitive" world:anyone:r# 2. 尝试修改(将失败)
set /protected_node "new data"
Authentication is not valid : /protected_node# 3. 添加认证信息
addauth digest user1:password1# 4. 设置ACL(digest模式)
setAcl /protected_node digest:user1:password1:crwda# 5. 现在可以操作节点了
set /protected_node "updated data"# 6. 查看ACL
getAcl /protected_node

ACL权限说明:

  • c:CREATE(创建子节点)
  • r:READ(读取节点数据)
  • w:WRITE(修改节点数据)
  • -d:DELETE(删除子节点)
  • a:ADMIN(设置ACL)

学习资源

  • Zookeeper官方文档
  • Zookeeper ACL详解
http://www.xdnf.cn/news/1161091.html

相关文章:

  • ruoyi-flowable-plus Excel 导入数据 Demo
  • 【qml-3】qml与c++交互第二次尝试(类型方式)
  • (9)机器学习小白入门 YOLOv:YOLOv8-cls 技术解析与代码实现
  • uni-app 开发小程序项目中实现前端图片压缩,实现方式
  • Java基础面试题
  • Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙
  • 芯谷科技--固定电压基准双运算放大器D4310
  • kafka 日志索引 AbstractIndex
  • 智慧场景:定制开发开源AI智能名片S2B2C商城小程序赋能零售新体验
  • Web开发:ABP框架12——中间件Middleware的创建和使用
  • delphi disqlite3 操作sqlite
  • 通信刚需小能手,devicenet转PROFINET网关兼容物流分拣自动化
  • 【Elasticsearch】IndexModule
  • 【Elasticsearch】BM25的discount_overlaps参数
  • SVM(Support Vector Machine)从入门到精通
  • [Python] -项目实战10- 用 Python 自动化批量重命名文件
  • odoo-059 xml中字段上写 domain 和 filter_domain 什么区别
  • 第三章自定义检视面板_创建自定义编辑器类_如何自定义预览窗口(本章进度5/9)
  • Ubuntu 22.04 安装 Jdk 8和 Tomcat (安装包形式)
  • 基于python django的BOSS直聘网站计算机岗位数据分析与可视化系统,包括薪酬预测及岗位推荐,推荐算法为融合算法
  • Sklearn 机器学习 IRIS数据 理解分类报告
  • Nginx IP授权页面实现步骤
  • 分布在内侧内嗅皮层(MEC)的带状细胞对NLP中的深层语义分析有什么积极的影响和启示
  • Zetane:让深度学习不再抽象,一键3D可视化
  • CFD总压边界条件的理解与开发处理
  • 深入解析 Linux 硬链接与软链接:原理、区别及应用场景
  • 用户虚拟地址空间布局架构
  • C语言:20250721笔记
  • 日历类生辰八字九九三伏入梅出梅算法
  • 【用unity实现100个游戏之34】使用环状(车轮)碰撞器(Wheel Collider)从零实现一个汽车车辆物理控制系统,实现一个赛车游戏