• Zookeeper介绍


    1、概要

      ZooKeeper是用于分布式应用程序的协调服务。它公开了一组简单的API,分布式应用程序可以基于这些API用于同步,节点状态、配置等信息、服务注册等信息。其由JAVA编写,支持JAVA 和C两种语言的客户端。

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

      Zookeeper官网地址:https://zookeeper.apache.org/releases.html#download

    2、下载安装及配置

    由于 Zookeeper 是Java编写的,在安装 Zookeeper 之前先要安装 JDK。

    2.1 下载

    JDK8下载地址https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

    Zookeeper下载地址https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

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

    2.2 安装

     安装一个稳定版本: 3.5.8:

    #下载
    wget https://mirrors.bfsu.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
    
    #建立软链接:
    ln -s apache-zookeeper-3.5.8-bin zk
    
    #拷贝默认配置
    cp  zk/conf/zoo_sample.cfg  zk/conf/zoo.cfg
    
    #启动Zookeeper
    ./zk/bin/zkServer.sh start 
    

      

    说明:

    (1)Linux 系统启动Zookeeper运行 zkServer.sh 脚本; Windows启动Zookeeper运行 zkServer.cmd 脚本。

    (2)在Linux下可以指定启动指定的配置文件去启动:

    ./zk/bin/zkServer.sh start zoo_my.cfg
    

    (3)运行 ./zk/bin/zkCli.sh -server 127.0.0.1:2181 可以进入到 Zookeeper 的客户端: 

    2.3 配置文件

    # 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

    2.4 客户端命令

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

    node数据的增删改查

    # 列出子节点 
    ls /
    
    #创建节点
    create /test "test is good man"
    
    # 查看节点
    get /test
    
    # 创建子节点 
    create /test/sex "man"
    
    # 删除节点
    delete /test/sex
    
    # 删除所有节点 包括子节点
    deleteall /test
    

    3. Zookeeper节点介绍 

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

    znode结构包含如下:

    • path:唯一路径 
    • childNode:子节点
    • stat:状态属性
    • type:节点类型 

    知识点:

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

    3.1 节点类型

    类型

    描述

    PERSISTENT

    持久节点

    PERSISTENT_SEQUENTIAL

    持久序号节点

    EPHEMERAL

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

    EPHEMERAL_SEQUENTIAL

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

     3.1.1 PERSISTENT(持久节点)

    持久化保存的节点,也是默认创建的

    #默认创建的就是持久节点
    create /test

    3.1.2 PERSISTENT_SEQUENTIAL(持久序号节点)

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

    #创建序号节点
    create -s /test
    #返回创建的实际路径
    Created /test0000000001
    
    create -s /test
    #返回创建的实际路径2
    Created /test0000000002

    3.1.3 EPHEMERAL(临时节点)

    临时节点会在客户端会话断开后自动删除。适用于心跳,服务发现等场景。创建时添加参数-e 即可

    #创建临时节点, 断开会话 在连接将会自动删除
    create -e /temp

    3.1.4 EPHEMERAL_SEQUENTIAL(临时序号节点)

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

    create -e -s /temp/seq
    

    注意:持久节点的子节点可以是临时节点;临时节点的自节点不可以是持久节点;

    3.2 节点属性  

    # 查看节点属性
    stat /china/beijing
    

      

    属性说明:

    #创建节点的事务ID
    cZxid = 0x385
    
    #创建时间
    ctime = Tue Sep 24 17:26:28 CST 2019
    
    #修改节点的事务ID
    mZxid = 0x385
    
    #最后修改时间
    mtime = Tue Sep 24 17:26:28 CST 2019
    
    # 子节点的增加或删除的事物ID
    pZxid = 0x385
    
    #这表示对此znode的子节点进行的增加或删除的次数,变更一次加1
    cversion = 0
    
    # 数据版本,变更次数
    dataVersion = 0
    
    #权限版本,变更次数
    aclVersion = 0
    
    #临时节点所属会话ID;若为 0x0,则不是临时节点;
    ephemeralOwner = 0x0
    
    #数据长度
    dataLength = 17
    
    #子节点数(不包括子子节点)
    numChildren = 0
    

    3.3 节点的监听

    客户添加 -w 参数可实时监听节点与子节点的变化,并且实时收到通知。非常适用保障分布式情况下的数据一至性。其使用方式如下:

    命令

    描述

    ls -w path 

    监听子节点的变化(增,删)

    get -w path

    监听节点数据的变化

    stat -w path

    监听节点属性的变化

    printwatches on|off

    触发监听后,是否打印监听事件(默认on)

    监听是一次性的,一旦触发过一次之后就过期了,需要再重新添加监听;

    3.4 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 <path>

    读取ACL权限

    setAcl

    setAcl <path> <acl>

    设置ACL权限

    addauth

    addauth <scheme> <auth>

    添加认证用户

    3.4.1 world 权限示例

     语法: setAcl <path> world:anyone:<权限位>

          

        /china 节点的权限修改为 rwa,创建和删除其子节点的时候报错:Authentication is not valid;如下所示:

      

    3.4.2 IP 权限示例

    语法: setAcl <path> ip:<ip地址|地址段>:<权限位>

     使用 ./zkCli.sh -server 192.168.172.20:2181 登录到客户端,然后去创建 /china 的子节点报错:

    3.4.3 auth 权限示例

     语法:

     (1)setAcl <path> auth:<用户名>:<密码>:<权限位>

     (2)addauth digest <用户名>:<密码>

    3.4.4 digest 权限示例

    语法:

    (1)setAcl <path> digest :<用户名>:<密钥>:<权限位>

    (2)addauth digest <用户名>:<密码>

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

    echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64

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

    设置 digest 权限(密码使用密文)

    setAcl /china digest:zkuser:mmULIPSlO8/z2/9dx3Mjn6N5Tf8=:cdrw

    设置完成之后再去查看节点,报错没有权限查看,如下:

     给当前会话添加认证后再去查看(密码使用明文)

    addauth digest zkuser:zkpass

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

     

  • 相关阅读:
    009-Python-面向对象
    008-Python-模块
    007-Python函数-装饰器
    006-Python函数
    005-Python字典
    003-python列表
    PyCharm之python书写规范--消去提示波浪线
    001-python基础
    Java基础总结(一)
    High ASCII字符从bat文件到dos控制台的转化问题
  • 原文地址:https://www.cnblogs.com/yufeng218/p/13216215.html
Copyright © 2020-2023  润新知