Zookeeper核心概念

分布式应用的的数据管理问题

  1. 统一命名服务
  2. 状态同步服务
  3. 集群管理
  4. 分布式应用配置管理

核心概念
类似存储少量数据,基于内存的数据库

一:文件系统数据结构

类似文件系统的数据结构
:只有绝对路径,没有相对路径

image.png

每个子目录被称为:znode(目录节点),可以增删znode

六种类型znode

  1. PERSISTENT-持久化目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在
  2. PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  3. EPHEMERAL-临时目录节点
    客户端与zookeeper断开连接后,该节点被删除
  4. EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
  5. Container 节点
    (3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s 检查一次)
  6. TTL 节点(
    默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定)
    启动文件中

image.png

二:监听通知机制

可以监听任意节点,或目录节点,或递归目录节点

  1. 如果注册的是对某个节点的监听,则当这个节点被删除,或者被修改时,对应的客户端将被通知
  2. 如果注册的是对某个目录的监听,则当这个目录有子节点被创建,或者有子节点被删除,对应的客户端将被通知
  3. 如果注册的是对某个目录的递归子节点进行监听,则当这个目录下面的任意子节点有目录结构的变化(有子节点被创建,或被删除)或者根节点有数据变化时,对应的客户端将被通知

监听只是一次性的,一旦触发,就失效了,包括递归的监听

应用场景

  1. 分布式配置中心
    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 :::

  1. [zk: localhost:2181(CONNECTED) 80] help
  2. ZooKeeper -server host:port cmd args
  3. addauth scheme auth
  4. close
  5. config [-c] [-w] [-s]
  6. connect host:port
  7. create [-s] [-e] [-c] [-t ttl] path [data] [acl]
  8. delete [-v version] path
  9. deleteall path
  10. delquota [-n|-b] path
  11. get [-s] [-w] path
  12. getAcl [-s] path
  13. history
  14. listquota path
  15. ls [-s] [-w] [-R] path
  16. ls2 path [watch]
  17. printwatches on|off
  18. quit
  19. reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
  20. redo cmdno
  21. removewatches path [-c|-d|-a] [-l]
  22. rmr path
  23. set [-s] [-v version] path data
  24. setAcl [-s] [-v version] [-R] path acl
  25. setquota -n|-b val path
  26. stat [-w] path
  27. 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 部分组成

  1. 权限模式 scheme
  2. 授权对象 ID
    ip地址,对用户名
  3. 权限信息 permission
    1. c: create 创建子节点
    2. w: wirte 读取
    3. r :read 删除
    4. d:delete 删除
    5. a : admin 可以设置acl权限

权限模式

  1. IP方式
  2. 口令方式
    Digest 方式
    super模式,
  3. super模式

命令:
getAcl :
setAcl
addAuth : 注册使用明文,存的是密文

zookeeper.skipACL=yes 启动参数,则ACL都不再检测

生成授权ID

echo -n : | openssl dgst -binary -sha1 | openssl base64 shell方式

设置ACL方式

  1. 创建时设置

    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)) 需求修改启动文件,修改启动参数 该模式下超级用户可以超级权限

内存数据,持久化

数据组织是类文件的数据机构

内存数据机构源码:

  1. public class DataTree {
  2. private final ConcurrentHashMap<String, DataNode> nodes =
  3. new ConcurrentHashMap<String, DataNode>();
  4. private final WatchManager dataWatches = new WatchManager();
  5. private final WatchManager childWatches = new WatchManager();
  1. public class DataNode implements Record {
  2. byte data[];
  3. Long acl;
  4. public StatPersisted stat;
  5. 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 查看日志

image.png

原数据信息:

数据快照

方便快速恢复数据

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 查看快照内容 image.png