准备环境

centos8 + jdk8 (linux环境已经提前搭建好了)

zookeeper使用版本版本: zookeeper-3.7.0

下载zk

http://zookeeper.apache.org
在这里插入图片描述

Apache ZooKeeper
在这里插入图片描述

Apache Downloads

下载链接: https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz

准备三台虚拟机

192.168.71.134

192.168.71.128

192.168.71.135

安装位置: ~

开始安装

上传文件

rz -E

解压

# 解压
tar -xzvf apache-zookeeper-3.7.0-bin.tar.gz
# 重命名
mv apache-zookeeper-3.7.0-bin zookeeper-3.7.0-bin

命令积累:

ctrl+u ctrl+k 分别代表光标处往前和光标处往后删除

ctrl+a ctrl+e 分别代表把管标移动到最前和最后

ctrl+ c : Linux 快速删除已输入的命令 (xshell 无效)

xshell清理屏幕: ctrl+l或ctrl+shift+l(还留有历史记录)

ctrl+shift+a(删除了历史缓冲区记录)

配置

zoo.cfg配置

[root@localhost ~]# cd zookeeper-3.7.0-bin/conf/
[root@localhost conf]# ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/root/zookeeper-3.7.0-bin/data
dataLogDir=/root/zookeeper-3.7.0-bin/log

server.1=192.168.71.134:2888:3888
server.2=192.168.71.128:2888:3888
server.3=192.168.71.135:2888:3888
: wq

配置如下

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/root/zookeeper-3.7.0-bin/data
dataLogDir=/root/zookeeper-3.7.0-bin/log

server.1=192.168.71.134:2888:3888
server.2=192.168.71.128:2888:3888
server.3=192.168.71.135:2888:3888

说明:

2181: 是zookeeper对外服务的端口

2888: 是各个节点的通信端口

3888: 是leader崩溃后的选举端口

myid配置

[root@localhost conf]# cd ../
[root@localhost zookeeper-3.7.0-bin]# ls
bin  conf  docs  lib  LICENSE.txt  NOTICE.txt  README.md  README_packaging.md
root@localhost zookeeper-3.7.0-bin]# mkdir data log
[root@localhost zookeeper-3.7.0-bin]# ls
bin  conf  data  docs  lib  LICENSE.txt  log  NOTICE.txt  README.md  README_packaging.md
[root@localhost zookeeper-3.7.0-bin]# vim ./data/myid
[root@localhost zookeeper-3.7.0-bin]# 

192.168.71.134 该主机输入1保存

其他主机重复zoo.cfg和myid配置操作, 只不过myid配置一次是2,3

192.168.71.128 该主机输入2保存

192.168.71.135 该主机输入3保存

启动集群

配置zk环境变量(方便敲命令,非必须)

vim ~/.bashrc

...
export ZK_HOME=/root/zookeeper-3.7.0-bin/bin
export PATH=$ZK_HOME:$PATH
: wq

# 使其生效
source .bashrc
[root@localhost ~]# echo $ZK_HOME
/root/zookeeper-3.7.0-bin/bin
[root@localhost ~]# echo $PATH
/root/zookeeper-3.7.0-bin/bin:/usr/local/jdk1.8.0_211/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

启动

分别启动三台

[root@localhost ~]# zkServer.sh start /root/zookeeper-3.7.0-bin/conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.7.0-bin/conf/zoo.cfg
Starting zookeeper ... STARTED
[root@localhost ~]# jps
3712 Jps
3677 QuorumPeerMain
[root@localhost ~]# 

使用客户端连接

zkCli.sh -server localhost:2181

报错如下:
empting reconnect except it is a SessionExpiredException.
EndOfStreamException: Unable to read additional data from server sessionid 0x0, likely server has closed socket

报错意思是好像客户server已经关闭

可能是端口防火墙导致不能通讯

开通防火墙

[root@localhost ~]# firewall-cmd --list-ports

[root@localhost ~]# firewall-cmd --list-ports --permanent 

[root@localhost ~]# firewall-cmd --add-port=2181/tcp --add-port=2888/tcp --add-port=3888/tcp --permanent 
success
[root@localhost ~]# firewall-cmd --list-ports --permanent 
2181/tcp 2888/tcp 3888/tcp
[root@localhost ~]# firewall-cmd --reload 
success

开通防火墙还是不行

jsp发现192.168.71.128的java进程竟然没有启动起来

在这台机器上发现myid是22(无语,自己太粗心了)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HdcOyyAu-1640181602688)(img/zookeeper%E9%9B%86%E7%BE%A4%E6%A8%A1%E5%BC%8F%E9%83%A8%E7%BD%B2/image-20211222210207668.png)]

[root@localhost zookeeper-3.7.0-bin]# jps
3536 ZooKeeperMain
3409 QuorumPeerMain
3595 Jps

多了一个ZooKeeperMain进程,这个是我们客户端的连接进程

注意: 防火墙开通那一步还是必须的

练习客户端命令

[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=
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐