Zookeeper内部实现分布式数据一致性(底层系统模型)(三)

不打扰是莪最后的温柔 提交于 2019-12-02 16:41:49

承接上一篇:继续接受最后一个特性:ACL-保障数据的安全;

    Zookeeper提供了一套完善的ACL(Access Control List)权限控制机制来保证数据的安全;

    标识一个有效的ACL的三个维度:权限模式(Scheme),授权对象(ID),权限(Permission),通常使用 scheme:id:premission来标识一个有效的ACL;

  <1> 权限模式:Scheme

    1)IP模式,类似 ip:192.168.0.110 形式

    2)Digest:类似于username:password 形式的;

    3)World:最开放的权限控制模式,从其名字中可以看出,数据节点的访问权限对所有用户抗法。也可以将其看做是一种特殊的Digest模式,他只有一个标识,“”world:anyone”;

    4)Super: 超级用户对任意zk节点进行任何操作;

  <2> 授权对象:ID

    授权对象是指权限赋予的用户或者一个指定实体,不同的权限模式下,授权对象是不同的。他们的对应关系:

      IP -----> IP段:“192.168.0.1”

      Digest -------> username:BASE64(SHA-1(username:password)),即Zookeeper会对username和password进行两次编码处理。

      World------->只有一个ID:anyone;

      Super-------> 与Digest模式一样;

  <3> 权限:Permission

    所有数据的操作权限分为五大类:

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

      DELETE(D):子节点的删除权限;

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

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

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

权限扩展:

  <1>实现自定义权限控制器:

    权限控制器接口:AuthenticationProvider,用户可以基于该接口自定义权限控制器实现;

    前面的几个模式,对应的就是Zookeeper自带的DigestAuthenticationProvider和IPAuthenticationProvider;

  <2> 注册自定义权限控制器:

    1)系统属性:在Zookeeper启动参数中配置:-Dzookeeper.authProvider.X =  类路径;

    2)配置文件方式:在zoo.cfg配置文件中配置类似如下的配置项

      对于权限控制器的注册,Zookeeper采用了延迟加载的策略,即只有在第一次处理包含权限控制的客户端请求的时候,才会进行权限控制器的初始化。

      所有的权限控制器会注册到ProviderRegistry中;

  <3> ACL管理:使用create 命令,或者setAcl命令;

  <4> Spuer模式的用法:

     问题:根据ACL权限控制的原理,一旦对一个数据节点设置了ACL权限控制,那么其他没有被授权的Zookeeper客户单将无法访问该数据节点,当一个持久节点具有ACL滞后,但其创建者已经退出或者已经不再使用,那么如何处理这些节点?

     这就需要在ACL的super模式下,使用超级管理员权限处理;要使用超级权限就是在ZK启动的时候,添加:

        -Dzookeeper.DigestAuthenticationProvider.superDigest=foo:kwn6anbsjskw………

     

到此:Zookeeper的系统模型就介绍完了,个人建议:搭一个Zookeeper环境,然后引入zk客户端依赖;对照源码学习;

后面继续介绍序列化与协议

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!