Zookeeper详解(从安装—入门—简单使用)
-
- 1.zookeeper概念
- 2.zookeeper的安装
-
- 2.1环境准备:
- 2.2下载
- 2.3上传并安装
- 2.4配置
- 2.5启动zookeeper
- 3.zookeeper内存模型
-
- 3.1模型
- 3.2模型的特点:
- 3.3节点的分类:
- 4.zookeeper配置文件详解
- 5.zookeeper客户端常用命令
- 6.Java客户端操作
-
- 6.1连接zk server服务端
- 6.2创建节点
- 6.3查看某个节点信息
- 6.4修改节点信息
- 6.5查看当前节点所有子节点
- 6.6监听
1.zookeeper概念 Zookeeper是 Apache Hadoop项目下的一个子项目,是一个树形目录服务。
Zookeeper翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、
Pig(小猪)的管理员,简称zk
Zookeeper是一个分布式的、开源的应用程序的协调服务。
zookeeper提供的主要功能包括:
- 配置管理
文章图片
- 分布式锁:
文章图片
- 集群管理:
文章图片
zookeeper作为注册中心,管理服务提供方的ip地址端口号url信息,并在服务消费方请求需要时发送给服务消费方
2.zookeeper的安装 2.1环境准备:
zookeeper服务器是用Java创建的,运行在JVM之上。需要安装JDK7以上版本(最好JDK8或以上)
2.2下载
官网下载地址:
Apache ZooKeeper
2.3上传并安装
下载在本地之后可以把安装包上传到服务器或者虚拟机中,我使用的是服务器并远程shell连接
1.使用xshell 远程连接服务器,在opt目录下新建一个zookeeper目录
文章图片
2.使用xftp将刚才下载的安装包上传到zookeeper目录下
文章图片
3.进入zookeeper目录下解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
文章图片
4. 安装成功!
文章图片
2.4配置
进入conf配置目录
文章图片
zoo_sample.cfg就是配置文件,但是此文件不能生效,需要名称为zoo.cfg的文件才能生效
改名复制一份配置文件
文章图片
编辑配置文件zoo.cfg /tmp/zookeeper这个目录是zookeeper用于存储持久化的数据到本地的,但是服务器默认是没有的
文章图片
进入opt/zookeeper目录下,新建一个目录zkdata(目录名随意取)用于存放zookeeper的持久化数据
文章图片
复制此目录/opt/zookeeper/zkdata,将zoo.cfg配置文件中的dataDir修改为/opt/zookeeper/zkdata
文章图片
保存退出!
2.5启动zookeeper
文章图片
启动成功!
3.zookeeper内存模型 3.1模型
文章图片
3.2模型的特点:
- 每个子目录如/node1都被称作一个znode(节点)。这个znode是被它所在的路径唯一标识
- znode可以有子节点目录,并且每个znode可以存储数据
- znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份
数据 - znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通
知设置监控的客户端
1.持久节点(默认) 2.持久顺序节点 3.临时节点 4.临时顺序节点
1.create 节点path data
创建一个节点。并给节点绑定数据(默认是持久性节点)
2.create -s 节点path data
创建持久性顺序节点
3.create -e 节点path data
创建临时性节点
4.create -e -s 节点path data
创建临时顺序节点
(注意:临时节点不能含有任何子节点)
4.zookeeper配置文件详解
文章图片
5.zookeeper客户端常用命令 连接ZooKeeper服务端
./zkCli.sh -server ip:port 如果是本机连接可以不写 ip:port
断开连接 quit
CRUD
1.设置(修改)节点值
set 节点path value
2.查看命令帮助
help
3.删除单个节点
delete 节点path
4.显示指定目录下节点
ls 目录名
5.删除带有子节点的节点
deleteall 节点path
6.创建节点
create 节点path value
7.获取节点值
【中间件|Zookeeper详解(从安装—入门—使用)】get 节点path
8.查看路径下节点信息及子节点
ls s 节点路径
9.查看节点状态
stat 节点path
节点监听机制watch
客户端可以监测znode节点的变化。Zonode节点的变化触发相应的事件,然后清除对该节点的监
测。当监测一个znode节点时候,Zookeeper会发送通知给监测节点。在shell终端一个Watch事件是一个一次性
的触发器,当被设置了Watch的数据或者目录发生了改变的时候,则服务器将这个改变发送给设置了
Watch的客户端以便通知它们。
1.ls -w 节点path 监听节点目录的变化
文章图片
新建一个会话连接 对/app1的目录进行修改,增加一个子节点
文章图片
文章图片
然后监听就失效了,因为是一次性的
2.get -w 节点path 监听节点数据的变化
文章图片
修改节点信息
文章图片
触发监听,并且之后监听就失效了
文章图片
6.Java客户端操作 导入zookeeper的依赖包和junit的测试包
junit
junit
4.12
>provided
com.101tec
zkclient
0.10
6.1连接zk server服务端
@Before
public void before() {
//参数1--> zk server 服务ip地址:端口号
//参数2 -->会话超时时间
//参数3--> 连接超时时间
//参数4--> 序列化方式
zkClient = new ZkClient("ip:端口号", 60000 * 30, 60000, new SerializableSerializer());
}private ZkClient zkClient;
@Test
public voidtest01(){
System.out.println(zkClient);
} @After
public void after() {zkClient.close();
}
文章图片
打印出结果,成功连接!
6.2创建节点
@Test
public void test() {
//创建持久节点
zkClient.create("/app2", "xue", CreateMode.PERSISTENT);
//创建持久顺序节点
zkClient.create("/app3","yue", CreateMode.PERSISTENT_SEQUENTIAL);
//创建临时节点
zkClient.create("/app4","qing", CreateMode.EPHEMERAL);
//创建临时顺序节点
zkClient.create("/app5","haha",CreateMode.EPHEMERAL_SEQUENTIAL);
}
6.3查看某个节点信息
@Test
public void test2(){
//查看某个节点数据,需要保证创建和获取的数据序列化方式相同,如果是在linux上创建的节点那么在Java上获取就会出现序列化不匹配的异常
Object o = zkClient.readData("/app2");
System.out.println(o);
//查看节点状态
Stat stat = new Stat();
System.out.println(o);
//查看节点创建时间
System.out.println(stat.getCtime());
//查看版本
System.out.println(stat.getCversion());
//查看id
System.out.println(stat.getCzxid());
}
文章图片
6.4修改节点信息
zkClient.writeData("/app2","xueyueqing");
6.5查看当前节点所有子节点
@Test
publicvoid test4(){List> children = zkClient.getChildren("/");
for(String c : children ){
System.out.println(c);
}}
6.6监听
@Test
publicvoid test5() throws IOException {zkClient.subscribeDataChanges("/app1", new IZkDataListener() {
//当前节点数据变化时触发
@Override
public void handleDataChange(String dataPath, Object o) throws Exception {
System.out.println("当前节点路径"+dataPath);
System.out.println("当前节点信息"+o);
}
//当前节点删除时触发
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("当前节点路径"+dataPath);
}
});
//阻塞当前监听
System.in.read();
}
注意:在shell终端修改,Java是监听不了的,必须使用Java代码修改
通过Java代码进行修改
文章图片
文章图片
监听成功!并发现Java代码进行监听是永久的,不是一次性的
@Test
publicvoid test6() throws IOException {
//监听节点目录变化
zkClient.subscribeChildChanges("/app1", new IZkChildListener() {
@Override
public void handleChildChange(String s, List> list) throws Exception {
System.out.println("父节点名称:"+s);
System.out.println("发生变化后孩子节点名称:");
for(String child : list){
System.out.println(child);
}
}
});
//阻塞当前监听
System.in.read();
}
在/app1目录下创建节点name
文章图片
监听成功!
文章图片
推荐阅读
- 蓝桥杯|蓝桥杯-新枚举方法应用
- 技能大赛&网络系统管理|ChinaSkills-网络系统管理(2021年全国职业院校技能大赛A-1 模块 A(Linux 环境 评分标准 ))
- java|java基础-(一)-JDK的下载和安装
- Linux|Linux C/C++ 开发(学习笔记十三)(百万并发的服务器实现)
- Java|【Java】Swing程序设计 将helloworld显示到窗体中
- java|湖南工程师用中文编写操作系统,还发明了甲、乙、丙语言(??)
- Kafka|Kafka选型 操作系统、磁盘、磁盘容量、宽带
- java|重磅(向996开炮!携程带头居家办公。)
- Java毕业设计项目实战篇|Java项目:网上花店商城系统(java+jsp+servlert+mysql+ajax)