Zookeeper是ApacheHadoop项目下的一个子项目,是一个树形目录服务。
Zookeeper翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、
Pig(小猪)的管理员,简称zk
Zookeeper是一个分布式的、开源的应用程序的协调服务。
zookeeper提供的主要功能包括:
配置管理
在多个应用程序(或服务器)中,假如存在一些相同的配置信息,在对该配置信息进行修改时,我们需要一个一个进行修改,这样会大大增加维护的成本,不方便管理。这时如果使用一个专门放配置中心的组件,将相同的配置信息放在配置中心,需要的时候直接拉取,这样可以大大节约维护的成本,而zookeeper即可实现配置中心的功能。
分布式锁:
在多个用户访问同一台主机上的应用程序数据时,我们可以通过加锁解决并发操作的问题,但是如果有多台主机相同的应用程序要访问同一数据时,这个时候我们在一台主机上加锁是不能解决另一台主机的并发问题的,换句话说自己的锁只对自己有效并不影响别的,这个时候就需要分布式锁解决这类问题,我个人理解分布式锁像是从所有主机中抽取出来的一把锁,或者是有一把总锁对所有主机都有效。zookeeper可以实现分布式锁的功能
集群管理:
zookeeper作为注册中心,管理服务提供方的ip地址端口号url信息,并在服务消费方请求需要时发送给服务消费方
zookeeper服务器是用Java创建的,运行在JVM之上。需要安装JDK7以上版本(最好JDK8或以上)
官网下载地址:
ApacheZooKeeper
下载在本地之后可以把安装包上传到服务器或者虚拟机中,我使用的是服务器并远程shell连接
1.使用xshell远程连接服务器,在opt目录下新建一个zookeeper目录
2.使用xftp将刚才下载的安装包上传到zookeeper目录下
3.进入zookeeper目录下解压
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
保存退出!
每个子目录如/node1都被称作一个znode(节点)。这个znode是被它所在的路径唯一标识
znode可以有子节点目录,并且每个znode可以存储数据
znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份
数据
**znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通
知设置监控的客户端**
1.持久节点(默认)2.持久顺序节点3.临时节点4.临时顺序节点
1.create节点pathdata
创建一个节点。并给节点绑定数据(默认是持久性节点)
2.create-s节点pathdata
创建持久性顺序节点
3.create-e节点pathdata
创建临时性节点
4.create-e-s节点pathdata
创建临时顺序节点
(注意:临时节点不能含有任何子节点)
连接ZooKeeper服务端./zkCli.sh-serverip:port如果是本机连接可以不写ip:port
断开连接quit
CRUD
1.设置(修改)节点值
set节点pathvalue
2.查看命令帮助help
3.删除单个节点
delete节点path
4.显示指定目录下节点
ls目录名
5.删除带有子节点的节点
deleteall节点path
6.创建节点
create节点pathvalue
7.获取节点值
get节点path
8.查看路径下节点信息及子节点lss节点路径
9.查看节点状态stat节点path
节点监听机制watch
客户端可以监测znode节点的变化。Zonode节点的变化触发相应的事件,然后清除对该节点的监
测。当监测一个znode节点时候,Zookeeper会发送通知给监测节点。在shell终端一个Watch事件是一个一次性
的触发器,当被设置了Watch的数据或者目录发生了改变的时候,则服务器将这个改变发送给设置了
Watch的客户端以便通知它们。
1.ls-w节点path监听节点目录的变化
新建一个会话连接对/app1的目录进行修改,增加一个子节点
然后监听就失效了,因为是一次性的
2.get-w节点path监听节点数据的变化
修改节点信息
触发监听,并且之后监听就失效了
导入zookeeper的依赖包和junit的测试包
打印出结果,成功连接!
通过Java代码进行修改
监听成功!并发现Java代码进行监听是永久的,不是一次性的