一:简介

zk就是一个分布式文件系统,不过存储数据的量极小。

这个技术虽然比较小和简单,但是大数据领域还是离不开它的,比如:

 hadoop集群,kafka集群,hbase 等都需要zk的支持。

1. zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现,是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。

2. 提供了基于类似Unix系统的目录节点树方式的数据存储。

3. 可用于维护和监控存储的数据的状态的变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理。

比如namenode 启动两个 namenode1 namenode2

4. 提供了一组原语(机器指令),提供了java和c语言的接口

通俗的理解:
1、zk其实是一个小型的文件存储系统,可以存放少量的数据,这些数据不是什么正儿八经的数据,都是一些关于服务器的小数据。
2、它可以感知服务器是否上线,是否掉线。
3、我们为什么要学习这个东西?我们可以使用zk搭建集群环境。
比如:hadoop的高可用(HA),namenode 存在单节点故障。我们可以启用两个namenode,一个挂掉了,另一个自动启动。另一个namenode如何知道第一个namenode挂掉了?zk就可以做到。
包括:HBase也会使用到。
Java架构中: zk进行分布式锁等操作。

各个版本下载界面:https://zookeeper.apache.org/releases.html

二:特点

1. 也是一个分布式集群,一个领导者(leader),多个跟随者(follower).
2. 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务。
3. 全局数据一致性:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
4. 更新请求按顺序进行:来自同一个client的更新请求按其发送顺序依次执行
5. 数据更新的原子性:一次数据的更新要么成功,要么失败
6. 数据的实时性:在一定时间范围内,client能读到最新数据。

三:数据存储

结构是从根节点开始的/
每一个子节点都可以有其他子节点(节点数不限),也可以在该节点上存放数据,这个来讲有点像Unix.结构如图:

四:安装

安装之前:先关闭服务器(搭建的分布式集群每台的都要关)的防火墙 !!!!!

systemctl stop firewalld 关闭防火墙

systemctl disable firewalld 开机不启动防火墙

1.上传zookeeper的压缩包到 虚拟机的/opt/modules下面(我使用的MobaXterm直接拖拽到左侧对应的目录中)

2.解压 /opt/installs下面

tar -zxvf apache-zookeeper-3.6.4-bin.tar.gz -C /opt/installs/

3.重命名

mv apache-zookeeper-3.6.4-bin/ zookeeper

4.修改配置文件

进入到/opt/installs/zookeeper/conf文件夹下,重命名zoo_sample.cfg

mv  zoo_sample.cfg   zoo.cfg

MobaXterm中右键文件点击“使用...打开”使用nodepad++修改这个配置文件

或者使用vi进入这个配置文件输入i或者o进入编辑模式修改文件

在新版本的 zk 中,需要添加 ;2181,否则报如下错误

记得在zookeeper中创建zkData文件夹,以及myid文件

配置环境变量:

环境变量可以配置在很多地方, /etc/profile

建议放在 /etc/profile.d/myenv.sh但咱电脑没啥东西可以用上边的路径

在/etc/profile中写入

export ZOOKEEPER_HOME=/opt/installs/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

写入后刷新环境变量

source /etc/profile

接着是其他的设备(myscp是自己写的脚本可以把文件分发到其他设备,xcall也是自己写的可以在其他服务器上批量执行命令)

myscp /opt/installs/zookeeper

myscp /etc/profile

xcall source /etc/profile

在链接其他分布式服务器中,修改myid 为2,3.....

在每一台电脑上,都启动zkServer

xcall zkServer.sh start

因为zookeeper安装的节点比较多,每一个一个个操作非常的繁琐,所以我们可以编写一个脚本,管理zookeeper集群。(不必须)

在/usr/local/bin或sbin下面,创建zk.sh代码如下:

#!/bin/bash

# 获取参数
COMMAND=$1
if [ ! $COMMAND ]; then
    echo "please input your option in [start | stop | status]"
    exit -1
fi
if [ $COMMAND != "start" -a $COMMAND != "stop" -a $COMMAND != "status" ]; then
    echo "please input your option in [start | stop | status]"
    exit -1
fi

# 所有的服务器
HOSTS=( hadoop11 hadoop12 hadoop13 )
for HOST in ${HOSTS[*]}
do
    ssh -T $HOST << TERMINATOR
    echo "---------- $HOST ----------"
    zkServer.sh $COMMAND 2> /dev/null | grep -ivh SSL
    exit
TERMINATOR
done

给所有用户添加可执行权限

chmod u+x zk.sh

使用

zk.sh start
zk.sh stop
zk.sh status

五:zookeeper的shell操作(新版本)-3.5以上

zkServer.sh version

查看 zookeeper 的版本

1)连接zkServer

zkCli.sh   直接回车,连接的是本机的节点
create /bigdata
set /bigdata "我是数据"        --修改数据
get /bigdata
[zk: localhost:2181(CONNECTED) 1] ls /zookeeper
[config, quota]
[zk: localhost:2181(CONNECTED) 2] set /qingyun "我是数据"
Node does not exist: /qingyun
[zk: localhost:2181(CONNECTED) 3] create /qingyun
Created /qingyun
[zk: localhost:2181(CONNECTED) 4] set /qingyun "我是数据"
[zk: localhost:2181(CONNECTED) 5] ls /qingyun
[]
[zk: localhost:2181(CONNECTED) 6] get /qingyun
我是数据
zkCli.sh -server hadoop12:2181

2) ls 查看某个路径下的子节点

ls  /
ls /zookeeper
ls -s /zookeeper   可以查看某个节点的详细的信息   【版本不同命令不同】
[zk: bigdata02:2181(CONNECTED) 3] ls -s /zookeeper
[config, quota]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2

3)get 查看某个节点上的数据

get /bigdata01
get -s /bigdata01  【版本不同命令不同】
[zk: bigdata02:2181(CONNECTED) 4] get /qingyun
我是数据
[zk: bigdata02:2181(CONNECTED) 5] get -s /qingyun
我是数据
cZxid = 0x200000003
ctime = Fri May 16 16:10:05 CST 2025
mZxid = 0x200000004
mtime = Fri May 16 16:10:09 CST 2025
pZxid = 0x200000003
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0

4) create 创建节点

-- 一口气创建多个节点,假如中间有不存在的节点,报错
[zk: bigdata02:2181(CONNECTED) 6] create /qingyun/a/b
Node does not exist: /qingyun/a/b
[zk: bigdata02:2181(CONNECTED) 7] create /qingyun/a
Created /qingyun/a
[zk: bigdata02:2181(CONNECTED) 8] create /qingyun/a/b
Created /qingyun/a/b
-- 创建一个临时节点,断开连接之后,下一次再进入,节点消失
[zk: bigdata02:2181(CONNECTED) 9] create -e /linshi
Created /linshi
[zk: bigdata02:2181(CONNECTED) 10] quit


[zk: bigdata02:2181(CONNECTED) 0] ls /
[qingyun, zookeeper]
-- 创建一个带有序号的节点
[zk: bigdata02:2181(CONNECTED) 1] create -s /xunhao
Created /xunhao0000000002
[zk: bigdata02:2181(CONNECTED) 2] ls /
[qingyun, xunhao0000000002, zookeeper]
[zk: bigdata02:2181(CONNECTED) 3] create -s /xunhao
Created /xunhao0000000003
[zk: bigdata02:2181(CONNECTED) 4] create -s /xunhao
Created /xunhao0000000004
-- 创建一个又临时又有序号的节点
[zk: bigdata02:2181(CONNECTED) 5] create -e -s /linshixunhao
Created /linshixunhao0000000005

临时节点,只要客户端和服务器端断开连接,临时节点就会被删除
永久节点:断开连接,不会删除。

节点类型

描述信息

EPHEMERAL

临时节点,在会话结束后自动被删除。

EPHEMERAL_SEQUENTIAL

临时顺序节点,在会话结束后会自动被删除。会在给定的path节点名称后添加一个序列号。

PERSISTENT

永久节点,在会话结束后不会被自动删除。

PERSISTENT_SEQUENTIAL

永久顺序节点,在会话结束后不会被自动删除。会在给定的path节点名称后添加一个序列号。

5)set 在节点上设置数据

set /bigdata01 "HelloWorld"

6) delete 删除节点

它只能删除没有子节点的数据

deleteall 可以删除整个节点,包含下面的子节点

delete /bigdata    如果删除带有子节点的节点,delete是删除不掉的
delete 只能删除单个节点
deleteall /bigdata   deleteall可以删除一个节点以及节点下的所有子节点

7) watch 监听

给一个节点添加监听,这个节点有任何变动都会被监听到
addWatch /bigdata
比如修改数据: set /bigdata "修改数据"
比如创建子节点:create /bigdata/data01
比如删除节点: delete /bigdata/data01
查看节点不会触发监听。

移除监听:
removewatches /bigdata
再次创建子节点发现无法触发监听:create /bigdata/data01

quit --> 断开连接

六:Linux上的一个集成工具(kafka-ui)

在linux系统中安装

解压缩

tar -zxvf kafka-ui-lite-1.2.11-bin.tar.gz -C /opt/installs/

重命名

mv kafka-ui-lite-1.2.11/ kafka-ui

修改环境变量:
export KAFKA_UI_HOME=/opt/installs/kafka-ui
export PATH=$PATH:$KAFKA_UI_HOME/bin

刷新环境变量: source /etc/profile

启动:
[root@bigdata01 installs]# cd kafka-ui/bin
[root@bigdata01 bin]# ls
kafkaUI.bat  kafkaUI.sh
[root@bigdata01 bin]# ./kafkaUI.sh start

访问:

http://hadoop11:8889/

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐