• ZooKeeper系统模型


    1、ZooKeeper数据模型Znode

            在ZooKeeper中,数据信息被保存在⼀个个数据节点上,这些节点被称为znode。ZNode 是Zookeeper 中最小数据单位,在 ZNode 下面又可以再挂  ZNode,这样层层下去就形成了个层次化命名空间 ZNode 树,我们称为 ZNode Tree,它采用了类似文件系统的层级树状结构进管理。见下图示例:

            在 Zookeeper 中,每⼀个数据节点都是⼀ ZNode,上图根目录下有两个节点,分别是:app1 和app2,其中 app1 下面又有三个子节点,所有ZNode按层次化进行组织,形成这么颗树,ZNode的节点路径标识方式和Unix文件系统路径非常相似,都是由系列使用斜杠(/)进行分割的路径表示,开发人员可以向这个节点写入数据,也可以在这个节点下面创建子节点。 

    2、ZNode 的类型

             刚刚已经了解到,Zookeeper的znode tree是由⼀系列数据节点组成的,那接下来,我们就对数据节点做详细讲解 

    Zookeeper 节点类型可以分为三大类:

    • 持久性节点(Persistent)
    • 临时性节点(Ephemeral)
    • 顺序性节点(Sequential)

            在开发中在创建节点的时候通过组合可以⽣成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的生命周期

    持久节点:是Zookeeper中最常见种节点类型,所谓持久节点,就是指节点被创建后会直存在服务器,直到删除操作主动清除

    持久顺序节点:就是有顺序的持久节点,节点特性和持久节点是样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后面加上个数字后缀,来表示其顺序。

    临时节点:就是会被自动清理掉的节点,它的命周期和客户端会话绑在起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建子节点。

    临时顺序节点:就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后面加上数字后缀。

    3、事务ID

            首先,先了解,事务是对物理和抽象的应用状态上的操作集合。往往在现在的概念中,狭义上的事务通常指的是数据库事务,般包含了系列对数据库有序的读写操作,这些数据库事务具有所谓的ACID特性,即原子性(Atomic)、致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

            而在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,般包括数据节点创建与删除、数据节点内容更新等操作。对于每个事务请求,ZooKeeper都会为其分配个全局唯的事务ID,用 ZXID 来表示,通常是 64 位的数字。每 ZXID 对应次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序。

    4、ZNode 的状态信息

            整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。图中quota 是数据内容,其他的属于状态信息。那么这些状态信息都有什么含义呢? 

    cZxid 就是 Create ZXID,表示节点被创建时的事务ID

    ctime 就是 Create Time,表示节点创建时间。

    mZxid 就是 Modified ZXID,表示节点最后⼀次被修改时的事务ID

    mtime 就是 Modified Time,表示节点最后⼀次被修改的时间。

    pZxid 表示该节点的子节点列表最后⼀次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新。

    cversion 表示子节点的版本号。

    dataVersion 表示内容版本号。

    aclVersion 标识acl版本

    ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0

    dataLength 表示数据长度。

    numChildren 表示直系子节点数。

    5、Watcher--数据变更通知

    Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能

            ⼀个典型的发布/订阅模型系统定义了对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。

            在 ZooKeeper 中,引入了 Watcher  机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册 Watcher 监听,当服务端的些指定事件触发了这个 Watcher,那么就会向指定客户端发送个事件通知来实现分布式的通知功能。

    整个Watcher注册与通知过程如图所示。

    Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。 

            具体⼯作流程为:客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中。当Zookeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。

    6、ACL--保障数据的安全

            Zookeeper作为⼀个分布式协调框架,其内部存储了分布式系统运行时状态的元数据,这些元数据会直接影响基于Zookeeper进行构造的分布式系统的运行状态,因此,如何保障系统中数据的安全,从而避免因误操作所带来的数据随意变更而导致的数据库异常十分重要,在Zookeeper中,提供了一套完善的ACL(Access Control List)权限控制机制来保障数据的安全。

            我们可以从三个方面来理解ACL机制:权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用"scheme: id : permission"来标识个有效的ACL信息。

    权限模式:Scheme

      权限模式用来确定权限验证过程中使的检验策略,有如下四种模式:

      ip

            IP模式就是通过IP地址粒度来进行权限控制,如"ip:192.168.0.110"表示权限控制针对该IP地址,同时IP模式可以支持按照网段方式进行配置,如"ip:192.168.0.1/24"表示针对192.168.0.*这个网 进行权限控制。​​​​

      Digest

            Digest是最常⽤的权限控制模式,要更符合我们对权限控制的认识,其使用"username:password"形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。当我们通过“username:password”形式配置了权限标识后,Zookeeper会先后对其进行SHA-1加密和BASE64编码。

      World

            World是一种最开放的权限控制模式,这种权限控制方式几乎没有任何作用,数据节点的访问权限对所有用户开放,即所有用户都可以在不进行任何权限校验的情况下操作ZooKeeper上的数据。 另外,World模式也可以看作是种特殊的Digest模式,它只有个权限标识,即“world:anyone”。

      Super

            Super模式,顾名思义就是超级用户的意思,也是种特殊的Digest模式。在Super模式下,超级用户可以对任意ZooKeeper上的数据节点进行任何操作。

    授权对象:ID

            授权对象指的是权限赋予的用户或个指定实体,例如 IP 地址或是机器等。在不同的权限模式下,授权对象是不同的,表中列出了各个权限模式和授权对象之间的对应关系。

    权限模式授权对象
    IP通常是IP地址或IP段:例如:192.168.10.110 或192.168.10.1/24
    Digest

    定义,通常是username:BASE64(SHA-1(username:password))

    例如:zm:sdfndsllndlksfn7c=

    Digest只有ID :anyone
    Super超级用

    权限

            权限就是指那些通过权限检查后可以被允许执行的操作。在ZooKeeper中,所有对数据的操作权限分为以下五大类:

    CREATE(C):数据节点的创建权限,允许授权对象在该数据节点下创建子节点。

    DELETE(D):子节点的删除权限,允许授权对象删除该数据节点的子节点。

    READ(R):数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等。

    WRITE(W):数据节点的更新权限,允许授权对象对该数据节点进行更新操作。

    ADMIN(A):数据节点的管理权限,允许授权对象对该数据节点进行 ACL 相关的设置操作。

  • 相关阅读:
    微软Edge浏览器全解析
    Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器
    前端技术使网页生成PDF预览并下载
    【实验记录】地磁论文
    Go+VsCode配置环境
    编译正常运行,打jar包运行报错(找不到文件路径)
    js文件模块化引用问题(JavaScript modules)
    VNC viewer在windows与linux之间文本和文件拷贝
    【Python从入门到进阶】37、selenium关于phantomjs的基本使用
    根目录/ 空间不够,扩容,导致web页面无法加载问题
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/126247139