【zookeeper04】消息队列与微服务之zookeeper客户端访问
客户端访问
1.命令行客户端访问 ZooKeeper
#可连接至zookeeper 集群中的任意一台zookeeper 节点进行以下操作,zkCli.sh 默认连接本机
[root@zookeeper-node1 ~]#zkCli.sh -server 10.0.0.188:2181
[zk: 10.0.0.188:2181(CONNECTED) 0]
#不指定server连自己
[root@zookeeper-node1 ~]#zkCli.sh
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 0]
#输入TAB键可以列出所有支持命令
addWatch addauth close config connect
create delete deleteall delquota get
getAcl getAllChildrenNumber getEphemerals history listquota
ls printwatches quit reconfig redo
removewatches set setAcl setquota stat
sync version whoami
[zk: localhost:2181(CONNECTED) 1] version
ZooKeeper CLI version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
#默认创建持久节点,即退出不丢失,create -e 可以创建临时节点(退出就丢失)
#持久节点才支持创建子节点,临时节点不支持,如: create /app1/subapp1 "subdata" ,不能递归创建
[zk: localhost:2181(CONNECTED) 2] create /app1
Created /app1
[zk: localhost:2181(CONNECTED) 3] ls /
[app1, zookeeper]
#get -s /app1可以查看更详细的信息
[zk: localhost:2181(CONNECTED) 14] get -s /app1
null
cZxid = 0x400000014
ctime = Tue Nov 19 15:37:33 UTC 2024
mZxid = 0x400000014
mtime = Tue Nov 19 15:37:33 UTC 2024
pZxid = 0x400000015
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
#修改已有节点的值 /app1/config既是目录也是文件
[zk: localhost:2181(CONNECTED) 2] create /app1/config
[zk: localhost:2181(CONNECTED) 8] set /app1/config 'app1 config'
[zk: localhost:2181(CONNECTED) 9] get /app1/config
app1 config
[zk: localhost:2181(CONNECTED) 10] create /app1/config/meta
Created /app1/config/meta
[zk: localhost:2181(CONNECTED) 11] ls /app1/config
[meta]
[zk: localhost:2181(CONNECTED) 12] ls /app1/config/meta
[]
[zk: localhost:2181(CONNECTED) 13] get /app1/config
app1 config
#删除不包含子节点的节点(相当于rmdir),如果想删除所有节点内的数据,使用deleteall /path(相当于rm -rf)
[zk: localhost:2181(CONNECTED) 2] delete /app1/config
Node not empty: /app1/config
[zk: localhost:2181(CONNECTED) 6] delete /app1/config/meta
[zk: localhost:2181(CONNECTED) 9] ls /app1/config
[]
[zk: localhost:2181(CONNECTED) 10] delete /app1/config
[zk: localhost:2181(CONNECTED) 11] ls /app1
[]
#查看已知节点元数据
[zk: 10.0.0.103:2181(CONNECTED) 9] stat /zookeeper
zxid = Ox0 #节点创建时的zxid
ctime = Thu Jan 01 08:00:00 CST 1970 #节点创建时间
mzxid = Ox0 #节点最近一次更新时的zxid
mtime = Thu Jan 01 08:00:00 cST 1970 #节点最近一次更新的时间
pzxid = Ox0 #父节点创建时的zxid
cversion = -1 #子节点数据更新次数
dataversion = 0 #本节点数据更新次数
aclversion = o #节点ACL(授权信息)的更新次数
ephemera10wner = Ox0 #持久节点值为0,临时节点值为sessionid
dataLength = 0 #节点数据长度
numchi1dren = 1 #子节点个数
[zk: localhost:2181(CONNECTED) 10] get /zookeeper/config
server.1=10.0.0.201:2888:3888:participant
server.2=10.0.0.202:2888:3888:participant
server.3=10.0.0.203:2888:3888:participant
version=0
[zk: 10.0.0.103:2181(CONNECTED) 10] quit #退出
2.nc 访问 ZooKeeper
ZooKeeper支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper服务的当前状态及相关信息。 用户在客户端可以通过 netcat 或telnet向zookeeper发送下面命令
常见命令列表
conf #输出相关服务配置的详细信息
cons #列出所有连接到服务器的客户端的完全的连接/会话的详细信息
envi #输出关于服务环境的详细信息
dump #列出未经处理的会话和临时节点
stat #查看哪个节点被选择作为Follower或者Leader
ruok #测试是否启动了该Server,若回复imok表示已经启动
mntr #输出一些运行时信息
reqs #列出未经处理的请求
wchs #列出服务器watch的简要信息
wchc #通过session列出服务器watch的详细信息
wchp #通过路径列出服务器watch的详细信息
srvr #输出服务的所有信息
srst #重置服务器统计信息
kill #关掉Server
isro #查看该服务的节点权限信息
命令的安全限制
#默认情况下,这些4字命令有可能会被拒绝,提示如下报错
xxxx is not executed because it is not in the whitelist.
#解决办法:在 zoo.cfg文件中添加如下配置,如果是集群需要在所有节点上添加下面配置
#vim conf/zoo.cfg
4lw.commands.whitelist=*
#在服务状态查看命令中有很多存在隐患的命令,为了避免生产中的安全隐患,要对这些"危险"命令进行一些安全限制,只需要编辑服务的zoo.cfg文件即可
# vim conf/zoo.cfg
4lw.commands.whitelist=conf,stat,ruok,isro
范例:
#ubuntu18.04安装netcat
apt update && apt -y install netcat-traditional 或者 netcat-openbsd
查看节点服务状态
cho stat | nc 127.0.0.1 2181
#如果不显式写入白名单,默认提示stat is not executed because it is not in the whitelist.
#查看节点服务配置
echo conf | nc 127.0.0.1 2181
#查看节点服务环境
echo envi | nc 127.0.0.1 2181
#查看节点服务会话
echo cons | nc 127.0.0.1 2181
echo dump | nc 127.0.0.1 2181
#也支持 telnet,但不能用 | telnet 形式
[root@ubuntu1804 ~]#telnet 127.0.0.1 2181
Trying 10.0.0.8...
Connected to 10.0.0.8.
Escape character is '^]'.
cons
/10.0.0.100:52154[0](queued=0,recved=1,sent=0)
/127.0.0.1:59566[1]
(queued=0,recved=8,sent=8,sid=0x100004b74080001,lop=PING,est=1635560454029,to=30000,lcxid=0x0,lzxid=0x9,lresp=5205692,llat=0,minlat=0,avglat=0,maxlat=2)
Connection closed by foreign host.
3.图形化客户端 ZooInspector
github链接
https://github.com/zzhang5/zooinspector
https://gitee.com/lbtooth/zooinspector.git
Linux 客户端
编译 zooinspector
注意:此软件因年代久远不再更新,当前只支持在Ubuntu18.04和Rocky8编译安装,不支持更高版本,如Ubuntu20.04等
#https://github.com/zzhang5/zooinspector
Build
$git clone https://github.com/zzhang5/zooinspector.git
$cd zooinspector/
$mvn clean package -Dmaven.test.skip=true
Run
$chmod +x target/zooinspector-pkg/bin/zooinspector.sh
$target/zooinspector-pkg/bin/zooinspector.sh
范例: 编译 zooinspector
#注意:只支持JDK8,不支持JDK11
#github
[root@zookeeper-node1 ~]#git clone https://github.com/zzhang5/zooinspector.git
#国内镜像
[root@zookeeper-node1 ~]#git clone https://gitee.com/lbtooth/zooinspector.git
[root@zookeeper-node1 ~]#cd zooinspector/
[root@zookeeper-node1 zooinspector]#apt install maven -y
#镜像加速
[root@zookeeper-node1 zooinspector]#vim /etc/maven/settings.xml
<mirrors>
<!--阿里云镜像-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
#编译,此步骤需要较长时间下载,可能数分钟
[root@zookeeper-node1 zooinspector]#mvn clean package -Dmaven.test.skip=true
客户端使用
[root@zookeeper-node1 zooinspector]#ls
pom.xml README.md src target
[root@zookeeper-node1 zooinspector]#du -sh .
7.3M .
[root@zookeeper-node1 zooinspector]#chmod +x target/zooinspector-pkg/bin/zooinspector.sh
#如果是Rocky,需要提前在windows打开Xmanager类似的软件,并执行下面命令
[root@zookeeper-node1 zooinspector]#export DISPLAY=10.0.0.1:0.0
#启动zooinspector
[root@zookeeper-node1 zooinspector]#target/zooinspector-pkg/bin/zooinspector.sh
#自动打开下面图形界面
Windows 客户端使用
先下载并安装 JDK
注意: Oracle官网需要登录才能下载
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
CMD之后运行下面命令
D:\ZooInspector\build>java -jar zookeeper-dev-ZooInspector.jar
#或者直接使用Linux上面编译生成的文件zookinspector-1.0-SNAPSHOT-pkg.tar在Windows中解压缩,直接运行里的zooinspector.bat即可
Python 访问 ZooKeeper
[root@zookeeper-node1 ~]#apt update && apt -y install python3 python3-kazoo
[root@zookeeper-node1 ~]#cat zookeepe_test.py
#!/usr/bin/python3
from kazoo.client import KazooClient
zk = KazooClient(hosts='10.0.0.101:2181')
zk.start()
# 创建节点:makepath 设置为 True ,父节点不存在则创建,其他参数不填均为默认
zk.create('/zkapp/test',b'this is a test',makepath=True)
# 操作完后关闭zk连接
data=zk.get('/zkapp/test')
print(data)
zk.stop()
[root@zookeeper-node1 ~]#chmod +x ./zookeepe_test.py
[root@zookeeper-node1 ~]#./zookeepe_test.py
Golang 访问 ZooKeeper
package main
import (
"fmt"
"time"
"github.com/samuel/go-zookeeper/zk"
)
func main() {
hosts := []string{"localhost:2181"}
conn, _, err := zk.Connect(hosts, time.Second*5)
if err != nil {
panic(err)
}
defer conn.Close()
// 创建节点
path := "/test"
data := []byte("hello world")
flags := int32(0)
acl := zk.WorldACL(zk.PermAll)
_, err = conn.Create(path, data, flags, acl)
if err != nil {
panic(err)
}
// 获取节点数据
d, _, err := conn.Get(path)
if err != nil {
panic(err)
}
fmt.Printf("Get node %s data: %s\n", path, string(d))
// 设置节点数据
newData := []byte("new data")
_, err = conn.Set(path, newData, -1)
if err != nil {
panic(err)
}
d, _, err = conn.Get(path)
if err != nil {
panic(err)
}
fmt.Printf("Get node %s data after set: %s\n", path, string(d))
// 删除节点
err = conn.Delete(path, -1)
if err != nil {
panic(err)
}
fmt.Printf("Delete node %s successfully\n", path)
}