Zookeeper快速入门
Zookeeper快速入门
一、安装
- 安装
环境要求:必须要有jdk环境
从官网https://archive.apache.org/dist/zookeeper/下载最新的版本,如:zookeeper-3.4.9.tar.gz
如果是windows,解压即可;
如果是linux运行tar –zxvf zookeeper-3.4.9.tar.gz ,解压。
解压之后如下:
- 配置
需将conf/ zoo_sample.cfg 复制一份名为zoo.cfg的配置文件。其中重要的几项配置:
clientPort=2181 端口
dataDir=D:/logs/zookeeper/data 快照存放位置
dataLogDir=D:/logs/zookeeper/log 日志存放位置
snapCount=3 执行多少次事物就生成快照文件
- 运行服务端
如果是windows ,双击zkServer.cmd
如果是linux,运行sh zkServer.sh
看到如下就代表成功
或者通过jps查看,如果有QuorumPeerMain就代表成功
- 客户端连接服务端
如果是windows ,双击zkCli.cmd,或者在命令窗口运行 zkCli.cmd -server ip:port
其中ip:port 为服务端的ip和端口,如127.0.0.1:2181
如果是linux,运行sh zkCli.sh -server ip:port
二、使用
创建节点
create /node1 v1 (其中node1为节点名称,v1为节点的值)
修改节点
set /node1 v11 (其中node1为节点名称,v11为需要修改节点的值)
删除节点
delete /node2 (其中node2为节点名称)
如果/node1下面有子节点,那么会报错,需要使用rmr /node1命令
查看节点
get /node1 (其中node1为节点名称)
说明:
如上的操作不带参数默认都是持久节点。
三、节点类型:
1.Zookeeper中有两种节点类型:
持久节点persitent
create /node1 v1,客户端断开连接之后,zk不删除persitent节点
临时节点ephemeral
create -e /node1 v1 ,客户端断开连接之后,zk删除ephemeral节点
2.zookeeper有四种形式的目录节点(默认是persistent)
PERSISTENT
create /node1 v1
PERSISTENT_sequence
create -s /node1 v1
实际上创建了一个新的名称为node10000000001的节点。再次执行会生成一个新的名称为node10000000002的节点
EPHEMERAL
create -e /node1 v1 当客户端退出之后,改节点就被删除了
注意,临时节点下面不能创建子节点,会报错:
EPHEMERAL_sequence
create -e -s /node1 v1 当客户端退出之后,改节点就被删除了。
3.节点状态属性
cZxid :节点被创建的事物id值 c:create
ctime :节点被创建的时间
mZxid :节点被修改的事物的事物id值 m:modify
mtime :节点被修改的时间
pZxid :子节点最后一次呗修改的事物id
cversion :节点的子节点被修改的版本号
dataVersion :数据被修改的版本号
aclVersion : 节点的acl被修改的版本号
ephemeralOwner :如果是持久节点值为0,临时节点非0
dataLength : 节点值得长度
numChildren :子节点个数
如下为持久节点的值:
[zk: localhost:2181(CONNECTED) 11] get /node1
v11
cZxid = 0x13
ctime = Mon Oct 29 10:07:58 CST 2018
mZxid = 0x14
mtime = Mon Oct 29 10:08:39 CST 2018
pZxid = 0x13
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
如下为临时节点的值:
[zk: localhost:2181(CONNECTED) 12] get /node2
v2
cZxid = 0x29
ctime = Mon Oct 29 10:28:13 CST 2018
mZxid = 0x29
mtime = Mon Oct 29 10:28:13 CST 2018
pZxid = 0x29
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000efbbe700001
dataLength = 2
numChildren = 0
四、zookeeper的ACL
4.1ACL机制
ACL(Access Control List)机制,表示为scheme:id:permissions,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(如只读,读写,管理等)。
Scheme:
world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
digest: 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
ip: 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
id:
id是验证模式,不同的scheme,id值不一样
scheme为auth时:username:password
scheme为digest时:username:BASE64(SHA1(password))
scheme为ip时:客户端的ip地址。
scheme为world时:anyone。
permiddsion:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)
CREATE(c):创建子节点的权限
DELETE(d):删除节点的权限
READ(r):读取节点数据的权限
WRITE(w):修改节点数据的权限
ADMIN(a):设置子节点权限的权限
4.2ACL的命令:
4.2.1getAcl
create /node1 v1 # 创建一个子节点
getAcl /node1 # 获取该节点的acl权限信息
4.2.2setAcl
setAcl /node1 world:anyone:craw 把删除权限d去除 ,那么在node1下面创建的子节点是不能被删除的,但是/node1本身这个节点还是可以被删除的。
4.2.3addauth:注册会话授权信息(相当于创建用户或者切换用户)
4.2.3.1 auth
addauth digest u1:123456 新增用户,名为u1,密码为123456
setAcl /node3 auth:u1:123456:crdwa 给node3节点设置Acl ,scheme为auth类型,id 为auth类型即 u1:123456 ,permission为crdwa
退出本次客户端后:
再次重新连接客户端 (或者新启动一个客户端)
ls /node3/testAcl #没有权限无法访问
create /node3/testAcl/testb bbb #没有权限无法访问
addauth digest user1:123456 # 重新新增权限后可以访问了
如果忘记密码那就没办法了,查看不了
4.2.3.1 digest
auth与digest的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录
create /node3/testDigest dd
addauth digest u2:654321
setAcl /node3/testDigest digest:u2:Fqb0cTcVtn704lhrUTPitrq88fg=:ca # 使用digest来设置权限
其中:addauth digest u2:654321 ,怎么查看加密的密码呢
通过执行如下java命令可获得:
java -Djava.ext.dirs=D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\lib -cp D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\zookeeper-3.4.13.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider u2:654321
五、常用四字命令
ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令
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 相关的路径
5.1通过nc向zookeeper提交命令:
注意:需要安装nc否则会报错:
Linux(centos)安装命令:yum –y install nc
Windows安装netcat: 下载链接https://eternallybored.org/misc/netcat/
5.2通过telnet向zookeeper提交命令
首先要执行telnet 127.0.0.1 2181
连接成功之后,输入四字命令,如:stat
六、查看快照或日志文件
直接打开快照或日志文件时乱码,可用如下命令查看
在linux中执行:
java -cp /usr/local/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.jar:/usr/local/zookeeper/zookeeper-3.4.8/lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.11089bb
java -cp /usr/local/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.jar:/usr/local/zookeeper/zookeeper-3.4.8/lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.ffd9b6
注意:java cp 命令在windows中执行分隔符为;而在linux为:
java cp 命令:
-cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”分隔,linux上是分号“:”分隔
java -cp D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\zookeeper-3.4.13.jar;D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\lib\slf4j-api-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter D:\logs\zookeeper\data\version-2\snapshot.1a
java -cp D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\zookeeper-3.4.13.jar;D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\lib\slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter D:\logs\zookeeper\log\version-2\log.1
七、zookeeper信息查看工具
下载地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
输入ip,端口
查看如下,代表链接成功