zookeeper配置和基本操纵

1. 配置开机自启

把zookeeper做成服务

1、进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本

1
2
3
4
[root@node1 ~]# cd /etc/rc.d/init.d/ 
[root@node1 init.d]# pwd
/etc/rc.d/init.d
[root@node1 init.d]# touch zookeeper

2、给脚本添加执行权限

1
[root@node1 init.d]# chmod +x zookeeper

3、使用命令vim zookeeper进行编辑,在脚本中输入如下内容,其中同上面注意事项一样要添加export JAVA_HOME=/usr/java/jdk1.8.0_112这一行,否则无法正常启动。

[root@zookeeper init.d]# vim zookeeper

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#chkconfig:2345 10 90
#description:service zookeeper
export JAVA_HOME=/usr/java/jdk-1.8.0_271-amd64
ZOOKEEPER_HOME=/usr/local/apache-zookeeper-3.6.1-bin
case "$1" in
start) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start;;
stop) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh stop;;
status) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh status;;
restart) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh restart;;
*) echo "require start||stop|status|restart|";;
esac

4、 使用service zookeeper start/stop/restart命令来尝试启动关闭重启zookeeper,使用service zookeeper status查看zookeeper状态。

5、添加到开机自启

1
[root@node1 init.d]# chkconfig --add zookeeper

添加完之后,我们使用chkconfig –list来查看开机自启的服务中是否已经有我们的zookeeper了,如下所示,可以看到在最后一行便是我们的zookeeper服务了。

1
2
3
4
[root@node1 init.d]# chkconfig --list 
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
zookeeper 0:off 1:off 2:on 3:on 4:on 5:on 6:off

2. zkCli客户端

https://blog.csdn.net/dandandeshangni/article/details/80558383

2.1 基本操作
  • 列举子节点: ls path (ls /zookeeper)
  • 查看节点更新信息:stat path (stat /zookeeper)
  • 创建节点 :create path val (creat /config “test string value”)
  • 创建临时节点 :create -e path val
  • 创建顺序节点:create -s path val
  • 修改节点:set path val (set /config “another config string”)
  • 删除节点:delete path
  • 监视节点:stat -w path、 get -w path
2.2 ACL权限控制

ZK的节点有5种操作权限:CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)。 注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

身份的认证有4种方式:

  • world:默认方式,相当于全世界都能访问
  • auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
  • digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
  • ip:使用Ip地址认证

使用[scheme​ : id : permissions]来表示acl权限,比如-digest:username:password:cwrda

getAcl:获取某个节点的acl权限信息 getAcl path

1
2
3
4
5
6
7
8
9
#World方案权限设置
setAcl /config/global world:anyone:crwa
#auth方案权限设置
addauth digest test:123456
setAcl /config/global auth:test:123456:cdrwa
#digest方案权限设置
setAcl /config/global digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdra
#ip权限设置
setAcl /niocoder/ip ip:192.168.0.68:cdrwa
超级管理员

zk的权限管理表有一种ACL的模式叫做super,该模式的作用是方便管理节点。一旦我们为某一个节点设置了acl,那么其余的未授权的节点是无法访问或者操作该节点的,那么系统用久了以后,假如忘记了某一个节点的密码,那么就无法再操作这个节点了,所以需要这个super超级管理员用户权限,其作用还是很大的。

添加方式:只能在启动服务器的时候添加。

假设这个超管是:super:admin,通过代码得到其哈希值:

1
String m = DigestAuthenticationProvider.generateDigest("super:admin");

m是:

1
super:xQJmxLMiHGwaqBvst5y6rkB6HQs=

那么打开zk目录下的/bin/zkServer.sh服务器脚本文件,找到如下一行:

1
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"

这就是脚本中启动zk的命令,默认只有以上两个配置项,我们需要加一个超管的配置项:

1
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="

第一个等号之后的就是刚才用户名密码的哈希值。 那么修改以后这条完整命令变成了:

1
2
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="\
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

之后重新启动zk集群,进入zkCli输入如下命令添加权限:

1
addauth digest super:admin

假如zk有一个节点/test,acl为digest方案,但是忘记了用户名和密码,正常情况下,这次登陆如果不用那个digest授权是不能访问/test的数据的。但是由于我们配置了超管,所以这次还是可以访问到的。

需要说明的是,这个超管只是在这次服务器启动期间管用,如果关闭了服务器,并修改了服务器脚本,取消了超管配置,那么下一次启动就没有这个超管了。

运维四字指令

使用四字命令需要安装nc命令(yum install nc)

然后在启动脚本zkServer.sh里添加VM环境变量-Dzookeeper.4lw.commands.whitelist=*,便可以把所有四字指令添加到白名单(否则执行四字指令会报错is not executed because it is not in the whitelist),我是添加在脚本的这个位置:

1
2
3
4
5
6
7
8
9
ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=$JMXPORT -Dcom.sun.management.jmxremote.authenticate=$JMXAUTH -Dcom.sun.management.jmxremote.ssl=$JMXSSL -Dzookeeper.jmx.log4j.disable=$JMXLOG4J org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi
else
echo "JMX disabled by user request" >&2
ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi
# 这里就是我添加的
# 如果不想添加在这里,注意位置和赋值的顺序
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

重启zk即可。

四字指令调用方法:

1
[root@node1 ~]#echo xxxx | nc 192.168.0.68 2181

其中xxxx为:

  • stat 查看状态信息
  • ruok 查看zookeeper是否启动
  • dump 列出没有处理的节点,临时节点
  • conf 查看服务器配置
  • cons 显示连接到服务端的信息
  • envi 显示环境变量信息
  • mntr 查看zk的健康信息
  • wchs 展示watch的信息
  • wchc和wchp 显示session的watch信息 path的watch信息