Bootstrap

【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)
}

 

;