0%

zookeeper 安装

一、介绍

ZooKeeper 是一个开源的分布式协调服务

二、概念

Data model(数据模型)

ZooKeeper 数据模型采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二级制序列。并且。每个节点还可以拥有 N 个子节点,最上层是根节点以“/”来代表。每个数据节点在 ZooKeeper 中被称为 znode,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都一个唯一的路径标识。

ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,所以不要放比较大的数据在 znode 上,ZooKeeper 给出的上限是每个结点的数据大小最大是 1M

znode(数据节点)

在 ZooKeeper 中被称为 znode,它是 ZooKeeper 中数据的最小单元。

znode 分为 4 大类:

  • 持久(PERSISTENT)节点 :一旦创建就一直存在即使 ZooKeeper 集群宕机,直到将其删除。
  • 临时(EPHEMERAL)节点 :临时节点的生命周期是与 客户端会话(session) 绑定的,会话消失则节点消失 。并且,临时节点只能做叶子节点 ,不能创建子节点。
  • 持久顺序(PERSISTENT_SEQUENTIAL)节点 :除了具有持久(PERSISTENT)节点的特性之外, 子节点的名称还具有顺序性。比如 /node1/app0000000001/node1/app0000000002
  • 临时顺序(EPHEMERAL_SEQUENTIAL)节点 :除了具备临时(EPHEMERAL)节点的特性之外,子节点的名称还具有顺序性。

每个 znode 由 2 部分组成:

  • stat :状态信息
  • data : 节点存放的数据的具体内容
znode 状态信息 解释
cZxid create ZXID,即该数据节点被创建时的事务 id
ctime create time,即该节点的创建时间
mZxid modified ZXID,即该节点最终一次更新时的事务 id
mtime modified time,即该节点最后一次的更新时间
pZxid 该节点的子节点列表最后一次修改时的事务 id,只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新
cversion 子节点版本号,当前节点的子节点每次变化时值增加 1
dataVersion 数据节点内容版本号,节点创建时为 0,每更新一次节点内容(不管内容有无变化)该版本号的值增加 1
aclVersion 节点的 ACL 版本号,表示该节点 ACL 信息变更次数
ephemeralOwner 创建该临时节点的会话的 sessionId;如果当前节点为持久节点,则 ephemeralOwner=0
dataLength 数据节点内容长度
numChildren 当前节点的子节点个数

ACL(权限控制)

ZooKeeper 采用 ACL(AccessControlLists)策略来进行权限控制,类似于 UNIX 文件系统的权限控制。

对于 znode 操作的权限,ZooKeeper 提供了以下 5 种:

  • CREATE : 能创建子节点
  • READ :能获取节点数据和列出其子节点
  • WRITE : 能设置/更新节点数据
  • DELETE : 能删除子节点
  • ADMIN : 能设置节点 ACL 的权限

其中尤其需要注意的是,CREATEDELETE 这两种权限都是针对 子节点 的权限控制。

对于身份认证,提供了以下几种方式:

  • world : 默认方式,所有用户都可无条件访问。
  • auth :不使用任何 id,代表任何已认证的用户。
  • digest :用户名:密码认证方式: username:password
  • ip : 对指定 ip 进行限制。

Watcher(事件监听器)

​ Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

三、下载安装

1
2
3
4
5
6
7
8
#解压
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz

#配置环境变量
vim /etc/profile
ZK_HOME=/opt/apache-zookeeper-3.7.0-bin
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$ZK_HOME/bin
source /etc/profile

四、配置

zoo.cfg

拷贝配置cp zoo_sample.cfg zoo.cfg,并需要修改zoo.cfg文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
#数据存放文件路径
dataDir=/var/zookeeper
#文件尾部插入zookeeper服务节点
#2888是leader接收write请求的端口
#3888是投票选举的端口
server.1=192.168.142.121:2888:3888
server.2=192.168.142.122:2888:3888
server.3=192.168.142.123:2888:3888
server.4=192.168.142.124:2888:3888

myid

myid文件存放入zoo.cfgdataDir指定路径下

myid文件标识当前zookeeper是节点中的哪个服务,文件内容与上面的server.xx对应

1
2
3
4
5
#第一种
vim /var/zookeeper/myid
1 #填写服务节点对应的数字
#第二种
echo 1 > /var/zookeeper/myid

五、远程复制

将zookeeper复制到每一台机子上

1
scp -r /opt/apache-zookeeper-3.7.0-bin/ root@192.168.142.122:/opt/apache-zookeeper-3.7.0-bin/

每台机子重复创建myid并设置属于自己的server.x的x值

六、相关参数

服务端参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#前台启动
zkServer.sh start-foreground
#后台启动
zkServer.sh start
#停止
zkServer.sh stop
#版本信息
zkServer.sh version
#重启
zkServer.sh restart
#状态信息(版本+角色)
zkServer.sh status
#启动命令参数
zkServer.sh print-cmd

客户端参数

1
2
3
#客户端连接
zkCli.sh
zkCli.sh -server 192.168.142.121:2181

七、命令

登录zk客户端可执行以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ZooKeeper -server host:port -client-configuration properties-file cmd args
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
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 [-b batch size]
delquota [-n|-b|-N|-B] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
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]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b|-N|-B val path
stat [-w] path
sync path
version
whoami

ls

#查看目录下文件节点信息
ls [-s] [-w] [-R] path

config

#查看配置信息
config [-c] [-w] [-s]

create

创建空节点

-e创建临时节点,当前客户端退出则消失

-s创建分布式节点,用于多线程竞争创建,创建时会在文件名后拼接递增的序列数值

get

获取节点参数值,图中/node/data为有值节点、/node/test为无值节点

set

设置节点参数

history

当前客户端自登录链接以来执行的历史命令

delete

删除节点,不是子节点不能删除

stat

节点状态信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[zk: 192.168.142.121:2181(CONNECTED) 1] stat /node
# cZxid 有64位,前32位表示Leader的纪元,后32位表示事务ID
# ZK顺序执行,Leader维护着一个自增事务ID:00000002
# 0x2 表示的是Leader的纪元
# cZxid 的 c 表示 create,cZxid表示也就是创建节点的事务ID
cZxid = 0x10000000e
# 创建时间
ctime = Mon May 17 13:58:57 CST 2021
# 修改节点的事务ID
mZxid = 0x10000001d
mtime = Mon May 17 14:54:09 CST 2021
# 当前这个节点下创建的最后一个节点的ID
pZxid = 0x10000001b
cversion = 7
dataVersion = 2
aclVersion = 0
#临时持有者 0x0表示持久节点,临时节点则存对应的是sessionId
ephemeralOwner = 0x0
dataLength = 3
numChildren = 5