zookeeper 特性与使用说明

一、zookeeper概要、背景及作用

什么是zookeeper

引入官方文档的两段描述:

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

ZooKeeper is a high-performance coordination service for distributed applications. It exposes common services - such as naming, configuration management, synchronization, and group services - in a simple interface so you don’t have to write them from scratch. You can use it off-the-shelf to implement consensus, group management, leader election, and presence protocols. And you can build on it for your own, specific needs.

官方文档链接: zookeeper.apache.org.

zookeeper的功能:

  • 分布式应用程序的协调服务
  • 提供分布式锁
  • 数据同步及选举机制

znode 节点

zookeeper 中数据基本单元叫节点,节点之下可包含子节点,最后以树级方式程现。每个节点拥有唯一的路径path。客户端基于PATH上传节点数据,zookeeper 收到后会实时通知对该路径进行监听的客户端。
在这里插入图片描述

二部署与常规配置

zookeeper 基于JAVA开发,下载后只要有对应JVM环境即可运行。其默认的端口号是2181运行前得保证其不冲突。

版本说明:

Apache ZooKeeper 3.6.1 这是 3.6 分支的第二个版本,也是一个 bugfix 版本,修复了针对 ZooKeeper 3.5 构建的应用程序有关的一些兼容性问题。从 3.5.7 升级到 3.6.1 像往常一样执行即可,无需特别的附加升级程序。只要不使用 3.5 中不存在的新 API,ZooKeeper 3.6.1 客户端与 3.5 服务器 兼容。

另请注意:建议的最低JDK版本为1.8 文件说明:

  • apache-zookeeper-xxx-tar.gz 代表源代码
  • apache-zookeeper-xxx-bin.tar.gz 运行版本

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz

扫描二维码关注公众号,回复: 11210115 查看本文章
#下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
#解压
tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz
#拷贝默认配置
cd  {zookeeper_home}/conf 
cp zoo_sample.cfg zoo.cfg
#启动
 ./{zookeeper_home}/bin/zkServer.sh start

目录结构与常规配置文件说明

zookeeper 目录结构 L2
lib、docs目录未展开

.
├── LICENSE.txt
├── NOTICE.txt
├── README.md
├── README_packaging.md
├── bin
│   ├── README.txt
│   ├── zkCleanup.sh
│   ├── zkCli.cmd
│   ├── zkCli.sh
│   ├── zkEnv.cmd
│   ├── zkEnv.sh
│   ├── zkServer-initialize.sh
│   ├── zkServer.cmd
│   ├── zkServer.sh
│   ├── zkSnapShotToolkit.cmd
│   ├── zkSnapShotToolkit.sh
│   ├── zkTxnLogToolkit.cmd
│   └── zkTxnLogToolkit.sh
├── conf
│   ├── configuration.xsl
│   ├── log4j.properties
│   └── zoo_sample.cfg
├── lib
└── docs

zookeeper 默认配置文件 zoo.cfg

# zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
# 允许follower初始化连接到leader最大时长,它表示tickTime时间倍数 即:initLimit*tickTime
initLimit=10
# 允许follower与leader数据同步最大时长,它表示tickTime时间倍数 
syncLimit=5
#zookeper 数据存储目录
dataDir=/tmp/zookeeper
#对客户端提供的端口号
clientPort=2181
#单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#自动触发清除任务时间间隔,小时为单位。默认为0,表示不自动清除。
autopurge.purgeInterval=1

客户端命令


基本命令列表 
close  #关闭当前会话
connect host:port #重新连接指定Zookeeper服务 
create [-s] [-e] [-c] [-t ttl] path [data] [acl] #创建节点 
delete [-v version] path #删除节点,(不能存在子节点) 
deleteall path #删除路径及所有子节点 
setquota -n|-b val path #设置节点限额 -n 子节点数 -b 字节数 
listquota path #查看节点限额 
delquota [-n|-b] path #删除节点限额 
get [-s] [-w] path #查看节点数据 -s 包含节点状态 -w 添加监听 
getAcl [-s] path #查看节点acl权限
ls [-s] [-w] [-R] path #列出子节点 -s状态 -R 递归查看所有子节点 -w 添加监听 
printwatches on|off #是否打印监听事件 
quit  #退出客户端 
history  #查看执行的历史记录 
redo cmdno #重复 执行命令,history 中命令编号确定 
removewatches path [-c|-d|-a] [-l] #删除指定监听 
set [-s] [-v version] path data #设置值 
setAcl [-s] [-v version] [-R] path acl #为节点设置ACL权限 
stat [-w] path #查看节点状态 -w 添加监听 
sync path #强制同步节点

三、zookeeper节点介绍

  • 节点类型
  • 节点的监听(watch)
  • 节点属性说明(stat)
  • 节点权限设置(acl)

zookeeper 中节点叫znode存储结构上跟文件系统类似,以树级结构进行存储。不同之外在于znode没有目录的概念,不能执行类似cd之类的命令。znode结构包含如下:

  • path:唯一路径
  • childNode:子节点
  • stat:状态属性
  • type:节点类型
类型 描述
PERSISTENT 持久节点
PERSISTENT_SEQUENTIAL 持久序号节点
EPHEMERAL 临时节点(不可在拥有子节点)
EPHEMERAL_SEQUENTIAL 临时序号节点(不可在拥有子节点)
  • PERSISTENT(持久节点)
    持久化保存的节点,也是默认创建的
#默认创建的就是持久节点
create /test
  • PERSISTENT_SEQUENTIAL(持久序号节点)
    创建时zookeeper 会在路径上加上序号作为后缀,。非常适合用于分布式锁、分布式选举等场景。创建时添加 -s 参数即可。
#创建序号节点
create -s /testS
#返回创建的实际路径
Created /testS0000000001
create -s /test
#返回创建的实际路径2
Created /testS0000000002
  • EPHEMERAL(临时节点)
    临时节点会在客户端会话断开后自动删除。适用于心跳,服务发现等场景。创建时添加参数-e 即可。
#创建临时节点, 断开会话 在连接将会自动删除
create -e /testE
  • EPHEMERAL_SEQUENTIAL(临时序号节点)
    与持久序号节点类似,不同之处在于EPHEMERAL_SEQUENTIAL是临时的会在会话断开后删除。创建时添加 -e -s
#创建临时序号节点
create -e -s /test/testE

节点属性

# 查看节点属性
stat /test

属性列表:

#test 节点属性
#创建节点的事务ID
cZxid = 0x2
#创建时间
ctime = Sat May 16 14:39:13 CST 2020
#修改节点的事务ID
mZxid = 0x2
#最后修改时间
mtime = Sat May 16 14:39:13 CST 2020
# 子节点变更的事务ID
pZxid = 0x2
#这表示对此znode的子节点进行的更改次数(不包括子节点)
cversion = 0
# 数据版本,变更次数
dataVersion = 0
#权限版本,变更次数
aclVersion = 0
#临时节点所属会话ID 0x0代表持久节点
ephemeralOwner = 0x0
#数据长度 字节数
dataLength = 0
#子节点数(不包括子子节点)
numChildren = 0


#testE 节点属性
cZxid = 0x8
ctime = Sat May 16 21:12:51 CST 2020
mZxid = 0x8
mtime = Sat May 16 21:12:51 CST 2020
pZxid = 0x8
cversion = 0
dataVersion = 0
aclVersion = 0
# 临时节点 此属性值为会话ID
ephemeralOwner = 0x10010e9c9f50000
dataLength = 0
numChildren = 0

节点的监听

命令 描述
ls -w path 监听子节点的变化(增,删)
get -w path 监听节点数据的变化
stat -w path 监听节点属性的变化
printwatches on|off 触发监听后,是否打印监听事件(默认on)

acl权限设置

ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode的防问。基于scheme: id :permission的方式进行权限控制。scheme表示授权模式、id模式对应值、permission即具体的增删改权限位。

scheme:认证模型

方案 描述
world 开放模式,world表示全世界都可以访问(这是默认设置)
ip ip模式,限定客户端IP防问
auth 用户密码认证模式,只有在会话中添加了认证才可以防问
digest 与auth类似,区别在于auth用明文密码,而digest 用sha-1+base64加密后的密码。在实际使用中digest 更常见。

permission:权限位

权限位 权限 描述
c CREATE 可以创建子节点
d DELETE 可以删除子节点(仅下一级节点)
r READ 可以读取节点数据及显示子节点列表
w WRITE 可以设置节点数据
a ADMIN 可以设置节点访问控制列表权限

acl 相关命令:

命令 使用方式 描述
getAcl getAcl 读取ACL权限
setAcl setAcl 设置ACL权限
addauth addauth 添加认证用户

world权限示例
语法: setAcl world:anyone:<权限位> 注:world模式中anyone是唯一的值,表示任何用户

  • 查看默认节点权限:
#创建一个节点
create -e /testAcl
#查看节点权限
getAcl /testAcl
#返回的默认权限表示 ,所有人拥有所有权限。
'world,'anyone: cdrwa
  • 修改默认权限为 读写
#设置为rw权限 
setAcl /testAcl world:anyone:rw
# 可以正常读
get /testAcl
# 无法正常创建子节点
create -e /testAcl/t "hi"
# 返回没有权限的异常
Authentication is not valid : /testAcl/t

IP权限示例:
语法:
setAcl ip::<权限位>

setAcl /test ip:127.0.0.1:cdrwa

auth模式示例:
语法:

  • setAcl auth:<用户名>:<密码>:<权限位>
  • addauth digest <用户名>:<密码>

digest 权限示例:
语法:

  • setAcl digest :<用户名>:<密钥>:<权限位>
  • addauth digest <用户名>:<密码>

注1:密钥 通过sha1与base64组合加密码生成,可通过以下命令生成

在这里插入代码片echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64

注2:为节点设置digest 权限后,访问前必须执行addauth,当前会话才可以防问。

  • 设置digest 权限
#先 sha1 加密,然后base64加密
echo -n test:123456 | openssl dgst -binary -sha1 | openssl base64
#返回密钥
PbXQT4DQMDcaYC1X0EY0B2RZCwM=
#设置digest权限
setAcl /test digest:test:PbXQT4DQMDcaYC1X0EY0B2RZCwM=:cdrw
  • 查看节点将显示没有权限
#查看节点
get /test
#显示没有权限访问
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
  • 给当前会话添加认证后在次查看
#给当前会话添加权限帐户
addauth digest test:123456
#在次查看
get /test
#获得返回结果
test data

ACL的特殊说明: 权限仅对当前节点有效,不会让子节点继承。如限制了IP防问A节点,但不妨碍该IP防问A的子节点 /A/B。

原创文章 6 获赞 15 访问量 718

猜你喜欢

转载自blog.csdn.net/qq_33520945/article/details/106163009
今日推荐