zoukankan      html  css  js  c++  java
  • 大数据zk学习

    zk的ACL策略

    ZooKeeper的权限控制系统类似于UNIX文件系统,它采用的是ACL(AccessControl Lists)策略。

    ZooKeeper定义了如下5种权限。

    ·CREATE:创建子节点的权限。

    ·READ:获取节点数据和子节点的权限。

    ·WRITE:更新节点数据的权限。

    ·DELETE:删除子节点的权限。

    ·ADMIN:设置节点ACL的权限。

    zk启动命令: ./zkServer.sh start

    zk查看当前状态: ./zkServer.sh status 

     zk关闭命令:  ./zkServer.sh stop

    zk重启命令: ./zkServer.sh restart

    客户端连接zk: zkCli.sh-server IP:port   例如: ./zkCli.sh -server 127.0.0.1:2181

    连接成功后可以看到如下结果:

     可以通过help查看zk有哪些命令:

     

     通过这些命令,我们就可以实现对ZooKeeper的操作了。这里的操作都是对ZooKeeper的节点进行操作,比如列出节点、创建节点和删除节点,可以把ZooKeeper理解为以下结构,如图

     

     connect命令用于连接ZooKeeper服务器端,比如通过connect127.0.0.1:2181,可以连接到本机的2181端口。

    ls命令格式:ls path,表示列出path下的文件。

    create命令格式如下:

    create [-s] [-e] path data acl 

    其中,-s和-e参数分别指定节点为持久节点或临时节点,在不指定的情况下,则表示是持久节点;acl用来进行权限控制。如果是临时节点,会话关闭后节点也就不存在了。

    比如create/mynode1 content1命令用于创建mynode1节点,并且给mynode1赋值为content1:

     get命令用于获取ZooKeeper节点的数据内容和相关信息,比如我们要取得mynode1的内容,执行get/mynode1命令后,运行结果是节点的数据内容content1和此节点的相关匹配信息。

     set path data [version]

     set命令用于修改节点内容,其中data参数是需要更新的新内容,在这里第1次把mynode1的内容修改为content2,第2次修改为content3。具体代码如下:

      通过运行结果会发现,在运行set/mynode1 content2后,dataVersion=1,运行完set/mynode1 content3后,dataVersion=2。

    修改完后,通过get命令查看结果,发现内容已经变成了Content 3,具体如下:

     delete命令格式如下: delete path [version]

     在这里需要注意的是,如果节点存在子节点,需要先将子节点删除。

    使用Java API访问ZooKeeper

    package it.basic.hadoop.zk;
    import org.apache.zookeeper.*;
    import org.apache.zookeeper.Watcher.Event;
    import scala.math.Ordering;
    
    import java.io.IOException;
    
    public class ZookeeperDemo1 implements Watcher {
        private static final int SESSION_TIMEOUT=30000;
        public static ZooKeeper zooKeeper;
    
        public static void main(String[] args) throws Exception {
            String path = "/zknode10";
            zooKeeper = new ZooKeeper("192.168.10.13:2181", SESSION_TIMEOUT, new ZookeeperDemo1());
            //注册
            zooKeeper.exists(path,true);
            //创建节点
            zooKeeper.create(path,"myconten1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
            Thread.sleep(300);
            //得到节点内容
            byte[] bytes1 = zooKeeper.getData(path, null, null);
            String result1 = new String(bytes1);
            System.out.println("result1 : "+ result1);
    
            //再次得到节点
            zooKeeper.setData(path,"testData0000".getBytes(),-1);
            byte[] bytes2 = zooKeeper.getData(path, null, null);
            String result2 = new String(bytes2);
            System.out.println("result2 : "+result2);
            Thread.sleep(300);
    
            //删除节点
            zooKeeper.delete(path,-1);
            zooKeeper.close();
    
        }
    
        @Override
        public void process(WatchedEvent watchedEvent) {
            if(Event.KeeperState.SyncConnected == watchedEvent.getState()){
                if(Event.EventType.NodeCreated ==watchedEvent.getType()){
                    //当节点创建成功时进行回调,此处进行提示打印
                    System.out.println("Node created suceess");
                    try {
                        zooKeeper.exists(watchedEvent.getPath(),true);
    
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                } else if(Event.EventType.NodeDeleted == watchedEvent.getType()){
                    try {
                        zooKeeper.exists(watchedEvent.getPath(),true);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    System.out.println("Node deleted success");
                }else if(Event.EventType.NodeDataChanged==watchedEvent.getType()){
                    try {
                        zooKeeper.exists(watchedEvent.getPath(),true);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    System.out.println("Node Changed success");
                }
            }
        }
    }

    运行结果如下:

     

    author@nohert
  • 相关阅读:
    mongodb 记录
    php保存文件
    调用AngularJS的API
    angular修改数据
    大小写转换
    使用Properties类动态加载配置文件里的内容
    org.apache.commons.cli.Options
    Google guava和Apache commons
    orc格式文件
    shell的awk命令使用
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13929151.html
Copyright © 2011-2022 走看看