环境
- Ubuntu 22.04
- Zookeeper 3.7.1
- JDK 17.0.3.1
部署
首先访问 https://zookeeper.apache.org
,下载Zookeeper压缩包,我下载的是 apache-zookeeper-3.7.1-bin.tar.gz
,将其放到 /home/ding/Downloads
目录,并解压:
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
解压后生成 apache-zookeeper-3.7.1-bin
目录,为了方便,将其改名为 zookeeper_1
。之所以加上 _1
后缀,是为了将来部署多个Zookeeper实例时好区分。
将 conf/zoo_sample.cfg
文件重命名或者复制为 zoo.cfg
,编辑该文件,修改 dataDir
配置:
#dataDir=/tmp/zookeeper
dataDir=/home/ding/Downloads/zookeeper_1/data
这是Zookeeper保存数据的位置, data
目录是我新创建的。
直接运行 zkServer.sh
看一下帮助信息:
➜ bin ./zkServer.sh
ZooKeeper JMX enabled by default
Using config: /home/ding/Downloads/zookeeper_1/bin/../conf/zoo.cfg
Usage: ./zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|version|restart|status|print-cmd}
信息简单明了。常见的选项就是start、stop、status、restart等。
没启动Zookeeper时查看状态:
➜ bin ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/ding/Downloads/zookeeper_1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
启动Zookeeper:
➜ bin ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/ding/Downloads/zookeeper_1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
启动后查看状态:
➜ bin ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/ding/Downloads/zookeeper_1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
注意 standalone
表示单机模式。
客户端常用命令
Zookeeper自带客户端的CLI工具:
./zkCli.sh -server localhost:2181
其中2181是默认的端口,可以在 zoo.cfg
文件里配置。
如果不指定 -server
选项,则会连接本机的2181端口。
./zkCli.sh
进入Zookeeper命令行,提示符如下:
[zk: localhost:2181(CONNECTED) 0]
随便输入一个错误命令可查看CLI命令行帮助信息,会列出所有命令,比较有用。
输入 quit
命令可退出CLI命令行。
Zookeeper的数据模型类似于Linux的文件系统(不过不太区分目录和文件,每个节点上既可以有数据,也可以有子节点),操作命令也和Linux类似。
增删改查操作
ls
:查看节点create
:创建节点delete
:删除不带子节点节点deletaall
:删除带有子节点的节点get
:获取节点数据set
:设置节点数据
下面是一些例子。
- 查看根节点
/
:
ls /
[zookeeper]
- 创建节点
/test1
:
create /test1
Created /test1
- 设置
/test1
节点数据:
set /test1 good
- 获取
/test1
节点数据:
get /test1
good
- 创建节点
/test2
,同时设值:
create /test2 hello
Created /test2
- 获取
/test2
节点数据:
get /test2
hello
- 再次查看根节点
/
:
ls /
[test1, test2, zookeeper]
- 删除
/test2
:
delete /test2
注意:如果节点还有子节点,则要用 deleteall
命令删除。
临时节点和顺序节点
按临时性和顺序性,节点可分为以下4类:
- 非临时,非顺序
- 非临时,顺序
- 临时,非顺序
- 临时,顺序
临时节点
create -e
创建临时节点。所谓临时节点,在当前会话结束后,会自动删除。
创建临时节点 /test2
:
create -e /test2
查看根目录 /
:
ls /
[test1, test2, zookeeper]
运行 quit
退出命令行,然后运行 ./zkCli.sh
重新进入命令行,此时查看根目录 /
:
ls /
[test1, zookeeper]
可见 /test2
已经自动删除了。
顺序节点
create -s
创建顺序节点。Zookeeper会在指定的节点名字后面加上一个sequence后缀,以确保其全局唯一。
创建顺序节点 /test2
:
create -s /test2
WATCHER::
Created /test20000000003
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
注:收到了根目录 /
的 NodeChildrenChanged
消息通知。
查看根目录 /
:
ls /
[test1, test20000000003, zookeeper]
可见,自动加上了sequence后缀 0000000003
。
再次创建顺序节点 /test2
:
create -s /test2
Created /test20000000004
因为sequence是全局唯一的,所以确保不会重复创建节点。
注意:sequence后缀是全局累加的,比如,创建顺序节点 /test3
:
create -s /test3
Created /test30000000005
sequence后缀是 0000000005
,可见,sequence是全局的。
Watch机制
ls -w
关注某个节点。比如:
ls -w /test1
[]
此时,如果在另一个命令行,运行 create /test1/aaa
创建节点,第一个命令行就会收到通知:
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test1
如果在第二个命令行,运行 create /test1/bbb
继续创建节点,此时第一个命令行就不再收到通知了,关注只生效一次。