大数据技术之Zookeeper

2023-11-16

第1章 Zookeeper入门

1.1 概述

Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

1.2 特点

1 ) Zookeeper:一个领导者 (Leader),多个跟随者 (Follower) 组成的集群;

2 ) 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器;

3 ) 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。

4 ) 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。

5 ) 数据更新原子性,一次数据更新要么成功,要么失败

6 ) 实时性,在一定时间范围内,Client能读到最新数据

1.3 数据结构

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。

1.4 应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

  1. 统一命名服务

  1. 统一配置管理

  1. 统一集群管理

  1. 服务器节点动态上下线

  1. 软负载均衡


第2章 Zookeeper安装

ZooKeeper有两种安装模式,最简单的方式是

  • 最简单的方式是单机模式(standalone mode),它只需要在一台机器上面运行,

  • 另一种方式是集群模式,集群模式需要多台服务器部署。

https://blog.csdn.net/m0_49683806/article/details/124626742

2.2 配置参数解读

Zookeeper中的配置文件zoo.cfg中参数含义解读如下:

1)tickTime = 2000:通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒

2)initLimit = 10:LF初始通信时限

Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量)

3)syncLimit = 5:LF同步通信时限

Leader和Follower之间通信时间如果超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。

4)dataDir:保存Zookeeper中的数据

注意:默认的tmp目录,容易被Linux系统定期删除,所以一般不用默认的tmp目录。

5)clientPort = 2181:客户端连接端口,通常不做修改。


第3章 Zookeeper实战

3.1 选举机制

  • SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致

  • ZXID:事务IDZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。

  • Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。

Zookeeper 选举机制分为两种情况:

  1. 第一次启动

(1) 服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;

(2) 服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING;

(3) 服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服各器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING

(4) 服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING:

(5) 服务器5启动,同4一样当小弟

  1. 非第一次启动

选举Leader规则:1. Epoch大的直接胜出;2. Epoch相同,事务id大的胜出。

3.2 客户端命令行操作

3.2.1 命令行语法

命令基本语法

功能描述

help

显示所有操作命令

ls path

使用 ls 命令来查看当前znode的子节点 [可监听]

-w 监听子节点变化

-s 附加次级信息

create

普通创建

-s 含有序列

-e 临时(重启或者超时消失)

get path

获得节点的值 [可监听]

-w 监听节点内容变化

-s 附加次级信息

set

设置节点的具体值

stat

查看节点状态

delete

删除节点

deleteall

递归删除节点

1)启动客户端

[atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh -server hadoop102:2181

2)显示所有操作命令

[zk: hadoop102:2181(CONNECTED) 1] help

3.2.2 znode节点数据信息

1)查看当前znode中所包含的内容

[zk: hadoop102:2181(CONNECTED) 0] ls /

2)查看当前节点详细数据

[zk: hadoop102:2181(CONNECTED) 5] ls -s /
[zookeeper]
cZxid = 0x0    # 创建节点的事务zxid
        # 每次修改ZooKeeper状态都会产生一个ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每次修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
#######################################
ctime = Thu Jan 01 08:00:00 CST 1970 # znode被创建的毫秒数(从1970年开始)
mZxid = 0x0    # znode最后更新的事务zxid
mtime = Thu Jan 01 08:00:00 CST 1970    # znode最后修改的毫秒数(从1970年开始)
pZxid = 0x0    # znode最后更新的子节点zxid
cversion = -1    # znode子节点变化号,znode子节点修改次数
dataVersion = 0    # znode数据变化号
aclVersion = 0    # znode访问控制列表的变化号
ephemeralOwner = 0x0    # 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
dataLength = 0    # znode的数据长度
numChildren = 1    # znode子节点数量

3.2.3 节点类型(持久/短暂/有序号/无序号)

1)分别创建2个普通节点(永久节点 + 不带序号)

[zk: localhost:2181(CONNECTED) 3] create /sanguo "diaochan"
Created /sanguo

[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo "liubei"
Created /sanguo/shuguo

2)创建带序号的节点(永久节点+ 带序号)

#(1)先创建一个普通的根节点/sanguo/weiguo
[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"
Created /sanguo/weiguo

# (2)创建带序号的节点
[zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/zhangliao "zhangliao"
Created /sanguo/weiguo/zhangliao0000000000

[zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/zhangliao "zhangliao"
Created /sanguo/weiguo/zhangliao0000000001

[zk: localhost:2181(CONNECTED) 4] create -s /sanguo/weiguo/xuchu "xuchu"
Created /sanguo/weiguo/xuchu0000000002

3)创建短暂节点(短暂节点 + 不带序号or 带序号)

#(1)创建短暂的不带序号的节点
[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo

#(2)创建短暂的带序号的节点
[zk: localhost:2181(CONNECTED) 2] create -e -s /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo0000000001

#(3)在当前客户端是能查看到的
[zk: localhost:2181(CONNECTED) 3] ls /sanguo 
[wuguo, wuguo0000000001, shuguo]

#(4)退出当前客户端然后再重启客户端
[zk: localhost:2181(CONNECTED) 12] quit
[atguigu@hadoop104 zookeeper-3.5.7]$ bin/zkCli.sh

#(5)再次查看根目录下短暂节点已经删除
[zk: localhost:2181(CONNECTED) 0] ls /sanguo
[shuguo]

4)修改节点数据值

[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"

3.2.4 监听器原理

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper会通知客户端。监听机制保证ZooKeeper保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。

  1. 监听原理详解

1 ) 首先要有一个main()线程

2 ) 在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信 (connet) ,一个负责监听 (listener)

3 ) 通过connect线程将注册的监听事件发送给Zookeeper;

4 ) 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中;

5 ) Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程;

6 ) listener线程内部调用了process()方法

  1. 常见的监听

1 ) 监听节点数据的变化 get path [watch]

2 ) 监听子节点增减的变化 ls path [watch]

  1. 节点的值变化监听

#(1)在hadoop104主机上注册监听/sanguo节点数据变化
[zk: localhost:2181(CONNECTED) 26] get -w /sanguo 

#(2)在hadoop103主机上修改/sanguo节点的数据
[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"

#(3)观察hadoop104主机收到数据变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo

注意:在hadoop103再多次修改/sanguo的值,hadoop104上不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。

  1. 节点的子节点变化监听(路径变化)

#(1)在hadoop104主机上注册监听/sanguo节点的子节点变化
[zk: localhost:2181(CONNECTED) 1] ls -w /sanguo 
[shuguo, weiguo]

#(2)在hadoop103主机/sanguo节点上创建子节点
[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin"simayi"
Created /sanguo/jin

#(3)观察hadoop104主机收到子节点变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo

注意:节点的路径变化,也是注册一次,生效一次。想多次生效,就需要多次注册。

3.2.5 节点删除与查看

#1)删除节点
[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin

#2)递归删除节点
[zk: localhost:2181(CONNECTED) 15] deleteall /sanguo/shuguo

#3)查看节点状态
[zk: localhost:2181(CONNECTED) 17] stat /sanguo
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000011
mtime = Wed Aug 29 00:21:23 CST 2018
pZxid = 0x100000014
cversion = 9
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1

3.3 写数据流程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据技术之Zookeeper 的相关文章

随机推荐

  • 爽!一个注解,搞定 SpringBoot 操作日志

    来源 blog csdn net weixin 43954303 article details 113781801 使用方式 基本使用 源码 此组件解决的问题是 谁 在 什么时间 对 什么 做了 什么事 本组件目前针对 Spring bo
  • hadoop实践(一)环境准备

    1 安装linux或者安装linux虚拟机 本人是安装linux虚拟机centos 至于网上很多用乌班图 我觉的因为是实践 所以基本无差 2 安装ssh linux 一般自带 rpm qa grep ssh 3 创建 hadoop用户 用r
  • Git、GitHub和Gitee的使用

    Git GitHub和Gitee之间的关系 1 Git 是一个开源的分布式版本控制系统 简单来说就是可以通过使用git去管理项目 我们可以将项目存放在一个仓库中 通过git去管理这个仓库 以此来达到管理项目的目的 2 GitHub是一个基于
  • 剑指Offer 62 -- 圆圈中最后剩下的数字

    剑指Offer 62 圆圈中最后剩下的数字 题目 0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 删除后从下一个数字开始计数 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆
  • Python语言基础—if判断和循环总结

    系列文章目录 Python语言基础 注释的作用及分类 Python语言基础 常用运算符总结 Python语言基础 定义变量与数据类型 Python语言基础 if判断和循环总结 Python语言基础 理解面向对象 Python语言基础 集合的
  • 新专辑《AI秘籍》,你所感兴趣的一切

    Hi 大家好 我时茶桁 最近 我花了几天时间仔细思考了一下即将要开始写的专栏 AI秘籍 再根据自己的能力大概规划了一下 目前大致已经理出了一些相关信息可以分享给大家 专栏形式 本次专栏应该会以文章的形式先和大家见面 后续还会根据能力以原本的
  • 十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型

    导论 前面几篇文章我们分别从 一 C10K问题经典问答 二 java nio ByteBuffer用法小结 三 Channel 通道 四 Selector选择器 五 Centos Linux安装nc 六 windows环境下netcat的安
  • C++ 类大小分析

    以下测试代码的运行环境 Ubuntu 16 04 4 LTS gcc version 4 8 5 x64 空类 单一继承的空类 多重继承的空类所占空间大小为 1 字节 实例在内存中都有一个独一无二的地址 为了达到这个目的 编译器往往会给一个
  • 编译原理-总概

    语言执行过程 代码 解释器编译器 机器代码 cpu执行 编译型语言 在程序在执行之前需要一个专门的编译过程 通过编译器把程序编译成为可执行文件 再由机器运行这个文件 运行时不需要重新翻译 直接使用编译的结果就行了 解释型语言 是一边执行一边
  • NFT 笔记:我的加密艺术品投资逻辑

    There really is no such things as Art There are only artists 没有大写的艺术这种东西 只有艺术家 贡布里希 艺术的故事 撰文 小毛哥 Mao 推特 porounclemao 每当身
  • 钉钉F1 RK3399 咸鱼80元板子使用记录

    1 简单介绍 12V电源 建议2A 默认插电不开机 有大佬找到金属罩下的焊盘 短接可上电开机 在usb旁边的旁边有个端子接口 短接就可以开机 建议找个一样大的接口接个开关 到目前为止还未测试需要哪种接口 其它接口暂时不知 谁舍得拆一个钉钉F
  • 谷粒商城高级篇(36)——商品上架之上传数据到Elasticsearch

    商品上架之上传数据到Elasticsearch 功能需求分析 分析 怎么设计存储结构来保存数据 空间换时间 时间换空间 最终方案 存储结构 关于 nested 类型 商品上架功能实现 guimall common pom xml com x
  • resnet50网络结构_轻量(高效)目标检测网络结构设计

    目标检测网络可以分成如图的5个部分 input image 输入图像的大小对整个网络推断耗时有最直接的影响 小的图像 自然整个网络推断时间就会大大减少 一般来说 输入图像大小与网络深度正相关 即 大图像需要更深的网络提取更好的特征 back
  • JS下setTimeout与setInterval二者的差异

    JS下setTimeout与setInterval二者的差异 很多人都觉得这两个方法差不多 但是 实际上 他们差的很远呢 因为setTimeout 表达式 延时时间 在执行时 是在载入后延迟指定时间后 去执行一次表达式 记住 次数是一次 而
  • Linux I2C 驱动实验

    一 I2C 驱动 本章同样以 I MX6U ALPHA 开发板上的 AP3216C 这个三合一环境光传感器为例 通过 AP3216C 讲解一下如何编写 Linux 下的 I2C 设备驱动程序 Linux 的驱动分离与分层的思想 因此 Lin
  • 数据库DML数据操作语言

    文章目录 DML 数据操作语言 1 插入数据 INSERT 1 1 语法 1 2 插入默认值 注意事项 1 3 全列插入 2 修改数据 UPDATE 2 1 语法 注意 2 2 修改指定记录 添加WHERE子句 1 WHERE子句中常用的条
  • 前端面试之开发中遇到的问题【建议收藏】

    N1 精度问题 0 1 0 2 0 3 使用math js或者big js解决问题致命 重视 N2 频繁请求问题 点击按钮发送请求 但是不能疯狂发请求 等到结果返回后可再次发送请求 可以定义一个flag待请求结束打开flag 1 代码习惯
  • 年底了,清空自己,让心归零!

    眨眼一年 荏苒半生 时光总是别样匆匆 其实这一生 不就是一年一年这样过着 转眼到中年 而后到老年 时间总是悄无声息 让你我措手不及 转眼就年底了 我们都该学会沉淀自己 把过往一键清零 让未来一切重头 年底了 做个总结吧 这一年以来 让你觉得
  • 为何出现Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes ...

    当在IDEA中连接Redis时出现 Java HotSpot 64 Bit Server VM warning Sharing is only supported for boot loader classes because bootst
  • 大数据技术之Zookeeper

    第1章 Zookeeper入门 1 1 概述 Zookeeper是一个开源的分布式的 为分布式框架提供协调服务的Apache项目 Zookeeper从设计模式角度来理解 是一个基于观察者模式设计的分布式服务管理框架 它负责存储和管理大家都关