1、 因部署的是cdh5的Hadoop版本,因此这里安装的是配套的zk
2、 在服务器进行下载:
wget http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.16.2.tar.gz
3、 解压:
tar -zxvf zookeeper-3.4.5-cdh5.16.2.tar.gz -C ../app/ 到另外一个文件夹。
4、 在conf目录下复制一个配置文件
cp zoo_sample.cfg zoo.cfg
5、 修改配置文件
dataDir=/home/ruoze/app/tmp/zookeeper
这个目录是用来存储数据用的
6、 zk经典通讯端口:
clientPort=2181
7、 设置环境变量
export ZOOKEEPER_HOME=/home/ruoze/app/zookeeper
export PATH=${ZOOKEEPER_HOME}/bin:.$PATH
8、 启动:
在bin目录下执行脚本:
./zkServer.sh start
9、 查看状态:
在bin目录下执行脚本:
./zkServer.sh status
10、 启动后会有一个QuorumPeerMain的进程,通过jps来查看。
11、 在/home/ruoze/app/tmp/zookeeper目录下产生文件夹以及文件:
version-2
zookeeper_server.pid
其中文件中存储的是当前进程的pid
12、 zk的数据模型
在bin目录下使用命令
./zkCli.sh
数据模型类似于一个目录结构(树形结构),层次化的目录结构
每一个节点:znode -> 唯一的路径标识
唯一的路径 -> 存储的数据是有版本号的,如果数据进行了修改操作,版本号会加一。
修改或者删除操作的时候是可以指定版本号的,如果版本号 不匹配,会报错的。
znode上存储的数据不宜过大,几K就了不起了,因为存储的都是一些类似于端口号这种数据。
znode是可以设置权限的,用来控制访问权限。
znode可以设置监听器,如果设置了监听,因为集群中每个节点是一样的,在任何一个客户端的节点发生变化之后,通过监听器,其他的客户端也会收到,或者取到最新的信息。
znode有两种类型:
临时的:(工作中偶尔会用到)
当前会话有效。客户端退出之后就不能访问了,会被删掉。
不能再有子节点。已经是最底层。
永久的:(工作中常用)
永久有效。其他的客户端也可以访问到,除非用命令删除。
节点下还可以再有子节点。
znode有四种形式:
永久/持久
永久/持久带顺序编号
临时
临时带编号(分布式锁的实现)
13、 help命令
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
a.set path data [version]
对某个节点(路径设置一个值),版本可有可无。
b.ls path [watch]
展示,展示节点下面还有那些节点,类似于linux服务器的ls。
c.setAcl path acl
设置权限,对某个路径设置acl。
d.delete path [version]
删除节点
e.sync path
同步节点
f.rmr path
递归删除
g.get path [watch]
get一个路径,可以加监听。
h.create [-s] [-e] path data acl
创建一个路径 [带顺序的] [临时的] 节点 数据 acl
i.quit
退出
14、 命令使用
a.创建节点
create /ruoze ruoze-data
返回值:Created /ruoze
b.获取节点
get /ruoze
ruoze-data(znode的数据)
cZxid = 0x4(身份编号)(c->创建,m->修改)
ctime = Thu Aug 20 17:18:18 CST 2020
mZxid = 0x4
mtime = Thu Aug 20 17:18:18 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 0(数据版本)
aclVersion = 0
ephemeralOwner = 0x0(描述是否临时节点,一般临时节点的值比较长,此处为永久节点)
dataLength = 10(数据的长度)
numChildren = 0(有几个子节点)
c.创建临时节点
create -e /ruoze/tmp ruoze-data
返回值:Created /ruoze/tmp
d.获取临时节点
get /ruoze/tmp
ruoze-data
cZxid = 0x5
ctime = Thu Aug 20 17:23:13 CST 2020
mZxid = 0x5
mtime = Thu Aug 20 17:23:13 CST 2020
pZxid = 0x5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x17409dd4ae40001(临时节点,比较长)
dataLength = 10
numChildren = 0
e.quit,退出,再次get /ruoze/tmp
没有数据,因为是临时节点,只有当前session有效
f.顺序节点创建
create -s /ruoze/seq seq
返回值:Created /ruoze/seq0000000001
再次使用相同命令创建:
create -s /ruoze/seq seq
返回值:Created /ruoze/seq0000000002
(001,002就是一个顺序)
g.创建多级目录
create /ruoze/a/b/c abc
返回值:Node does not exist: /ruoze/a/b/c(没有类似于mkdir -p的操作方式,只能一个一个做)
h.修改
set /ruoze new-data
cZxid = 0x4
ctime = Thu Aug 20 17:18:18 CST 2020
mZxid = 0xd
mtime = Thu Aug 20 18:20:30 CST 2020
pZxid = 0xc
cversion = 6
dataVersion = 1 (版本发生变化)
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 4
再次获取:
get /ruoze
new-data
cZxid = 0x4
ctime = Thu Aug 20 17:18:18 CST 2020
mZxid = 0xd
mtime = Thu Aug 20 18:20:30 CST 2020
pZxid = 0xc
cversion = 6
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 4
(操作一次,版本加一)
i.修改,带版本号
set /ruoze 123 1 (1是版本号)
返回值:
cZxid = 0x4
ctime = Thu Aug 20 17:18:18 CST 2020
mZxid = 0xe
mtime = Thu Aug 20 18:22:59 CST 2020
pZxid = 0xc
cversion = 6
dataVersion = 2(版本变化)
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 4
j.修改,带着版本号1,模拟并发的场景
set /ruoze 456 1
返回值:version No is not valid : /ruoze(报错,版本不对,====》乐观锁)
k.删除
delete /ruoze/seq0000000001
get一下:
get /ruoze
123
cZxid = 0x4
ctime = Thu Aug 20 17:18:18 CST 2020
mZxid = 0xe
mtime = Thu Aug 20 18:22:59 CST 2020
pZxid = 0x10
cversion = 7
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 3
删除的时候如果带着版本号,那么版本号一定要能够匹配上,不然也会报错。
15、 监听
给znode添加监听,监听成功后,当数据发生变化,可以拿到最新的数据
1)监听最底层的znode
2)监听带子znode的(目录,文件夹)
A、监听最底层的znode
a.删除之前的新建的 rmr /ruoze
b.stat 命令:查看监听状态(不存在的目录也可以加监听,虽然会报错,但是当创建的时候会自动追加上监听操作)
stat /ruoze watch
返回值:Node does not exist: /ruoze
再次创建:create /ruoze 123
返回值:
WATCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/ruoze
Created /ruoze
总结:目录不管存在不存在,只要监听上了,当你创建节点,发生状态的改变,就可以监听到
c.查看监听
get /ruoze watch
123
cZxid = 0x15
ctime = Thu Aug 20 18:36:20 CST 2020
mZxid = 0x15
mtime = Thu Aug 20 18:36:20 CST 2020
pZxid = 0x15
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
set /ruoze 456
WATCHER::cZxid = 0x15(被监听到)
WatchedEvent state:SyncConnected type:NodeDataChanged path:/ruoze(节点数据发生变化)
ctime = Thu Aug 20 18:36:20 CST 2020
mZxid = 0x16
mtime = Thu Aug 20 18:41:00 CST 2020
pZxid = 0x15
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
再次修改:set /ruoze 789
cZxid = 0x15(没有被监听,因为监听是一次性的!!!做不到永久监听)
ctime = Thu Aug 20 18:36:20 CST 2020
mZxid = 0x17
mtime = Thu Aug 20 18:42:48 CST 2020
pZxid = 0x15
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
d.监听删除
首先 get /ruoze watch
返回值:
789
cZxid = 0x15
ctime = Thu Aug 20 18:36:20 CST 2020
mZxid = 0x17
mtime = Thu Aug 20 18:42:48 CST 2020
pZxid = 0x15
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
删除节点:delete /ruoze
返回值:
WATCHER::(表明已经被监听到)
WatchedEvent state:SyncConnected type:NodeDeleted path:/ruoze
B、监听带子znode的(目录,文件夹)
a.先创建一个节点
create /ruoze 123
b.监听这个目录
ls /ruoze watch
C.创建子目录:
create /ruoze/abc 888
返回值:
Created /ruoze/abc
WATCHER:: (表明已被监听)
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ruoze
d,再添加一个子节点
create /ruoze/xyz 999
返回值:
Created /ruoze/xyz
e.再添加一个监听,监听在父节点头上
ls /ruoze watch
返回值:
[xyz, abc]
f.改变子节点的值:
set /ruoze/xyz 9090
返回值:
[xyz, abc] (没有监听到)
[zk: localhost:2181(CONNECTED) 9] set /ruoze/xyz 9090
cZxid = 0x1d
ctime = Fri Aug 21 07:27:55 CST 2020
mZxid = 0x1e
mtime = Fri Aug 21 07:35:44 CST 2020
pZxid = 0x1d
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
表明:可以监听到子节点的创建,但是对于子节点的变动,是监听不到的。
16、 zookeeper中的四字命令(命令都是四个字母组成的)
a.stat
server的信息以及连接的信息
使用:
echo stat|nc localhost 2181
返回值:
Zookeeper version: 3.4.5-cdh5.16.2--1, built on 06/03/2019 10:40 GMT
Clients:
/127.0.0.1:53744[1](queued=0,recved=542,sent=544)
/0:0:0:0:0:0:0:1:55246[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/5
Received: 543
Sent: 544
Connections: 2
Outstanding: 0
Zxid: 0x1e
Mode: standalone(节点的模式)
Node count: 7(节点的数量)
b.ruok
使用:
echo ruok|nc localhost 2181
返回值:
imok
c.dump
使用:用来查看临时节点
echo dump|nc localhost 2181
返回值:
SessionTracker dump:
Session Sets (3):
0 expire at Fri Aug 21 07:45:26 CST 2020:
0 expire at Fri Aug 21 07:45:36 CST 2020:
1 expire at Fri Aug 21 07:45:46 CST 2020:
0x1740def3e860000
ephemeral nodes dump:
Sessions with Ephemerals (0):
d.conf
使用:用来查看配置文件
echo conf|nc localhost 2181
返回值:
clientPort=2181
dataDir=/home/ruoze/app/tmp/zookeeper/version-2(数据目录)
dataLogDir=/home/ruoze/app/tmp/zookeeper/version-2(日志目录)
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
e.envi
使用:用来查看环境信息
echo envi|nc localhost 2181
返回值:
clientPort=2181
dataDir=/home/ruoze/app/tmp/zookeeper/version-2
dataLogDir=/home/ruoze/app/tmp/zookeeper/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
[root@ruozedata jdk1.8.0_251]# echo envi|nc localhost 2181
Environment:
zookeeper.version=3.4.5-cdh5.16.2--1, built on 06/03/2019 10:40 GMT
host.name=ruozedata
java.version=1.8.0_251
java.vendor=Oracle Corporation
java.home=/usr/java/jdk1.8.0_251/jre
java.class.path=/home/ruoze/app/zookeeper/bin/../build/classes:/home/ruoze/app/zookeeper/bin/../build/lib/*.jar:/home/ruoze/app/zookeeper/bin/../share/zookeeper/zookeeper-3.4.5-cdh5.16.2.jar:/home/ruoze/app/zookeeper/bin/../share/zookeeper/slf4j-log4j12-1.7.5.jar:/home/ruoze/app/zookeeper/bin/../share/zookeeper/slf4j-api-1.7.5.jar:/home/ruoze/app/zookeeper/bin/../share/zookeeper/netty-3.10.5.Final.jar:/home/ruoze/app/zookeeper/bin/../share/zookeeper/log4j-1.2.16.jar:/home/ruoze/app/zookeeper/bin/../share/zookeeper/jline-2.11.jar:/home/ruoze/app/zookeeper/bin/../src/java/lib/*.jar:/home/ruoze/app/zookeeper/bin/../conf:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=<NA>
os.name=Linux
os.arch=amd64
os.version=3.10.0-1127.el7.x86_64
user.name=ruoze
user.home=/home/ruoze
user.dir=/home/ruoze/app/zookeeper-3.4.5-cdh5.16.2/bin
f.wchs
使用:查看当前监听的数量
echo wchs|nc localhost 2181
返回值:
1 connections watching 1 paths
Total watches:1
17、 一台机器配多个zookeeper
只要改一下端口就行了
a.cp三份
b.修改第一个的conf文件中的zoo.cfg
dataDir=/home/ruoze/app/tmp/zookeeper001
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
c.另外两个看着修改
dataDir=/home/ruoze/app/tmp/zookeeper002
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
dataDir=/home/ruoze/app/tmp/zookeeper003
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
d.在目录/home/ruoze/app/tmp下创建文件夹:
mkdir zookeeper001
mkdir zookeeper002
mkdir zookeeper003
e.分别在刚才创建的文件夹下创建文件myid,写入对应的数字:1/2/3
f.分别在对应的文件夹下启动
./zkServer.sh start
查看启动状态:
./zkServer.sh status
返回值:
JMX enabled by default
Using config: /home/ruoze/app/zk001/bin/../conf/zoo.cfg
Mode: follower(从节点)
其余的两个里面有一个leader,一个follower
在启动第一个的时候,去查看状态,会报错,因为集群的leader是需要投票的,得票多的才是leader,当leader挂了之后,其余两个会发生选举,选出来一个leader。因此,zk的部署需要奇数个,只有当一半以上的机器可以提供服务就行。