文章目录

  • 前言
  • Zookeeper单机操作
  • 创建节点
  • 查看及修改节点内容
  • 创建并查看子节点
  • 删除节点
  • 节点监控
  • Zookeeper集群操作
  • 配置参数说明
  • 准备三个zookeeper
  • 修改配置文件
  • 启动测试
  • 启动客户端



Zookeeper单机操作
创建节点

首先单独开启一个终端,并通过./zkServer.sh start开启Zookeeper服务进程

[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

然后通过 ./zkCli.sh 进入客户端,并使用create命令,创建zookeeper节点。

创建节点内容语法 create [-s] [-e] path data acl
|- 其中-s(sequential)表示顺序节点,-e(ephemeral)表示临时节点。默认情况下,创建的是持久节点
|- path是节点路径,data是节点数据,acl是用来进行权限控制的。

#使用ls可以查看到根路径下,有一个zookeeper目录
[zk: localhost:2181(CONNECTED) 7] ls /
[zookeeper]

[zk: localhost:2181(CONNECTED) 8] create /sanguo luoguanzhong
Created /sanguo

[zk: localhost:2181(CONNECTED) 10] create -s /shuihu shinaian
Created /shuihu0000000001

[zk: localhost:2181(CONNECTED) 14] create -e /xiyou  wuchengen
Created /xiyou

[zk: localhost:2181(CONNECTED) 15] create -e -s /hongloumeng  caoxueqing
Created /hongloumeng0000000004

[zk: localhost:2181(CONNECTED) 8] ls /
[shuihu0000000001, xiyou, zookeeper, hongloumeng0000000004, sanguo]

大家注意看我是用不同的创建节点的方式,创建出来的节点名称和节点的生命周期是不一样的,当我使用-s的时候,表示该节点为顺序节点,在节点名称的后面会多出一长串数字,用于排序。而-e则表示ephemeral,那么当我的 客户端与zookeeper断开连接后,该节点会自动消失。

另外需要注意的是,如果Path路径不规范,则会抛出IllegalArgumentException非法参数异常。

[zk: localhost:2181(CONNECTED) 9] create -s shuihu shinaian  
Command failed: java.lang.IllegalArgumentException: Path must start with / character
查看及修改节点内容

我们再另起一个终端,获取水浒的内容,注意看dataVersion数据的版本号,现在是0。

查看节点内容语法 get path

[zk: localhost:2181(CONNECTED) 0] get /shuihu0000000001
shinaian
cZxid = 0x5
ctime = Sat Aug 31 09:43:10 CST 2019
mZxid = 0x5
mtime = Sat Aug 31 09:43:10 CST 2019
pZxid = 0x5
cversion = 0
dataVersion = 0 #没有被修改过,所以版本为0如果有修改过版本会自增
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

假设我们修改下文件内容呢?

修改节点内容语法 set path data (其中的data就是要更新的新内容)

[zk: localhost:2181(CONNECTED) 2] set /shuihu0000000001 guodegang
cZxid = 0x5
#创建时间 create time
ctime = Sat Aug 31 09:43:10 CST 2019 
mZxid = 0xc
#修改时间 modify time
mtime = Sat Aug 31 09:50:29 CST 2019
pZxid = 0x5
cversion = 0
dataVersion = 1

结果发现版本号dataVersion + 1变成1了。也就是说我们我们每修改一次节点,那么版本号就会加一。

创建并查看子节点

使用ls 目录路径命令可以查看指定节点下的所有子节点,以下查看根目录下的所有子节点:

#在sanguo节点下创建子节点
[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo liubei 
Created /sanguo/shuguo
[zk: localhost:2181(CONNECTED) 5] create /sanguo/wuguo sunquan
Created /sanguo/wuguo
[zk: localhost:2181(CONNECTED) 6] create /sanguo/weiguo caocao
Created /sanguo/weiguo
#查看所有子节点
[zk: localhost:2181(CONNECTED) 7] ls /sanguo
[wuguo, shuguo, weiguo]
删除节点

通常情况,使用delete 节点路径是可以删除节点的

[zk: localhost:2181(CONNECTED) 10] delete /shuihu0000000001
[zk: localhost:2181(CONNECTED) 11] ls /
[xiyou, zookeeper, hongloumeng0000000004, sanguo

但是当我们的节点有子节点时,使用delete命令是删除不掉的

[zk: localhost:2181(CONNECTED) 9] delete /sanguo
Node not empty: /sanguo

此时,我们可以通过rmr指令可以删除当前节点及子节点,rmr就是 remove as recursion 的意思

[zk: localhost:2181(CONNECTED) 12] rmr /sanguo
[zk: localhost:2181(CONNECTED) 13] ls /       
[xiyou, zookeeper, hongloumeng0000000004]
节点监控

接着咱们再启动一个shell,使用客户端进行连接

[zk: localhost:2181(CONNECTED) 14] create /sanguo luoguanzhong
Created /sanguo
[zk: localhost:2181(CONNECTED) 15] set /sanguo jinyong
cZxid = 0x16
ctime = Sat Aug 31 10:05:16 CST 2019
mZxid = 0x17
mtime = Sat Aug 31 10:06:24 CST 2019
pZxid = 0x16
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

并在在另一终端上监听sanguo节点(相当于订阅这一类信息),监听节点的指令为get 节点路径 watch

[zk: localhost:2181(CONNECTED) 16] get /sanguo watch
luoguanzhong
cZxid = 0x16
ctime = Sat Aug 31 10:05:16 CST 2019
mZxid = 0x16
mtime = Sat Aug 31 10:05:16 CST 2019
pZxid = 0x16
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: localhost:2181(CONNECTED) 17] 
WATCHER::

不难发现,当被监听的节点信息发生改变之后,那么监听该节点的终端会收到节点被更改的信息WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo

zookeeper创建ttl节点报错 zookeeper怎么创建节点_子节点


其实监听的原理很简单,当我们在main线程中创建Zookeeper客户端时,此时main线程会fork出两个子线程。一个负责网络连接通信(connect),另一个负责监听(listener)。通过connect线程将注册的监听事件发送给Zookeeper,然后在Zookeeper的注册器列表中将注册的监听事件添加到注册监听器列表中。

当Zookeeper监听到被注册的节点的数据或者路径有变动时,就会将这个消息发送给listener线程,此时listener收到消息反馈之后就会回调proccess()方法。

一般来说监听分为监听数据的变化(get path [watch])以及监听子节点增减的变化(ls path [watch])。

zookeeper创建ttl节点报错 zookeeper怎么创建节点_zookeeper创建ttl节点报错_02


Zookeeper集群操作

单机操作呢,玩玩就可以了,接下来的集群操作才是重点,咱们还是通过案例来演示下效果,在演示之前,大家可以先看看Zookeeper集群中所用到的配置参数说明吧!

配置参数说明

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

tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。

它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)

initLimit =10:LF初始通信时限

集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。

syncLimit =5:LF同步通信时限

集群中Leader与Follower之间的最大响应时间单位,假如响应超过(syncLimit * tickTime),Leader认为Follwer死掉,从服务器列表中删除Follwer。

dataDir:数据文件目录+数据持久化路径,主要用于保存Zookeeper中的数据。

clientPort =2181:客户端连接端口监听客户端连接的端口。

准备三个zookeeper

首先新建集群的文件夹,然后准备三个zookeeper放入其中

#新建集群的文件夹
[root@localhost bin]# cd /usr/local/
[root@localhost local]# mkdir zk-cluster
[root@localhost local]# cd zk-cluster/
#复制三个zookeeper目录
[root@localhost zk-cluster]# cp -r /usr/local/zookeeper/ /usr/local/zk-cluster/zk1/
[root@localhost zk-cluster]# cp -r /usr/local/zookeeper/ /usr/local/zk-cluster/zk2/
[root@localhost zk-cluster]# cp -r /usr/local/zookeeper/ /usr/local/zk-cluster/zk3/
[root@localhost zk-cluster]# ls
zk1  zk2  zk3
修改配置文件

创建data目录和日志目录log

[root@localhost zk-cluster]# mkdir zk1/data
[root@localhost zk-cluster]# mkdir zk1/log
[root@localhost zk-cluster]# touch zk1/data/myid
[root@localhost zk-cluster]# mkdir zk2/data
[root@localhost zk-cluster]# mkdir zk3/data
[root@localhost zk-cluster]# touch zk2/data/myid
[root@localhost zk-cluster]# touch zk3/data/myid
[root@localhost zk-cluster]# mkdir zk2/log
[root@localhost zk-cluster]# mkdir zk3/log
[root@localhost zk-cluster]# vim zk1/conf/zoo.cfg 
[root@localhost zk-cluster]# vim zk2/conf/zoo.cfg 
[root@localhost zk-cluster]# vim zk3/conf/zoo.cfg

使用vim指令依次修改zk1zk2zk3的文件内容为123 此外zoo.cfg中的修改的内容如下(以下为zk1中的修改内容,其他两个配置文件的修改类似)。

zookeeper创建ttl节点报错 zookeeper怎么创建节点_客户端_03

zookeeper name

dataDir

clientPort

zk1

dataDir=/usr/local/zk-cluster/zk1/data

2181

zk2

dataDir=/usr/local/zk-cluster/zk2/data

2182

zk3

dataDir=/usr/local/zk-cluster/zk3/data

2183

最后在各个配置文件下都加上以下配置,其中第几个服务器(1、2、3)来自数据目录的myid文件,该文件里面保存着当前集群的标识(1、2、3),后面的ip代表将绑定那个ip地址,第一个端口:代表在集群内部,数据复制的接口,第二个端口代表:选举端口

server.1=192.168.144.143:2888:3888
server.2=192.168.144.143:2889:3889
server.3=192.168.144.143:2887:3887
启动测试

同时启动三台zookeeper测试

[root@localhost zk-cluster]# ./zk1/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zk-cluster/zk1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[root@localhost zk-cluster]# ./zk2/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zk-cluster/zk2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[root@localhost zk-cluster]# ./zk3/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zk-cluster/zk3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

结果发现zk3被选举出来当上了老大(Mode:leader)!另外两个当然就退居为小弟咯。

[root@localhost zk-cluster]# ./zk3/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zk-cluster/zk3/bin/../conf/zoo.cfg
Mode: leader
启动客户端

分别在三个终端上执行以下命令,启动三个客户端,格式为./bin/zkCli.sh -server host:port

./zk1/bin/zkCli.sh -server 192.168.144.143:2181
./zk1/bin/zkCli.sh -server 192.168.144.143:2182
./zk1/bin/zkCli.sh -server 192.168.144.143:2183

此时我在一台终端上创建/sanguo节点,另外一边的终端就可以获取这个节点信息啦!

zookeeper创建ttl节点报错 zookeeper怎么创建节点_子节点_04