zookeeper常用命令

启动zookeeper命令

zkServer.sh start conf/zoo.cfg

连接zookeeper命令

zkCli.sh -server localhost:2181

ZooKeeperMain无法kill -9 掉

[root@localhost ~]# jps
5137 Jps
3891 ZooKeeperMain

使用top命令查看僵尸进程

[root@localhost ~]# top
top - 06:44:35 up  2:34,  2 users,  load average: 0.00, 0.00, 0.02
Tasks: 269 total,  1 running, 266 sleeping,   1 stopped,   1 zombie # 有一个僵尸进程
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
MiB Mem :   1790.0 total,    223.3 free,   1193.1 used,    373.6 buff/cache
MiB Swap:   2048.0 total,   1825.0 free,    223.0 used.    430.6 avail Mem 


## 一下是扩展学习和要解决的问题无关

# 说明: top默认进入是进程列表, 输入H 切换到线程列表
top - 06:47:51 up  2:37,  2 users,  load average: 0.07, 0.02, 0.00
Threads: 597 total,(线程)   2 running, 593 sleeping,   1 stopped,   1 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
MiB Mem :   1790.0 total,    220.8 free,   1193.9 used,    375.3 buff/cache
MiB Swap:   2048.0 total,   1825.0 free,    223.0 used.    429.0 avail Mem 

PID     USER     PR  NI  VIRT    RES    SHR    S %CPU  %MEM  TIME+     COMMAND                                                                                                                    
2038    gdm      20  0   474348  6176   3296   S 0.3   0.3   0:00.37   pool   

# top -p pid # 查看单个进程信息, H 切换到线程信息
top - 06:51:02 up  2:40,  2 users,  load average: 0.02, 0.01, 0.00
Tasks:   1 total,   0 running,   0 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
MiB Mem :   1790.0 total,    221.3 free,   1193.4 used,    375.3 buff/cache
MiB Swap:   2048.0 total,   1825.0 free,    223.0 used.    429.5 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                    
   3885 root      20   0   12832   2164   2116 T   0.0   0.1   0:00.00 bash    

查看僵尸进程的详细信息

ps aux | grep Z

[root@localhost ~]# ps aux | grep Z
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        3891  0.0  0.0      0     0 pts/1    Z    05:16   0:03 [java] <defunct>
root        5263  0.0  0.0  12112  1048 pts/1    S+   06:54   0:00 grep --color=auto Z

查看 3891进程信息

ps -aux | grep 3891

[root@localhost ~]# ps -aux | grep 3891
root        3891  0.0  0.0      0     0 pts/1    Z    05:16   0:03 [java] <defunct>
root        5294  0.0  0.0  12112   920 pts/1    S+   06:56   0:00 grep --color=auto 3891

3891的父进程是0,所以只能重启系统才能解决了

reboot

[root@localhost ~]# jps
2166 Jps
[root@localhost ~]# 

top - 07:01:50 up 1 min,  1 user,  load average: 1.51, 0.65, 0.24
Tasks: 209 total,   1 running, 208 sleeping,   0 stopped,   0 zombie ## 僵尸进程消失
%Cpu(s):  3.0 us,  3.0 sy,  0.0 ni, 93.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

create delete get set ls deleteall

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 9] create /zk
Created /zk
[zk: localhost:2181(CONNECTED) 10] create -es /zk/test 
Created /zk/test0000000000
[zk: localhost:2181(CONNECTED) 11] 
[zk: localhost:2181(CONNECTED) 11] get /zk/test0000000000
null
[zk: localhost:2181(CONNECTED) 12] 
[zk: localhost:2181(CONNECTED) 12] create /zk/test
Created /zk/test 覆盖了临时有序节点
[zk: localhost:2181(CONNECTED) 13] create -es /zk/test
Created /zk/test0000000002
[zk: localhost:2181(CONNECTED) 14] create -es /zk/test
Created /zk/test0000000003
[zk: localhost:2181(CONNECTED) 15] create -es /zk/test data1
Created /zk/test0000000004
[zk: localhost:2181(CONNECTED) 16] get /zk/test0000000004
data1
[zk: localhost:2181(CONNECTED) 17] 
[zk: localhost:2181(CONNECTED) 17] delete /zk/test0000000004
[zk: localhost:2181(CONNECTED) 18] deleteall /zk
[zk: localhost:2181(CONNECTED) 19] ls -s /
[zookeeper]
cZxid = 0x0
ctime = Wed Dec 31 16:00:00 PST 1969
mZxid = 0x0
mtime = Wed Dec 31 16:00:00 PST 1969
pZxid = 0x10000000a
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 20] 

# acl

acl命令

Zookeeper 的 ACL(Access Control List),分为三个维度:scheme、id、permission
通常表示为:scheme:id:permission

  • schema:代表授权策略
  • id:代表用户
  • permission:代表权限

Scheme

world:默认方式,相当于全世界都能访问

auth:代表已经认证通过的用户(可以通过 addauth digest user:pwd 来添加授权用户)

digest:即用户名:密码这种方式认证,这也是业务系统中最常用的

ip:使用 ip 地址认证

id

id 是验证模式,不同的 scheme,id 的值也不一样。

scheme 为 auth 时:username:password

scheme 为 digest 时 : username:BASE64(SHA1(password))

scheme 为 ip 时: 客户端的 ip 地址。

scheme 为 world 时 anyone。

Permission

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这 5 种权限简写为 crwda(即:每个单词的首字符缩写)

CREATE©:创建子节点的权限

DELETE(d):删除节点的权限

READ®:读取节点数据的权限

WRITE(w):修改节点数据的权限

ADMIN(a):设置子节点权限的权限

getAcl

[zk: localhost:2181(CONNECTED) 9] create /acl
Created /acl
[zk: localhost:2181(CONNECTED) 10] create -c /acl/test 'test acl'
Created /acl/test
[zk: localhost:2181(CONNECTED) 11] getAcl /acl/test
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 12] 

setAcl

[zk: localhost:2181(CONNECTED) 12] setAcl /acl/test world:anyone:crwa
[zk: localhost:2181(CONNECTED) 13] getAcl /acl/test
'world,'anyone
: crwa
[zk: localhost:2181(CONNECTED) 14] delete /acl/test # 可以删除

addauth

[zk: localhost:2181(CONNECTED) 24] addauth digest user1:12345
[zk: localhost:2181(CONNECTED) 25] setAcl /acl/test auth:user1:12345:crwa
Insufficient permission : /acl/test # 权限不足

[zk: localhost:2181(CONNECTED) 28] create /acl/test2 # 重新创建一个节点,因为之前那个节点创建时候,这个用户还没有添加
Created /acl/test2
[zk: localhost:2181(CONNECTED) 29] setAcl /acl/test2 auth:user1:12345:crwa
[zk: localhost:2181(CONNECTED) 30] getAcl /acl/test2 
'digest,'user1:+owfoSBn/am19roBPzR1/MfCblE=
: crwa
[zk: localhost:2181(CONNECTED) 31] delete /acl/test2 # 可以删除,旧版好像不能删除

[zk: localhost:2181(CONNECTED) 34] create /acl/test2 data2
Created /acl/test2
[zk: localhost:2181(CONNECTED) 35] setAcl /acl/test2 auth:user1:12345:crw
[zk: localhost:2181(CONNECTED) 36] delete /acl/test2 # what? 依然可以删除

[zk: localhost:2181(CONNECTED) 39] setAcl /acl/test2 auth:user1:12345:r
[zk: localhost:2181(CONNECTED) 40] delete /acl/test2 # 还是可以删除

help,发现有个whoami, 可能新版需要切换用户吧,以后有时间再研究

Digest

auth 与 digest 的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录

create /testDir/testDigest	data addauth digest user1:123456
setAcl /testDir/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa	# 使用 digest
来设置权限
注意:这里如果使用明文,会导致该 znode 不可访问通过明文获得密文
shell>
java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider deer:123456

deer:123456->deer:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=

acl 命令行 ip

create	/testDir/testIp data
setAcl	/testDir/testIp ip:192.168.30.10:cdrwa 
getAcl	/testDir/testIp

acl启用super权限

​ 由于失误,导致节点无法删除

create /acl/node1	enjoy 
setAcl /acl	world:anyone:r

​ 这个时候无论是 delete 还是 deleteall(旧版是rmr) 都没有权限删除

启用 super 权限

使用 DigestAuthenticationProvider.generateDigest(“super:admin”); 获得密码

  1. 修改 zkServer 启动脚本增加

    “-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6 HQs=”

  2. 启动客户端用管理员登陆(我新版总是可以删除是不是因为是管理员)

> whoami
Auth scheme: User # 这个user是不是一个管理员
ip: 127.0.0.1
digest: user1

addauth digest super:admin

常用四字命令

​ ZooKeeper 支持某些特定的四字命令字母与其的交互。用来获取 ZooKeeper 服务的当前状态及相关信息。可通过 telnet 或 nc 向 ZooKeeper 提交相应的命令 :

​ 安装nc

yum install nc
echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为 follower 或者 leader
使用 echo ruok|nc 127.0.0.1 2181 测试是否启动了该 Server,若回复 imok 表示已经启动。
echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。echo kill | nc 127.0.0.1 2181 ,关掉 server
echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。
echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息
echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。
echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。
echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。
echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
echo wchp | nc 127.0.0.1 2181 , 通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

提示不在白名单

stat is not executed because it is not in the whitelist.

  1. zoo.cfg中配置白名单
#开启四字命令
4lw.commands.whitelist=*

然后重启

[root@localhost ~]# zkServer.sh restart zookeeper-3.7.0-bin/conf/zoo.cfg 
ZooKeeper JMX enabled by default
Using config: zookeeper-3.7.0-bin/conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: zookeeper-3.7.0-bin/conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: zookeeper-3.7.0-bin/conf/zoo.cfg
Starting zookeeper ... STARTED

[root@localhost ~]# echo ruok|nc localhost 2181
imok[root@localhost ~]# 再次尝试成功
  1. zkServer.sh中新增指令
fi
#添加VM环境变量-Dzookeeper.4lw.commands.whitelist=*
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

ZooKeeper 日志可视化

​ 两个非常重要的配置一个是 dataDir,存放的快照数据,一个是 dataLogDir,存放的是事务日志文件

java -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar:/soft/zookeeper-3.4.12/lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter log.1

java -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar:/soft/zookeeper-3.4.12/lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter log.1
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐