大数据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");
            }
        }
    }
}

运行结果如下:

 

 

 

 

posted @ 2020-11-05 01:00  nohert  阅读(162)  评论(0编辑  收藏  举报