前言
集群搭建,本章内容涉及到多个服务器之间的通信
zookeeper客户端
zkCli.sh 位置
位于zookeeper 安装目录的bin目录下
/zookeeper-3.5.7/bin
进入zookeeper客户端命令:sh zkCli.sh
sh zkCli.sh
[zk: localhost:2181(CONNECTED) 1] #输入命令的地方
退出zookeeper客户端命令:quit
[zk: localhost:2181(CONNECTED) 1] quit
zookeeper客户端命令:
命令 | 描述 |
---|---|
help | 显示所有操作命令 |
-server host:port | 访问客户端同时,远程登录其他zookeeper客户端 |
config | 查看zookeeper集群配置 |
connect | 在当前客服端连接其他zookeeper服务器 |
create | 创建子节点 |
delete | 删除子节点,无法删除嵌套节点 |
deleteall | 和delete一样,但是支持嵌套节点删除 |
get | 获取节点的值 |
getAcl | 获取节点权限 |
history | 查看历史输入命令 |
listquota | |
ls | 列出所在节点层级 |
ls2 | 类似于 ls -s path |
printwatches | off:设置打印监听信息,on:关闭监听后的打印信息 |
quit | 退出zookeeper客户端 |
reconfig | |
redo | |
removewatches | |
rmr | 命令'rmr'已被弃用。请改用“deleteall” |
set | 对节点赋值 |
setquota | |
stat | 同 ls -s 效果类似,stat -w 对节点进行监听 |
sync | sync是使得client当前连接着的ZooKeeper服务器,和ZooKeeper的Leader节点同步(sync)一下数据。 |
setAcl | 设置节点权限 |
help
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
history
listquota path
ls [-s] [-w] [-R] path
ls2 path [watch]
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
rmr path
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
Command not found: Command not found help
远程登录
语法: sh zkCli.sh -server host:port [命令] [选项]
描述:
zh Cli.sh 除了可以访问当前zookeeper客户端,也可以远程其他
zookeeper客户端
案例:登录到 hadoop103服务器
[*****@hadoop102 bin]$ sh zkCli.sh -server hadoop103:2181
[zk: hadoop103:2181(CONNECTED) 0
config
查看 zookeeper集群信息
$ sh zkCli.sh config
WatchedEvent state:SyncConnected type:None path:null
server.2=hadoop102:2888:3888:participant
server.3=hadoop103:2888:3888:participant
server.4=hadoop104:2888:3888:participant
server.5=hadoop105:2888:3888:participant
version=0
connect
语法:connect host:port
描述:host 服务器IP,port 服务器端口
在当前zookeeper客户端切换到其他zookeeper客户端,:这个和 -service 的区别
# 准备切换到 hadoop103
[zk: localhost:2181(CONNECTED) 0] connect hadoop103:2181
# 已经切换到了 hadoop103
[zk: hadoop103:2181(CONNECTED) 1]
create
语法: create [-s] [-e] [-c] [-t ttl] path [data] [acl]
描述: 创建一个字节
-s:含有序列 xxxxx00000001
-e:(ephemeral) 表示是一个临时的,当服务器关闭,该节点自动清理。
-c:
-t:
[data]:create 除了可创建节点,还可以对该节点赋值
[acl]:zookeeper内部封装了Perm类型,包含5种权限类型:
READ,WRITE ,CREATE ,DELETE,ADMIN ,以及ALL = 五合一类型
创建一个默认空数据节点
[zk: localhost:2181(CONNECTED) 2] create /sanguo
Created /sanguo
创建一个节点,并赋值
[zk: localhost:2181(CONNECTED) 7] create /sanguo/kongming 诸葛亮
Created /sanguo/kongming
[zk: localhost:2181(CONNECTED) 8] get /sanguo/kongming
诸葛亮
创建一个节点,并设置序列号
[zk: localhost:2181(CONNECTED) 6] create -s /sanguo/zhugeliang
Created /sanguo/zhugeliang0000000001
创建一个临时节点,当服务器关闭后,该节点自动删除
[zk: localhost:2181(CONNECTED) 10] create -e /sanguo/zhangfen
Created /sanguo/zhangfen
创建一个带序列号的临时节点
[zk: localhost:2181(CONNECTED) 11] create -es /sanguo/zhangfen
Created /sanguo/zhangfen0000000004
zookeeper 的数据类型
通过 zookeeper的创建命令,总结 zookeeper的数据权限,共四种。
- 永久节点
- 永久带序列号
- 临时节点
- 临时带序列号
delete
语法: delete [-v version] path
描述:用于删除一个节点
删除一个节点
delete /sanguo/zhaoyun3
delete -v:删除指定的版本号
查看版本号查看 dataVersion= 4,就是数据版本号
[zk: localhost:2181(CONNECTED) 0] ls -s /sanguo
[shuguo, weiguo]cZxid = 0x600000022
ctime = Wed May 19 14:05:09 CST 2021
mZxid = 0x600000022
mtime = Wed May 19 14:05:09 CST 2021
pZxid = 0x70000000a
cversion = 4
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 2
deleteall
语法:deleteall path
描述:能够删除嵌套节点
删除 sanguo 节点
deleteall /sanguo
get
语法:get path
描述:获取节点数据
# 重新创建sanguo节点,并设值 三国演义
[zk: localhost:2181(CONNECTED) 11] create /sanguo 三国演义
Created /sanguo
# 获取 /sanguo 值
[zk: localhost:2181(CONNECTED) 12] get /sanguo
三国演义
getAcl
语法:getAcl path
描述:获取节点权限
[zk: localhost:2181(CONNECTED) 0] getAcl /sanguo
'world,'anyone
: cdrwa
listquota
语法:listquota path
ls
语法:ls [-s] [-w] [-R] path
描述:展示节点层级信息
-s:附加次级信息
[zk: localhost:2181(CONNECTED) 6] ls -s /sanguo
[shuguo]cZxid = 0x600000022
ctime = Wed May 19 14:05:09 CST 2021
mZxid = 0x600000022
mtime = Wed May 19 14:05:09 CST 2021
pZxid = 0x700000003
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 1
-w:监听子节点,监听是一次性的,只能监听一次。
# 监听/sanguo
[zk: localhost:2181(CONNECTED) 7] ls -w /sanguo
[shuguo]
# 此时在hadoop103创建一个新的节点
[zk: localhost:2181(CONNECTED) 0] create /sanguo/weiguo
Created /sanguo/weiguo
# 回到该服务,查看服务器监听变化
[zk: localhost:2181(CONNECTED) 7] ls -w /sanguo
[shuguo]
[zk: localhost:2181(CONNECTED) 8]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo
-R:展示节点层级信息,包括子节点
[zk: localhost:2181(CONNECTED) 8] ls -R /sanguo
/sanguo
/sanguo/shuguo
/sanguo/weiguo
ls2
语法: ls2 path [watch]
描述:同 ls -s 一样,查看节点信息。[watch] 用于进行监听
[zk: localhost:2181(CONNECTED) 9] ls2 /sanguo
'ls2' has been deprecated. Please use 'ls [-s] path' instead.
[shuguo, weiguo]
cZxid = 0x600000022
ctime = Wed May 19 14:05:09 CST 2021
mZxid = 0x600000022
mtime = Wed May 19 14:05:09 CST 2021
pZxid = 0x700000005
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 2
printwatches
语法:printwatches on|off
描述:设置是否打印监听信息
quit
语法:quit
描述:退出zookeeper客户端
reconfig
语法:reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]]] | [-add serverId=host:port1:port2;port3[,...]] [-remove serverId[,...]*]
描述:
redo
语法:redo cmdno
描述:
removewatches
语法:removewatches path [-c|-d|-a] [-l]
描述:
rmr
语法:rmr path
描述:命令'rmr'已被弃用。请改用“deleteall”
[zk: localhost:2181(CONNECTED) 10] rmr /sanguo
The command 'rmr' has been deprecated. Please use 'deleteall' instead.
set
语法:set [-s] [-v version] path data
描述:对节点进行设值
[zk: localhost:2181(CONNECTED) 0] set /sanguo 三国演义
[zk: localhost:2181(CONNECTED) 1] get /sanguo
三国演义
set -s:设值并打印节点信息
[zk: localhost:2181(CONNECTED) 2] set -s /sanguo 三国演义
cZxid = 0x600000022
ctime = Wed May 19 14:05:09 CST 2021
mZxid = 0x800000006
mtime = Wed May 19 18:20:20 CST 2021
pZxid = 0x70000000a
cversion = 4
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 2
set -v:对指定版本设置
set -v 2 /sanguo 三国演义
setAcl
语法: setAcl [-s] [-v version] [-R] path acl
描述:设置字节权限
setAcl /test2 ip:192.168.0.1:crwda // 将节点权限设置为IP:ip:192.168.0.1的客户端可以对节点进行 增、删、改、查、管理权限
setquota
语法:setquota -n|-b val path
描述:
stat
语法:stat [-w] path
描述:同 ls -s 效果类似,stat -w 对节点进行监听
[zk: localhost:2181(CONNECTED) 4] stat /sanguo
cZxid = 0x600000022
ctime = Wed May 19 14:05:09 CST 2021
mZxid = 0x600000022
mtime = Wed May 19 14:05:09 CST 2021
pZxid = 0x70000000a
cversion = 4
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 2
sync
语法:sync path
描述:sync是使得client当前连接着的ZooKeeper服务器,和ZooKeeper的Leader节点同步(sync)一下数据。
[zk: localhost:2181(CONNECTED) 9] sync /sanguo
Sync is OK
命令参数总结
-e :表示该节点是一个临时节点
-s :查看该节点的详情信息
-w :监听该节点变化
-v :指的是dataVersion 的版本,可通过 -s 进行查看
-R :递归;可以展示节点下所有子节点。
-t :
-c :
-d :
-a :
-l :
-n :
-b :
很多命令,我也太明白具体是怎么用的,都先列出来吧,以后知道了,再补充上去,若大家知道,下方留言。我也会第一时间补充更改
zookeeper的acl权限控制
概述
zookeeper类似文件系统,client可以创建节点、更新节点、删除节点,那么如何做到节点的权限的控制呢?
acl权限控制,使用 scheme:id:permission来标识,主要涵盖3个方面:
- 权限模式(scheme):授权的策略
- 授权对象(id):授权的对象
- 权限(permission):授予的权限
其特征如下: - zookeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
- 每个znode支持设置多种权限方案和多个权限
- 子节点不会继承父节点的权限,客户端无权某节点,但可能访问它的子节点
权限模式
采用何种方式授权?
方案 | 描述 |
---|---|
world | 只有一个用户:anyone,代表登录zookeeper所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证 |
digest | 使用"用户:密码"方式认证 |
授权的对象
给谁授予权限
授权对象ID是指,权限赋予的实体,例如:IP地址或用户。
授予的权限
授予什么权限?
create、delete、read、writer、admin也就是 增、删、改、查、管理权限,这5种权限简写为cdrwa,注意这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。
权限 | ACL简写 | 描述 |
---|---|---|
create | c | 可以创建子节点 |
delete | d | 可以删除子节点(仅下一级节点) |
read | r | 可以读取节点数据及显示子节点列表 |
wirte | w | 可以设置节点数据 |
admin | a | 可以设置节点访问控制列表权限 |
授予的相关命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl |
读取ACL权限 |
setAcl | setAcl |
设置ACL权限 |
addauth | addauth |
添加认证用户 |
案例
- world授权模式
语法: setAcl
world:anyone:
案例一:设置 /node 所有权限
setAcl /node world:anyone:cdrwa
案例二:删除/node 创建子节点的权限
setAcl /node world:anyone:drwa
- ip授权模式
1.单IP权限设置
语法:setAcl
ip:
:
案例:把 /node 的权限只开放给192.168.0.2,其他ip无权访问。
setAcl /node ip:192.168.0.2:cdrwa
2.多IP权限设置
语法:setAcl
ip:
:
,ip:
:
,ip:
:
....
案例:对多个IP进行设置权限
setAcl /node ip:192.168.0.1:cdrwa,ip:192.168.0.2:cdrwa
- auth授权模式:
语法:
addauth digest
:
#添加认证用户
setAcl
auth:
:
案例:
添加授权用户
addauth digest user:123456
对user用户授权
setAcl /node auth:user:cdrwa
查看授权信息(密码是经过加密的
)
[zk: 192.168.0.1(CONNECTED) 15] getAcl /node
'digest,'user:6730fZhUE8JEFMcu0l64qI8e5ek=
: cdrwa
- digest授权模式
语法:
setAcl
digest:
:
:
:为加密后的密码
这里的密码是经过SHA1及BASE64处理的密文,在SHELL中可以通过以下命令计算:
echo -n
: | openssl dgst -binary -sha1 | openssl base64
[[email protected] ~]$ echo -n user:123456 | openssl dgst -binary -sha1 | openssl base64
OIZ3CaataRYETUhRnO2kKqU5kWk=
案例:
对 /node 就行授权
setAcl /node digest:user:OIZ3CaataRYETUhRnO2kKqU5kWk=:cdrwa
查看 /node 权限(这时是没有权限的)
[zk: localhost:2181(CONNECTED) 15] getAcl /node
Authentication is not valid : /node
添加授权用户
addauth digest user:123456
再次查看/node权限(这时就OK了)
[zk: localhost:2181(CONNECTED) 21] getAcl /node
'digest,'user:OIZ3CaataRYETUhRnO2kKqU5kWk=
- 多种授权模式
同一个节点可以同时使用多种授权模式
语法
setAcl
配置以上的多个权限,以逗号,
分割。
案例
对/node 使用多种授权模式
[zk: hadoop103(CONNECTED) 54] addauth digest user:123321
[zk: hadoop103(CONNECTED) 55] setAcl /node2 ip:192.168.200.102:drwa,ip:192.168.200.103:cdrwa,auth:user:rwa
查看权限
[zk: hadoop103(CONNECTED) 56] getAcl /node2
'ip,'192.168.200.102
: drwa
'ip,'192.168.200.103
: cdrwa
'digest,'user:OIZ3CaataRYETUhRnO2kKqU5kWk=
: rwa
- acl 超级管理员
zookeeper的权限管理模式有一种叫做,该模式提供一个超级管理可以方便的访问任何权限的节点。
假设这个超管是:$\color{red}{super:admin},需要先为超管生成密码的密文
echo -n super:admin | openssl dgst -binary -sha1 |openssl base64
[user@hadoop102 bin]$ echo -n super:admin | openssl dgst -binary -sha1 |openssl base64
xQJmxLMiHGwaqBvst5y6rkB6HQs=
那么打开zookeeper目录下/bin/zkServer.sh服务器脚本文件,找到如一行:
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \ "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
这就是脚本中启动zookeeper的命令,我们需要加一个超管的配置项
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=
那么修改完成后整条命令就变成了
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=" \ "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \ -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
之后启动zookeeper,输入如下命令添加权限
addauth digest supper:admin #添加认证用户