第二章 Zookeeper基础学习笔记

本文详述了Zookeeper在Windows和Linux环境下的安装步骤,包括单机和集群配置,介绍了Zookeeper的主要特性,如会话、数据模型、节点类型、节点状态属性和ACL权限控制,并涵盖了命令行操作和Java客户端的使用。此外,还提到了Zookeeper的日志可视化和数据安全方面的内容。
摘要由CSDN通过智能技术生成

一、安装部署

先把ZK安装起来,后面的很多操作,都是的前提都是由ZK的操作环境,先来把ZK安装好

1、Zookeeper-Windows环境安装

环境要求:必须要有jdk环境,本次讲课使用jdk1.8

1)安装jdk1.8

2)安装Zookeeper. 在官网http://zookeeper.apache.org/下载zookeeper,我下载的是zookeeper-3.4.12版本。解压zookeeper-3.4.6至D:\zookeeper\zookeeper-3.4.12,在D:\zookeeper\新建data及log目录。

3)ZooKeeper的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪分布模式。ZooKeeper单机模式的安装相对比较简单,如果第一次接触ZooKeeper的话,建议安装ZooKeeper单机模式或者集群伪分布模式。

安装单击模式至D:\zookeeper\zookeeper-3.4.12\conf 复制 zoo_sample.cfg 并粘贴到当前目录下,命名zoo.cfg,然后修改配置dataDir=D:\\zookeeper\\data,dataLogDir=D:\\zookeeper\\log,启动测试。

2、Zookeeper-Linux环境安装(单机)

1)下载安装文件zookeeper-3.4.12.tar.gz

镜像地址1: http://apache.fayea.com/zookeeper/

镜像地址2: http://mirrors.hust.edu.cn/apache/zookeeper/

2)上传文件到:/usr/local/src/ 目录下

3新建/usr/local/zookeeper文件夹

mkdir -pv /usr/local/zookeeper

4拷贝文件到指定文件夹

cd /usr/local/src/

cp ./zookeeper-3.4.12.tar.gz /usr/local/zookeeper

5解压

tar -zxvf zookeeper-3.4.12.tar.gz

6配置环境变量

cd /etc/

cp ./profile ./profile.bak -- 把文件备份一下

vim /etc/profile -- 编辑此配置文件

在文件末尾添加此段内容: -- 开始和--中间的一段。

(注意:尽量保持环境变量名全大写,下划线隔开,保持规范)

export ZOOKEEPER_INSTALL=/usr/local/zookeeper/zookeeper-3.4.12/

export PATH=$PATH:$ZOOKEEPER_INSTALL/bin

7配置文件修改

cd /usr/local/zookeeper/zookeeper-3.4.12/conf/ -- 进入文件所在路径

cp zoo_sample.cfg zoo.cfg -- 将zoo.sample.cfg拷贝出一份zoo.cfg出来,文件名强制重命名为zoo.cfg。

8文件内容如下:

vim zoo.cfg -- 按i进入编辑模式. 修改完成之后, esc退出编辑模式, 大写字母Z双击即可保存。

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data  -- 设置一下文件路径 路径必须存在,不存在的话就新建一个呗
dataLogDir=/usr/local/zookeeper/log  -- 日志路径 路径必须存在,不存在的话就新建一个呗
# the port at which the clients will connect
clientPort=2181 -- 如果是多机器的话,在clientPort处添加服务器的ip
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

修改完之后 通过 > # cat zoo.cfg 查看.

9开启服务,关闭服务, 查看

[root@localhost bin]# cd /usr/local/zookeeper/zookeeper.3.4.12/bin/

[root@localhost bin]# ./zkServer.sh stop -- 停止服务

JMX enabled by default

Using config: /usr/local/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg

Stopping zookeeper ... STOPPED

[root@localhost bin]# ./zkServer.sh start -- 开启服务

JMX enabled by default

Using config: /usr/local/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@localhost bin]# ./zkServer.sh status -- 查看状态

JMX enabled by default

Using config: /usr/local/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg

Mode: standalone

[root@localhost bin]#

[root@localhost bin]# ./zkCli.sh -- 客户端启动, 可以查看启动状态和日志

3、Zookeeper集群配置

3.1、安装jdk运行jdk环境(已安装则跳过)

上传jdk1.8安装包

安装jdk1.8环境变量

vi /etc/profile

设置如下环境变量:

export JAVA_HOME=/usr/local/src/jdk1.8.0_221

export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.12

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH

刷新profile文件

source /etc/profile

3.2、关闭防火墙:

##查看防火墙状态,是否是running

firewall-cmd --state

#停止firewall

systemctl stop firewalld.service

#禁止firewall开机启动

systemctl disable firewalld.service

3.3、下载zookeeper安装包

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

1)解压Zookeeper安装包:tar -zxvf zookeeper-3.4.10.tar.gz

2)修改Zookeeper文件夹名称:重命名: mv zookeeper-3.4.10 zookeeper

3)复制zoo_sample.cfg文件zoo.cfg

cd /usr/local/zookeeper/conf

mv zoo_sample.cfg zoo.cfg

4)修改conf:  

vi zoo.cfg 修改两处

  • dataDir=/usr/local/zookeeper/data(注意同时在zookeeper创建data目录)
  • 最后面添加

server.0=192.168.212.154:2888:3888

server.1=192.168.212.156:2888:3888

server.2=192.168.212.157:2888:3888

5)创建服务器标识

服务器标识配置:
创建文件夹: mkdir data
创建文件myid并填写内容为0: vi
myid (内容为服务器标识 : 0)

6)复制zookeeper

进行复制zookeeper目录到node1和node2
还有/etc/profile文件
把node1、 node2中的myid文件里的值修改为1和2
路径(vi /usr/local/zookeeper/data/myid)

7)启动zookeeper
路径: /usr/local/zookeeper/bin
执行: zkServer.sh start
(注意这里3台机器都要进行启动)
状态: zkServer.sh
status(在三个节点上检验zk的mode,一个leader和俩个follower)

  • scp -r  /soft  root@zk2:/
  • scp -r  /soft  root@zk3:/

4、目录结构

  • bin             存放系统脚本
  • conf            存放配置文件
  • contrib          zk附加功能支持
  • dist-maven       maven仓库文件
  • docs            zk文档
  • lib              依赖的第三方库
  • recipes          经典场景样例代码
  • src             zk源码

其中bin和conf是非常重要的两个目录,平时也是经常使用的。

4.1、bin目录

先看下bin目录:

 

其中zkServer为服务器,启动后默认端口为2181,zkCli为命令行客户端。

4.2、conf目录

Conf目录为配置文件存放的目录,zoo.cfg为核心的配置文件,这里面的配置很多,这配置是运维的工作,目前没必要,也没办法全部掌握。

1clientPort:客户端连接server的端口,即对外服务端口,一般设置为2181吧。

2dataDir:存储快照文件snapshot的目录。默认情况下事务日志也会存储在这里,建议同时配置参

3tickTime:ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。

4dataLogDir:事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能。(No Java system property)

5globalOutstandingLimit:最大请求堆积数。默认是1000。ZK运行的时候, 尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。(Java system property: zookeeper.globalOutstandingLimit.)

6preAllocSize:预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。(Java system property: zookeeper.preAllocSize)

7snapCount每进行snapCount次事务日志输出后,触发一次快照(snapshot), 此时,ZK会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*。默认是100000.(真正的代码实现中,会进行一定的随机数处理,以避免所有服务器在同一时间进行快照而影响性能)(Java system property:  zookeeper.snapCount)

8traceFile用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能。(Java system property:? requestTraceFile)

9maxClientCnxns单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。

10clientPortAddress对于多网卡的机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听 clientPort指定的端口。 New in 3.3.0

11minSessionTimeout/maxSessionTimeout:Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围 New in 3.3.0

12fsync.warningthresholdms:事务日志输出时,如果调用fsync方法超过指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。(Java system property: fsync.warningthresholdms) New in 3.3.4

13autopurge.purgeInterval在上文中已经提到,3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。(No Java system property) New in 3.4.0

14autopurge.snapRetainCount这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。(No Java system property) New in 3.4.0

15electionAlg在之前的版本中, 这个参数配置是允许我们选择leader选举算法,但是由于在以后的版本中,只会留下一种“TCP-based version of fast leader election”算法,所以这个参数目前看来没有用了,这里也不详细展开说了。(No Java system property)

16initLimit Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了。(No Java system property)

17syncLimit在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。

18leaderServes默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是,如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,这样一来,会大大提高写操作的性能。(Java system property: zookeeper. leaderServes)。

19server.x=[hostname]:nnnnn[:nnnnn]这里的x是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于F和L之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。

20group.x=nnnnn[:nnnnn]weight.x=nnnnn对机器分组和权重设置。

21cnxTimeout Leader选举过程中,打开一次连接的超时时间,默认是5s。(Java system property: zookeeper. cnxTimeout)。

22zookeeper.DigestAuthenticationProvider.superDigestZK权限设置相关,具体参见 《 使用super 身份对有权限的节点进行操作》 和 《 ZooKeeper 权限控制》。

23skipACL对所有客户端请求都不作ACL检查。如果之前节点上设置有权限限制,一旦服务器上打开这个开头,那么也将失效。(Java system property: zookeeper.skipACL)。

24forceSync这个参数确定了是否需要在事务日志提交的时候调用 FileChannel.force来保证数据完全同步到磁盘。(Java system property: zookeeper.forceSync)。

25jute.maxbuffer每个节点最大数据量,是默认是1M。这个限制必须在server和client端都进行设置才会生效。(Java system property: jute.maxbuffer)。

4.3、在这挑选几个讲解:

clientPort:参数无默认值,必须配置,用于配置当前服务器对外的服务端口,客户端必须使用这端口才能进行连接。

dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)

dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争

dataDir新安装zk这文件夹里面是没有文件的,可以通过snapCount参数配置产生快照的时机。

以下配置集群中才会使用,后面再讨论:

tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间

initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值

syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。

二、ZK的特性

Zk的特性会从会话、数据节点,版本,Watcher,ACL权限控制,集群角色这些部分来了解,其中重点需要掌握的数据节点与Watcher。

1、会话

客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输;

 

会话(session)是zookepper非常重要的概念,客户端和服务端之间的任何交互操作都与会话有关

会话状态:

看下这图,Zk客户端和服务端成功连接后,就创建了一次会话,ZK会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括:CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE

一旦客户端开始创建Zookeeper对象,那么客户端状态就会变成CONNECTING状态,同时客户端开始尝试连接服务端,连接成功后,客户端状态变为CONNECTED,通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper客户端会自动进行重连服务,同时客户端状态再次变成CONNCTING,直到重新连上服务端后,状态又变为CONNECTED,在通常情况下,客户端的状态总是介于CONNECTING和CONNECTED之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会直接变更为CLOSE状态。

2、ZK数据模型

ZooKeeper的视图结构和标准的Unix文件系统类似,其中每个节点称为“数据节点”或ZNode,每个znode可以存储数据,还可以挂载子节点,因此可以称之为“树”。第二点需要注意的是,每一个znode都必须有值,如果没有值,节点是不能创建成功的。

  • 在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据
  • 通过客户端可对znode进行增删改查的操作,还可以注册watcher监控znode的变化。

3、Zookeeper节点类型

节点类型非常重要,是后面项目实战的基础。

A)Znode有两种类型:

短暂(ephemeral)(create -e /app1/test1 “test1” 客户端断开连接zk删除ephemeral类型节点) 
持久(persistent) (create -s /app1/test2 “test2” 客户端断开连接zk不删除persistent类型节点)

B)Znode有四种形式的目录节点(默认是persistent )

PERSISTENT  持久节点

PERSISTENT_SEQUENTIAL(持久序列/test0000000019 ) 

EPHEMERAL 临时节点

EPHEMERAL_SEQUENTIAL 临时顺序节点

C)创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护 。

示例:创建节点命令如下(Windows客户端):

[zk: localhost:2181(CONNECTED) 11] ls /
[node, dubbo, zookeeper]
[zk: localhost:2181(CONNECTED) 12] create /zookeeper/node2 100
Created /zookeeper/node2

D)在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。

示例:创建顺序节点命令如下(Windows客户端):

[zk: localhost:2181(CONNECTED) 14] create -s /zookeeper/node2 100
Created /zookeeper/node20000000002
[zk: localhost:2181(CONNECTED) 15] create -s /zookeeper/node3 100
Created /zookeeper/node30000000003
[zk: localhost:2181(CONNECTED) 16] create -s /zookeeper/node4 100
Created /zookeeper/node40000000004
[zk: localhost:2181(CONNECTED) 17]

查看创建的子节点节点:get /zookeeper/node30000000003

[zk: localhost:2181(CONNECTED) 35] get /zookeeper/node30000000003
100
cZxid = 0x25657
ctime = Thu Aug 15 15:36:08 CST 2019
mZxid = 0x25657
mtime = Thu Aug 15 15:36:08 CST 2019
pZxid = 0x25657
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 36]

4、Zookeeper节点状态属性

[zk: localhost:2181(CONNECTED) 19] get /zookeeper/node2

100

cZxid = 0x25655

ctime = Thu Aug 15 15:34:33 CST 2019

mZxid = 0x25655

mtime = Thu Aug 15 15:34:33 CST 2019

pZxid = 0x25655

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 3

numChildren = 0

[zk: localhost:2181(CONNECTED) 20 ]

 

5、ACL保障数据的安全

ACL机制,表示为scheme:id:permissions,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(如只读,读写,管理等)。

zookeeper提供了如下几种机制(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段。
  • 现在看这可能懵懵懂懂,不过没有关系,等会在客户端操作的时候会有详细的操作

三、命令行

1、服务端常用命令

在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作 

  • 启动ZK服务:       sh bin/zkServer.sh start ·
  • 查看ZK服务状态: sh bin/zkServer.sh status · 
  • 停止ZK服务:       sh bin/zkServer.sh stop · 
  • 重启ZK服务:       sh bin/zkServer.sh restart 

2、客户端常用命令

使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 命令行工具的一些简单操作如下:

  • 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容 
  • 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据 
  • 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串  [-e] [-s] 【-e 零时节点】 【-s 顺序节点】
  • 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串  [watch]【watch 监听】
  • 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 ·
  • 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败 
  • 递归删除:rmr  /zk将刚才创建的 znode 删除,子节点同时删除
  • 退出客户端: quit ·
  • 帮助命令: help

3、ACL命令说明

再回过头来看下ACL权限,Zookeeper的ACL(Access Control List),分为三个维度:scheme、id、permission

通常表示为:scheme:id:permission

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

3.1、Scheme

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

3.2、id

id是验证模式,不同的scheme,id的值也不一样。scheme为auth时:username:password

  • scheme为digest时:username:BASE64(SHA1(password))
  • scheme为ip时:客户端的ip地址。
  • scheme为world时:anyone。

3.3、Permission

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

  • CREATE(c):创建子节点的权限
  • DELETE(d):删除节点的权限
  • READ(r):读取节点数据的权限
  • WRITE(w):修改节点数据的权限
  • ADMIN(a):设置子节点权限的权限

4、ACL常用命令

4.1、getAcl

获取指定节点的ACL信息

create /testDir/testAcl deer  # 创建一个子节点

getAcl /testDir/testAcl      # 获取该节点的acl权限信息

4.2、setAcl

设置指定节点的ACL信息

create /zookeeper/testacl 100

setAcl /zookeeper/testacl world:anyone:crwa   # 设置该节点的acl权限

getAcl /zookeeper/testacl     # 获取该节点的acl权限信息,成功后,该节点就少了d权限

[zk: localhost:2181(CONNECTED) 47] getAcl /zookeeper/testacl
'world,'anyone
: crwa
[zk: localhost:2181(CONNECTED) 48]

create /zookeeper/testacl/xyz xyz-data   # 创建子节点

创建结果:Created /zookeeper/testacl/xyz

delete /zookeeper/testacl/xyz    # 由于没有d权限,所以提示无法删除

[zk: localhost:2181(CONNECTED) 49] delete /zookeeper/testacl/xyz
Authentication is not valid : /zookeeper/testacl/xyz

4.3、addauth

注册会话授权信息

4.4、Auth

addauth digest user1:123456     # 需要先添加一个用户

setAcl /testDir/testAcl auth:user1:123456:crwa   # 然后才可以拿着这个用户去设置权限

getAcl /testDir/testAcl    # 密码是以密文的形式存储的

[zk: localhost:2181(CONNECTED) 52] getAcl /zookeeper/testacl

'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=

: crwa

create /testDir/testAcl/testa aaa   

delete /testDir/testAcl/testa   # 由于没有d权限,所以提示无法删除

退出客户端后:

ls /testDir/testAcl  #没有权限无法访问

create /testDir/testAcl/testb bbb #没有权限无法访问

addauth digest user1:123456  # 重新新增权限后可以访问了

[zk: localhost:2181(CONNECTED) 1] ls /zookeeper/testacl
Authentication is not valid : /zookeeper/testacl
[zk: localhost:2181(CONNECTED) 2] create /zookeeper/testacl/testb bbb
Authentication is not valid : /zookeeper/testacl/testb
[zk: localhost:2181(CONNECTED) 3] addauth digest user1:123456
[zk: localhost:2181(CONNECTED) 4] ls /zookeeper/testacl
[xyz, testa]

4.5、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=

4.6、acl命令行ip

create  /testDir/testIp data

setAcl  /testDir/testIp ip:192.168.30.10:cdrwa

getAcl  /testDir/testIp

[zk: localhost:2181(CONNECTED) 13] getAcl  /zookeeper/testIp
'ip,'192.168.30.10
: cdrwa
[zk: localhost:2181(CONNECTED) 14]

5、常用四字命令

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 相关的路径。

6、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

四、Java客户端框架(*重要)

1、Zookeeper原生客户端

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>enjoy</groupId>
    <artifactId>zookeeperJavaApi</artifactId>
    <version>1.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.12</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.0.0</version>
    </dependency>
</dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2、创建会话

package cn.enjoy.javaapi;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
/**
 * Created by VULCAN on 2018/11/5.
 */
public class TestCreateSession {
    //ZooKeeper服务地址
    private static final String SERVER = "192.168.30.10:2181";
    //会话超时时间
    private final int SESSION_TIMEOUT = 30000;
    @Test
    /**
     * 获得session,这种方式可能会在ZooKeeper还没有获得连接的时候就已经对ZK进行访问了
     */
    public  void testSession1() throws Exception {
        ZooKeeper zooKeeper = new ZooKeeper(SERVER,SESSION_TIMEOUT,null);
        System.out.println(zooKeeper);
        System.out.println(zooKeeper.getState());
    }
    //发令枪
    private CountDownLatch countDownLatch = new CountDownLatch(1);

    @Test
    /**
     * 对获得Session的方式进行优化,在ZooKeeper初始化完成以前先等待,等待完成后再进行后续操作
     */
    public  void testSession2() throws  Exception {
        ZooKeeper zooKeeper = new ZooKeeper(SERVER, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                    //确认已经连接完毕后再进行操作
                    countDownLatch.countDown();
                    System.out.println("已经获得了连接");
                }
            }
        });
        //连接完成之前先等待
        countDownLatch.await();
        System.out.println(zooKeeper.getState());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值