美文网首页
Zookeeper进阶

Zookeeper进阶

作者: 我叫了了 | 来源:发表于2018-04-25 23:54 被阅读58次

    ZooKeeper是一个分布式的、开源的、分布式应用协调服务。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

    Zookeeper在分布式系统中的应用

    • master选举
    • 同一配置文件维护
    • 发布订阅
    • 分布式锁
    • 集群管理,保证数据强一致性

    zookeeper Session

    一般来说,我们使用zookeeper是集群形式,client和zookeeper集群建立一个会话session。在这个会话session当中,client其实是随机与其中一个zk节点建立的链接,并且互发心跳。zk集群负责管理这个session,并且在所有的节点上维护这个session的信息,包括这个session中定义的临时数据和监视点watcher。
    每个session都有一个过期时间
    zookeeper的Session一般分为4个状态,NO_CONNECTED, CONNECTING ,CONNECTED,CLOSE;

    当客户端没有建立连接的时候 即是 NO_CONNECTED , 当客户端正在建立连接的时候CONNECTING,已经连接上 CONNECTED, 连接关闭 CLOSE。
    参考 :https://blog.csdn.net/jeff_fangji/article/details/43916359

    ls  {path}   查看{path} 下的目录信息
    ls2 {path}   查看{path} 下的目录信息和状态信息 (ls+stat)
    stat {path} 查看{path} 目录的状态信息
    get {path} 查看{path} 下的data 以及状态信息
    ######
    cZxid = 0x0   节点id
    ctime = Thu Jan 01 08:00:00 CST 1970  创建时间
    mZxid = 0x0   修改后的id
    mtime = Thu Jan 01 08:00:00 CST 1970  修改时间
    pZxid = 0x0  子节点id
    cversion = -1   子节点的版本
    dataVersion = 0    当前节点数据版本号
    aclVersion = 0       权限版本,权限发生变化会改变 
    ephemeralOwner = 0x0    持久节点是0x0 ,临时节点不是
    dataLength = 0   数据长度
    numChildren = 1  子节点个数
    
    • 超时之后并不会马上删除临时节点,要等到心跳发现断开后,才会删除临时节点
    stat path [watch]
    set path data [version]   设置某一个目录的值,version做乐观锁,version No is not valid : /zhongc
    
    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     -e 临时节点,-s 顺序节点
    addauth scheme auth
    quit
    getAcl path
    close
    connect host:port
    

    zookeeper 的 watcher 特性

    • 针对每一个节点,zk都会对他有一个监督者(触发器)。watcher是一个事件,当监控某一个节点发生了变化,就会触发一个watcher事件
    • 在zk中watcher是一次性的,触发一次立即销毁
    • 父节点,子节点 增删改都会触发watcher,针对不同的操作,触发的watcher事件也不相同
    • watcher事件的类型
    1. 创建父节点 触发 NodeCreated
    stat /zwatch watch 
    
    [zk: localhost:2181(CONNECTED) 19] create /zwatch 123
    
    WATCHER::
    WatchedEvent state:SyncConnected type:NodeCreated path:/zwatch
    Created /zwatch
    

    2.修改父节点数据触发 NodeDataChanged

    get /zwatch watch
    
    [zk: localhost:2181(CONNECTED) 22] set /zwatch 999
    
    WATCHER::
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/zwatch
    cZxid = 0x1b
    ctime = Tue Apr 24 23:16:39 CST 2018
    

    3.删除节点会触发 NodeDeleted

    get /zwatch swtch
    
    [zk: localhost:2181(CONNECTED) 24] delete /zwatch
    
    WATCHER::
    WatchedEvent state:SyncConnected type:NodeDeleted path:/zwatch
    

    4.创建和删除子节点 触发 NodeChildrenChanged ,修改子节点数据不会触发父节点watcher

    ls /zhongc watchet
    
    [zk: localhost:2181(CONNECTED) 2] create -s /zhongc/sec 66
    
    WATCHER::
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zhongc
    Created /zhongc/sec0000000006
    

    zookeeper 的 ACL 权限控制

    • ACL命令行
    getAcl
    setAcl
    addauth scheme auth  授权认证
    
    [zk: localhost:2181(CONNECTED) 13] create /xyz data
    [zk: localhost:2181(CONNECTED) 15] getAcl /xyz
    'world,'anyone
    : cdrwa
    
    • ACL是由 [scheme:id:permissions ] 来构成权限列表的,scheme是代表采用的某种权限机制,id代表允许访问的用户,permissions代表权限组合字符串

    • scheme
      1.world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是 world:anyone:[permissions]
      2.auth: auth 代表认证登录,需要注册用户有权限才可以。写法是:auth:user:passworld:[permissions]
      3.digest: 和auth类似,只不过是密码要加密。写法是 digest:username:BASE64(SHA1(passworld)):[permissions]
      4.ip: 真对IP进行限制,指定IP可以访问。写法是 ip:192.169.1.11:[permissions]
      5.super:超级管理员,拥有所有权限。修改配置

    权限的构成 permissions

    权限字符串缩写 crdwa

    • c:CREATE 创建当前节点的子节点
    • r:READ 获取当前节点下的目录,数据
    • w: WRITE 设置节点数据
    • d:DELETE 删除子节点
    • a:ADMIN 修改权限

    zk中的权限是每一个节点相互独立的,不存在父子节点间的继承权限的关系

    • acl之word权限操作
    getAcl 获取权限信息,使用create 创建节点,会被赋予默认权限
    setAcl /xyz/a world:anyone:crwa   设置节点权限,
    
    • acl之auth与digest权限操作

    在使用auth之前,必须先使用addauth添加一个用户,然后才可以setAcl,在setAcl的时候无论指定什么username和password都不会生效。都会保持和addauth一样的用户名和密码。然后断开连接,在重新连接,再次访问刚才设置权限的节点,会发现没有权限,这个时候再使用addauth进行登录,才可以访问刚才设置权限的节点。digest和auth同理,只不过密码是密文,而且使用digest不需要先登录,就可以设置权限。

    addauth digest zhongc:123456  添加用户
    setAcl /names/zhongc auth:zhongc:1234567:crw
    setAcl /names/zhongc auth:crw
    
    • acl之ip权限操作
    setAcl /ip ip:192.168.0.102:crwad
    
    • acl之super权限操作
    修改 zkServer.sh ,修改启动脚本
    然后addauth degist super:123456 登录设置的超级管理员账号
    
    • ACL的使用场景
      开发测试环境隔离
      生产环境指定ip访问

    zookeeper 的 四字命令

    zookeeper可以根据自身提供的简写命令来和服务器交互,需要用到nc命令,所以需要先安装 nc 。

    yun install nc
    

    相关文章

      网友评论

          本文标题:Zookeeper进阶

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