ZooKeeper基本概念和基本操作

一、Zookeeper的应用场景

1、维护配置信息

2、分布式锁服务

3、集群管理

4、生成分布式唯一ID

 

二、Zookeeper的数据结构:树状节点组成,如下图所示:

节点可以分为临时节点和持久化节点,

临时节点只存在创建的会话有效期内,并且当服务器停掉之后,临时节点也会消失

持久化节点:在创建之后,即便是会话结束,服务器停掉了,节点也不会消失,直到使用删除命令进行删除

 

三、操作节点

1、创建节点

持久化节点:create /Hadoop "test" 

持久化有序节点:create -s /Hadoop "test"

临时节点:create -e /Hadoop "test"

创建有序临时节点:create -s -e/Hadoop "test"

创建的有序节点会在生成的节点名称后面加上000001,例如Hadoop00001、Hadoop00002

 

2、修改节点

set /Hadoop "test" 

set /Hadoop "123456" 2

2位当前节点的版本

 

3、删除节点

delete /Hadoop "123456" 2

如果需要删除的节点下面有子节点,需要删除子节点之后才能删除当前节点

 

4、查看节点的状态

stat /hadoop :只输出节点的状态

get -s /hadoop :输出节点的值和节点的状态

获取节点数据

get /Hadoop 

cZxid:数据节点创建时的事务ID

ctime:数据节点创建时的时间

mZxid:数据节点最后一次更新时事务ID

mtime:数据节点最后一次更新时的时间

pZxid:数据节点的子节点最后一次被修改时的事务ID

cVersion:子节点更改的次数

dataVersion:节点数据的更改次数

aclVersion:节点的ACL的更改次数

ephemeralOwner:如果节点是临时节点,则表示创建该节点的会话的Session ID;

                                 如果节点是持久化的节点,该属性值为1

dataLength:数据内容的长度

numChildren:数据及诶单当前的字节点个数

 

5、监听节点数据变化

get -w /hadoop 

 

四、Zookeeper的acl权限控制

1、acl权限控制

使用scheme:id:permission来表示同意,主要涵盖三个方面

权限模式(scheme)、授权对象(id)、权限(permission)

Zookeeper的权限控制是基于每个znode节点的,需要对每一个节点设置权限

每个znode支持设置多种权限控制方案和多个权限

子节点不会继承父节点的权限,客户端无权访问某节点,但是可能可以访问他的子节点

 

2、权限模式

world:只有一个用户:anyone,代表登录zookeeper所有人

IP:对客户端使用IP地址认证

auth:使用已添加认证的用户认证

digest:使用用户名和密码的方式认证

 

3、授权的权限

create:c 可以创建子节点

delete:d 可以删除子节点(仅仅是下一级节点)

read:r  可以读取节点数据及显示子节点列表

write:w 可以设置节点数据

admin:a 可以设置节点访问控制列表权限

 

4、授权相关的命令

getAcl:读取ACL权限

setAcl:设置ACL权限

addauth:添加认证用户

 

5、授权案例

world授权:setAcl /hadoop world:anyone:cdrwa

                      对所有用户进行授权,拥有的权限是:增删改查管理

 

IP授权:setAcl /hadoop ip:192.168.10.11:cdrwa

               对IP为192.168.10.11用户授权

     对多个用户进行授权:

               setAcl /hadoop ip:192.168.10.11:cdrwa,ip:192.168.10.12:cdrwa

 

auth授权:

       添加认证用户: addauth digest user:password      

       setAcl /hadoop auth:user:password

 

Digest授权:

             通过SHA1和BASE64来计算一个密文:    echo -n tealala:123456 | openssl dgst -binary -sha1 |openssl base64

              setAcl /node4 digest:tealala:19yWFKnBZEez6FMDn5lBfMG1SUo=:cdrwa

 

ACL 超级管理员:

echo -n super:admin | openssl dgst -binary -sha1 |openssl base64

 

五、ZookeeperAPI

第一步、建立连接

第二步、对数据节点进行增删改查操作

第三步、关闭连接


@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ZookeeperCreate {

    private String ip="localhost:2181";

    private ZooKeeper zooKeeper;

    @BeforeAll
    public void before(){
        System.out.println("before");
        CountDownLatch countDownLatch = new CountDownLatch(1);
        try {
            zooKeeper = new ZooKeeper(ip, 5000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
                        System.out.println("连接创建成功");
                    }
                    countDownLatch.countDown();
                    System.out.println(watchedEvent.getState());
                }
            });
            countDownLatch.await();
            System.out.println(zooKeeper.getSessionId());

        }catch (Exception e){

        }
    }

    @AfterAll
    public void after() throws InterruptedException {
        System.out.println("after");
        zooKeeper.close();
    }

    @Test
    public void test() throws KeeperException, InterruptedException {
        System.out.println("create");
        //节点对路径,节点的数据,权限列表,节点类型
        zooKeeper.create("/create/node1","111".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.PERSISTENT);
    }

    @Test
    public void create2() throws KeeperException, InterruptedException {
        List<ACL> aclList = new ArrayList<>();
        Id id = new Id("world","anyone");
        aclList.add(new ACL(ZooDefs.Perms.READ,id));
        zooKeeper.create("/create/node2","2222".getBytes(), aclList, CreateMode.PERSISTENT);
    }

    @Test
    public void create3() throws KeeperException, InterruptedException {
        List<ACL> aclList = new ArrayList<>();
        Id id = new Id("ip","192.168.1.155");
        aclList.add(new ACL(ZooDefs.Perms.READ,id));
        zooKeeper.create("/create/node3","3333".getBytes(), aclList, CreateMode.PERSISTENT);
    }



    @Test
    public void create4() throws KeeperException, InterruptedException {
        zooKeeper.addAuthInfo("digest","tealala:123456".getBytes());
        zooKeeper.create("/create/node4","4444".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
    }


    @Test
    public void create5() throws KeeperException, InterruptedException {
        zooKeeper.addAuthInfo("digest","tealala:123456".getBytes());
        List<ACL> acls = new ArrayList<>();
        Id id = new Id("auth","tealala");
        acls.add(new ACL(ZooDefs.Perms.READ, id));
        zooKeeper.create("/create/node5","55555".getBytes(), acls, CreateMode.PERSISTENT);
    }

    @Test
    public void create6() throws KeeperException, InterruptedException {
        String result = zooKeeper.create("/create/node5","55555".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println(result);
    }

    @Test
    public void create7() throws KeeperException, InterruptedException {
        String result = zooKeeper.create("/create/node7","7777".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println(result);
    }


    @Test
    public void create8() throws KeeperException, InterruptedException {
        String result = zooKeeper.create("/create/node8","8888".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println(result);
    }

    @Test
    public void create9() throws KeeperException, InterruptedException {
        zooKeeper.create("/create/node9", "999999".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL, new AsyncCallback.StringCallback() {
            @Override
            public void processResult(int i, String path, Object ctx, String name) {
                System.out.println(i);
                System.out.println(name);
                System.out.println(ctx);
                System.out.println(path);
            }
        },"content");
        System.out.println("finish");
    }
}

这里只列举了新增节点的操作。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值