Zookeeper核心概念
分布式应用的的数据管理问题
- 统一命名服务
- 状态同步服务
- 集群管理
- 分布式应用配置管理
核心概念
类似存储少量数据,基于内存的数据库
一:文件系统数据结构
类似文件系统的数据结构
:只有绝对路径,没有相对路径
每个子目录被称为:znode(目录节点),可以增删znode
六种类型znode
- PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在 - PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 - EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除 - EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号 - Container 节点
(3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s 检查一次) - TTL 节点(
默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定)
启动文件中
二:监听通知机制
可以监听任意节点,或目录节点,或递归目录节点
- 如果注册的是对某个节点的监听,则当这个节点被删除,或者被修改时,对应的客户端将被通知
- 如果注册的是对某个目录的监听,则当这个目录有子节点被创建,或者有子节点被删除,对应的客户端将被通知
- 如果注册的是对某个目录的递归子节点进行监听,则当这个目录下面的任意子节点有目录结构的变化(有子节点被创建,或被删除)或者根节点有数据变化时,对应的客户端将被通知
监听只是一次性的,一旦触发,就失效了,包括递归的监听
应用场景
- 分布式配置中心
2. 分布式注册中心
3. 分布式锁
4. 分布式队列
5. 集群选举
6. 分布式屏障
7. 发布/订阅Zookeeper安装
下载解压wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz cd apache-zookeeper-3.5.8-bin
重命名配置文件 zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
启动 :::tips
可以通过 bin/zkServer.sh 来查看都支持哪些参数
bin/zkServer.sh start conf/zoo.cfg
::: 客户端连接 :::tips bin/zkCli.sh -server ip:port :::
[zk: localhost:2181(CONNECTED) 80] 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
使用
1创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl] 默认持久化节点
-s: 顺序节点
-e: 临时节点
-c: 容器节点
-t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用
-Dzookeeper.extendedTypesEnabled=true 开启,默认是时间60000毫秒
create /test-node some-data #创建节点 get /test-node #查看节点内容 set /test-node some-data-changed #修改节点 stat /test-node #查看节点状态信息 get -s /test-node # get + stat 组合 set -v 1 /test-node value # 乐观锁,对dataversion=1的数据进行更新
stat /test-node
- cZxid:创建znode的事务ID(Zxid的值)。
- mZxid:最后修改znode的事务ID。
- pZxid:最后添加或删除子节点的事务ID(子节点列表发生变化才会发生改变)。
- ctime:znode创建时间。
- mtime:znode最近修改时间。
- dataVersion:znode的当前数据版本。实现乐观锁功能
- cversion:znode的子节点结果集版本(一个节点的子节点增加、删除都会影响这个版本)。
- aclVersion:表示对此znode的acl版本。
- ephemeralOwner:znode是临时znode时,表示znode所有者的 session ID。 如果znode不是临时znode,则该字段设置为零。
- dataLength:znode数据字段的长度。
- numChildren:znode的子znode的数量。
ls / #查看根节点下所有子节点 -R 递归查看子节点列表 create -e /ephemeral data # 创建临时节点 create /seq-parent data // 创建父目录,单纯为了分类,非必须 create -s /seq-parent/ data // 创建顺序节点。顺序节点将再seq-parent 目录下面,顺序递增 create -s /seq-parent/no- //创建以no-开头的顺序节点
create -s -e /ephemeral-node/前缀- # 临时顺序节点 create -c /container 创建容器
事件监听机制 监听是一次性的
get -w /path // 注册监听的同时获取数据 stat -w /path // 对节点进行监听,且获取元数据信息
ls -w /path //监听整个目录 ls -R -w /path //-R 区分大小写,一定用大写
Zookeeper事件类型:
None: 连接建立事件
NodeCreated: 节点创建
NodeDeleted: 节点删除
NodeDataChanged:节点数据变化
NodeChildrenChanged:子节点列表变化
DataWatchRemoved:节点监听被移除
ChildWatchRemoved:子节点监听被移除
权限控制ACL
Zookeeper ACL 权限设置分为 3 部分组成
- 权限模式 scheme
- 授权对象 ID
ip地址,对用户名 - 权限信息 permission
- c: create 创建子节点
- w: wirte 读取
- r :read 删除
- d:delete 删除
- a : admin 可以设置acl权限
权限模式
- IP方式
- 口令方式
Digest 方式
super模式, - super模式
命令:
getAcl :
setAcl
addAuth : 注册使用明文,存的是密文
zookeeper.skipACL=yes 启动参数,则ACL都不再检测
生成授权ID
echo -n
: | openssl dgst -binary -sha1 | openssl base64 shell方式
设置ACL方式
- 创建时设置
create [-s] [-e] [-c] path [data] [acl] create /zk-node datatest digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa setAcl /zk-node digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa
访问是需要加授权信息才能访问 addauth digest gj:test get /zk-node
2:auth明文授权
addauth digest u100:p100 create /node-1 node1data auth:u100:p100:cdwra 这是u100用户授权信息会被zk保存,可以认为当前的授权用户为u100 get /node-1 node1
3:IP授权模式:
setAcl /node-ip ip:192.168.109.128:cdwra create /node-ip data ip:192.168.109.128:cdwra 多个ip 逗号分隔
4:Super 超级管理员模式
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(password)) 需求修改启动文件,修改启动参数 该模式下超级用户可以超级权限
内存数据,持久化
数据组织是类文件的数据机构
内存数据机构源码:
public class DataTree {
private final ConcurrentHashMap<String, DataNode> nodes =
new ConcurrentHashMap<String, DataNode>();
private final WatchManager dataWatches = new WatchManager();
private final WatchManager childWatches = new WatchManager();
public class DataNode implements Record {
byte data[];
Long acl;
public StatPersisted stat;
private Set<String> children = null;
事务
每一次事务操作都会记录
dataLogDir配置日志目录 zoo.cfg文件
java -classpath .:slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.5.8-bin/data/version-2/log.1 查看日志
数据快照
方便快速恢复数据
java -classpath .:slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.SnapshotFormatter /usr/local/zookeeper/apache-zookeeper-3.5.8-bin/data-dir/version-2/snapshot.0 查看快照内容