暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

初识zookeeper

Java Miraculous 2021-05-17
178
上一篇文章写完后,一位兄弟想了解下zk,今天一起来看看。
ZooKeeper是用于分布式应用程序的协调服务。它公开了一组简单的API,分布式应用程序可以基于这些API用于同步节点状态、配置、服务注册等信息。

  • 一、安装zookeeper(以下简称zk)

  • 1.1、下载zk

下载地址:https://archive.apache.org/dist/zookeeper/

注:本文以3.5.5版本为例
  • 1.2、上传并解压

执行:
rz -e
tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz

注:本文的安装目录为/usr/local
  • 1.3、配置文件

执行:
cd usr/local/apache-zookeeper-3.5.5-bin/conf/
cp zoo_sample.cfg zoo.cfg(因为zk启动的时候默认用的配置文件名字是zoo.cfg,而压缩包里的配置文件是zoo_sample.cfg,用zoo_sample.cfg也可以,不过在启动zk的时候需要指定配置文件名字)

执行:
vi zoo.cfg(根据需要修改即可,这里主要为了添加注释)
    #心跳时间,单位毫秒
    tickTime=2000
    #follower初始化连接到leader的最大时长,是tickTime的倍数
    initLimit=10
    #follower与leader数据同步的最大时长,也是tickTime的倍数
    syncLimit=5
    #zk的数据存储目录,一般不存放到tmp,实际根据需要修改
    dataDir=/tmp/zookeeper
    #客户端连接zk的时候使用的端口号
    clientPort=2181
    #单个客户端和zk的最大并发连接数
    maxClientCnxns=60
    #保存的数据快照数量,之外的将会被清楚
    autopurge.snapRetainCount=3
    #自动触发清除任务时间间隔,小时为单位,默认为0,表示不自动清除
    autopurge.purgeInterval=1
    • 1.4、启动zk

    执行:
    cd usr/local/apache-zookeeper-3.5.5-bin/bin
    ./zkServer.sh start

    注:zk默认用的就是zoo.cfg配置
    • 二、zk的基本操作

    • 2.1、打开zk客户端

    运行:
    cd usr/local/apache-zookeeper-3.5.5-bin/bin
    ./zkCli.sh

    注:连接远程zk客户端的命令是
    ./zkCli.sh -server ip:2181
    • 2.2、zk的增删改查等基本操作

    查看所有节点:
    ls

    新建节点:
    create ayo

    获取节点:
    get ayo

    修改节点数据:
    set ayo "nice"

    查看节点数据:
    get ayo

    创建子节点:
    create ayo/son

    修改子节点数据:
    set ayo/son "beautiful"

    获取子节点数据:
    get ayo/son

    查看节点下面的所有节点:
    ls -R ayo

    查看节点的状态:
    get -s ayo

    删除节点:
    delete ayo

    因为有子节点,删除不了,改用deleteall:
    deleteall ayo


    再查下:
    get ayo

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

    类型

    描述

    PERSISTENT

    持久节点

    PERSISTENT_SEQUENTIAL

    持久序号节点

    EPHEMERAL

    临时节点(不可在拥有子节点)

    EPHEMERAL_SEQUENTIAL

    临时序号节点(不可在拥有子节点)

    • 2.3.1、PERSISTENT(持久节点)

    持久化保存的节点,就是一旦创建就永远存在的节点,比如上面的增删改查演示的节点就是持久节点
    • 2.3.2、PERSISTENT_SEQUENTIAL(持久序号节点)

    创建时zookeeper 会在路径上加上序号作为后缀,。非常适合用于分布式锁、分布式选举等场景。创建时添加 -s 参数即可。
    执行多次:
    create -s bajie

    注:为什么序号是从6开始的?说明/下面存在了四个节点,加上/本身,一共是5个,所以从6开始的,下面临时序号节点同理。
    • 2.3.3、EPHEMERAL(临时节点)

    临时节点会在客户端会话断开后自动删除。适用于心跳,服务发现等场景。创建时添加参数-e 即可。
    执行:
    create -e temp
    查看下所有的节点,执行:
    ls

    可以看到temp节点,现在把客户端断开,再连接上
    执行:
    close(关闭客户端命令)

    ctrl+c退出。
    执行:
    cd usr/local/apache-zookeeper-3.5.5-bin/bin
    ./zkCli.sh
    ls

    可以看到已经没有temp节点了。
    • 2.3.4、EPHEMERAL_SEQUENTIAL(临时序号节点)

    与持久序号节点类似,不同之处在于EPHEMERAL_SEQUENTIAL是临时的会在会话断开后删除。创建时添加 -e -s
    执行多次:
    create -e -s tempp

    • 2.4、节点属性

    • 2.4.1、查看节点属性

    执行(随便一个节点):
    stat /tempp0000000011

    • 2.4.2、属性说明

    cZxid:创建节点的事务ID
    ctime:创建时间
    mZxid:修改节点的事ID(修改节点里的数据)
    mtime:最后修改时间
    pZxid:子节点变更的事ID(子节点的增删)
    cversion:这表示对此znode的子节点进行的更改次数(不包括子子节点)
    dataVersion:数据版本,变更次数
    aclVersion:权限版本,变更次数
    ephemeralOwner:临时节点所属会话ID(0x0表示空,说明该节点是持久节点,非0x0就表示该节点是临时节点)
    dataLength:数据长度
    numChildren:子节点数(不包括子子节点)
    • 2.5、zk的监听机制

    • 2.5.1、监听节点的数据变化

    执行:
    get /ayo

    执行:
    get -w /ayo(-w的意思就是给/ayo这个节点添加一个监听器,用来监听它的数据变化)

    复制一个窗口:
    执行:
    set /ayo "shuai"

    我现在再改
    执行:
    set /ayo "ku"

    这时候你会发现没有再出现节点数据变更的信息。
    结论:监听是一次性的,一旦触发过,监听就失效了,如果需要继续监听,就得重新添加。
    • 2.5.2、监听子节点数量的变化

    执行:
    ls -w /ayo

    在复制的窗口里执行:
    create -e /ayo/test

    同样的,临时节点的删除也会触发监听
    执行:
    ls -w /ayo

    关闭复制的那个窗口

    可以看到,触发了监听,因为会话关闭,临时节点自动删除了。

    • 2.6、zk的ACL

    ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。zk使用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 <path>

    读取ACL权限

    setAcl

    setAcl <path> <acl>

    设置ACL权限

    addauth

    addauth <scheme> <auth>

    添加认证用户

    • 2.6.1、查看节点权限

    执行:
    create /wukong(创建一个/wukong节点)
    getAcl /wukong

    • 2.6.2、修改节点权限

    执行(只有rwa权限):
    setAcl /wukong world:anyone:rwa
    getAcl /wukong

    现在没有创建子节点的权限了,试试看
    执行:
    create /wukong/tangseng

    将创建子节点的权限再加上
    执行:
    setAcl /wukong world:anyone:crwa
    getAcl /wukong

    再次创建子节点
    执行:
    create /wukong/tangseng

    其它的就不演示了,有兴趣可以自己执行下。
    注:linux中先sha1 加密,然后base64加密的shell命令:
    echo -n 用户名:密码 | openssl dgst -binary -sha1 | openssl base64
    下一篇预告:ZK集群搭建!
    文章转载自Java Miraculous,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论