zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/yufeng218/p/13216215.html
Copyright © 2011-2022 走看看