美文网首页架构师之路
ZooKeeper详解2.基础知识

ZooKeeper详解2.基础知识

作者: 卢卡斯哔哔哔 | 来源:发表于2019-03-07 10:12 被阅读15次

    1 ZooKeeper的结构

    1.1 数据模型

    image.png
    • 可以把Zookeeper理解为一个高可用的文件系统,但是它没有文件和文件夹的概念,只有一个叫做znode的节点。znode即是数据的容器,也是其他节点的容器(即是一个可以存储数据的文件夹)。我们用父节点和子节点的关系来表示组和成员的关系,那么一个节点代表一个组,组节点下的子节点代表组内的成员。如上图所示。
    • ZooKeeper包含一个树形的数据模型,每一个节点称为znode。一个znode中包含了存储的数据和ACL(Access Control List)。
    • ZooKeeper的设计适合存储少量的数据,并不适合存储大量数据,所以znode的存储限制最大不超过1M。
    • znode的访问操纵是原子性的:客户端访问一个znode时,要么获得全部数据,要么什么也得不到;写操作时,要么写入全部数据,要么什么也写不进去。,ZooKeeper能够保证写操作只会成功和失败,绝对不会出现只写入了一部分数据的情况。
    • 我们可以通过path来定位znode,就像Unix系统定位文件一样,使用斜杠来表示路径。但是znode的路径只能使用绝对路径,而不能识别.././这样的路径。
    • 节点的名称是由Unicode字符组成的,除了zookeeper这个字符串,我们可以任意命名节点。

    1.2 znode的类型

    znode一共有4种类型:持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ehpemeral_sequential)

    持久节点
    • 持久节点可以用来保存数据,即使该节点的创建者消失,持久节点中的信息也不会丢失;
    • 持久节点只能通过delete来删除。
    临时节点
    • 当创建该znode的客户端因为超时或主动关闭时临时节点消失
    • 也可以通过delete删除节点
    有序节点

    一个有序节点被分配为一个单调递增的整数,比如通过create -s /user 0会创建一个user0000000002的有序节点,继续创建则会创建出user0000000003user0000000004等节点。

    1.3 znode的属性

    一个znode不仅可以保存值,还有很多属性来表示其性质,如下所示:

    # 该path的对应的值
    123
    # 创建节点时的事务id
    cZxid = 0x5f
    # 创建节点时的时间戳
    ctime = Wed Mar 06 16:54:38 CST 2019
    # 最近一次修改的事务id
    mZxid = 0x61
    # 最近一次修改的时间戳
    mtime = Wed Mar 06 16:54:52 CST 2019
    # 子节点列表最后一次被修改的事务id
    pZxid = 0x5f
    # 子节点的版本号,子节点发生变化子节点版本递增
    cversion = 0
    # 当前节点数据的版本号,如果数据修改版本号会递增
    dataVersion = 1
    # 权限版本号,权限发生变化时权限版本号递增
    aclVersion = 0
    # 临时节点的拥有着,拥有者断开时自动消失
    ephemeralOwner = 0x100073f79100005
    # 数据长度
    dataLength = 3
    # 子节点个数
    numChildren = 0
    

    2 增删改查

    增:create [-s] [-e] path data acl
    • [-s]是可选参数,表示是否是有序节点
    • [-e]是可选参数,表示是否是临时节点
    • acl是权限控制参数,下面会详细讲解
    • path和data相当于是key的value
    删:delete path [version]
    • delete path会删除某个节点
    • delete只能用于删除不包含子节点的节点
    • 如果带上[version]参数,则要求[version]必须和当前的dataVersion一致,否则会删除失败。
    删:rmr path
    • rmr可以删除含有子节点的节点
    改:set path data [version]
    • 设定某一个path为某一个值data
    • 每次修改path其dataVersion(数据版本)都会自增
    • 如果带上[version]参数,则该参数必须和修改之前的dataVersion一致,否则会修改失败version No is not valid : /user
    查:get path [watch]
    • 用于查看一个path的值
    • [watch]后面会详细解释
    查:ls path [watch]
    • 用于查看该path下的所有子节点,跟linux的ls相似
    • [watch]后面会详细解释
    查:ls2 path [watch]
    • 用于查看该path下的所有子节点及其状态,相当于是ls和stat的结合
    查:stat path
    • 查看节点状态

    3 quota命令

    quota的意思是限额,可以限制一个path上子节点的个数或者path上的数据长度。

    增:setquota -n|-b val path

    -n val:设置子节点个数最大为值为val
    -b val:设置节点数据长度的最大值val

    删:delquota [-n|-b] path

    跟setquota中的含义一致,删除path上的quota

    查:listquota path

    列出改path上的quota信息。

    [zk: localhost:2181(CONNECTED) 19] listquota /users
    # quota对应的znode的位置
    absolute path is /zookeeper/quota/users/zookeeper_limits
    # quota设置的值:count表示子节点最大数,bytes表示数据长度最大值
    # 为-1表示没有限制
    Output quota for /users count=5,bytes=-1
    # 当前节点的状态:count的值包括本节点
    Output stat for /users count=4,bytes=16
    
    quota细节
    1. 父节点有quota设置时子节点不允许设置
    2. 当前节点已经有quota时不允许重复设置
    3. quota的设置的其实是在/zookeeper/quota/${path}/zookeeper_limits中设置的一个znode
    4. quota中count的值包括当前节点,即如果/users有三个子节点,那么count=4
    5. quota中count的值是递归的,即如果/users/lucas还有子节点,那么该子节点也计算在/users的count中
    6. 超出quota不会报错,会打印一行WARN日志

    4 权限控制

    参考ZooKeeper ACL权限控制

    4.1 ACL(Access Control List)简介

    ACL是ZooKeeper的权限控制系统。生产环境中,一个ZooKeeper集群可能有多个客户端在连接,需要为不同的客户端分配不同znode的权限,防止误操作。ACL使用schema:id:permission来描述权限控制,其特性如下:

    1. ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
    2. 每个znode支持设置多种权限控制方案和多个权限
    3. 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
    Schema与id
    权限模式 id 描述
    world 只有一个id:anyone 默认方式,所有人都可以访问
    ip 一个IP地址 通常是一个IP地址或是IP段,例如“192.168.122.112”
    auth 不需要id 只要是通过authentication的user都有权限
    digest username:BASE64(SHA1(password)) 使用“用户名:密码”方式认证
    super 在这种scheme情况下,对应的id可以做任何事情
    权限
    权限 ACL简写 描述
    CREATE c 可以创建子节点
    DELETE d 可以删除子节点(仅下一级节点)
    READ r 可以读取节点数据及显示子节点列表
    WRITE w 可以设置节点数据
    ADMIN a 可以设置节点访问控制列表权限

    4.2 命令

    setAcl path acl

    设置znode的权限

    # world模式
    setAcl path world:anyone:<acl>
    # ip模式
    setAcl path ip:<ip>:<acl>
    # auth模式
    addauth digest <user>:<password> #添加认证用户
    setAcl path auth:<user>:<acl>
    # digest模式
    setAcl path digest:<user>:<password>:<acl>
    
    getAcl path

    查看path的权限

    [zk: localhost:2181(CONNECTED) 0] getAcl /
    'world,'anyone
    : cdrwa
    
    addauth scheme auth

    添加用户权限

    5 其他命令

    • history:显示历史命令列表
    • redo cmdno:重新执行history中的指令
    • close:关闭连接
    • connect host:port:连接服务器
    • quit:退出客户端
    • printwatches on|off:设置和显示监视状态
    • sync path:强制同步
    ZooKeeper -server host:port cmd args
        stat path [watch]
        set path data [version]
        ls path [watch]
        delquota [-n|-b] path
        ls2 path [watch]
        setAcl path acl
        setquota -n|-b val path
        history
        redo cmdno
        printwatches on|off
        delete path [version]
        sync path
        listquota path
        rmr path
        get path [watch]
        create [-s] [-e] path data acl
        addauth scheme auth
        quit
        getAcl path
        close
        connect host:port
    

    相关文章

      网友评论

        本文标题:ZooKeeper详解2.基础知识

        本文链接:https://www.haomeiwen.com/subject/fnftpqtx.html