Zookeeper入门看这篇就够了

  1. 持久节点

  2. 临时节点

  3. 持久顺序节点

  4. 临时顺序节点

创建顺序节点命令(加上 “-s”参数):create -s /module1/app app

我们会看到 Created /module1/app0000000001

意思是我们创建了一个持久顺序节点“/module1/app0000000001” 如果再执行上面命令 会生成节点 “/module1/app0000000002”,同理 如果我们 create -s后面添加 -e 参数,就表示我们创建了一个临时节点。

节点数据
  • 创建节点的时候,我们可以指定节点中存储的数据,ZooKeeper可以保证读写都是原子操作,而且每次读写操作都是对数据的完整读取或者完成写入,不提供对数据的部分读取或者写入操作。

  • ZooKeeper 虽然提供了节点存储数据的功能,但是我们并不能把它当成一个数据库,重点不要把Zookeeper 当成数据库用,因为Zookeeper 规定了节点的数据大小不能超过1M,所以我们不能在节点上存储过多的数据,尽可能保证小的数据量,因为数据过大,会导致ZK的性能下降。

  • 如果确实需要存储大量的数据,一般可以在分布式数据库或者Redis保存这部分数据,然后在Znode中保留数据库中的索引。

Zookeeper单机模式安装


java 环境

配置JAVA环境,检验环境 java -version

下载安装Zookeeper

下载地址:https://zookeeper.apache.org/releases.html

下载1

下载2

下载解压Zookeeper

cd /usr/local/

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz

tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz

cd zookeeper-3.7.0/

重命名配置文件 zoo_sample.cfg

cp conf/zoo_sample.cfg conf/zoo.cfg

启动ZK

./bin/zkServer.sh start

连接ZK客户端

./bin/zkCli.sh

当我们看到下图的信息的时候,表示我们启动成功

在这里插入图片描述

Zookeeper命令


基本命令
  • create : 在树中的某个位置创建一个节点

  • delete : 删除一个节点存在:测试节点是否存在于某个位置

  • get data : 从节点读取数据

  • set data: 将数据写入节点

  • get children : 检索节点的子节点列表

  • sync : 等待数据被传播

操作Zookeeper
  1. 查看Zookeeper中包含的key

ls /

  1. 创建一个新的Znode

创建成功以后我们可以使用 ls /查看我们创建的内容

create /zkMxn muxiaonong

ls /

[zkMxn, zookeeper]

  1. get命令获取创建Znode的内容

get /zkMxn

  1. set 命令来对 zk 所关联的字符串进行设置

set /zkMxn mxn666

  1. 删除Znode

delete /zkMxn

Java Api操作 ZK


1. 导入Jar包

org.apache.zookeeper

zookeeper

3.6.3

junit

junit

4.13.2

runtime

2. API操作Zookeeper

创建Zookeeper对象

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException {

this(connectString, sessionTimeout, watcher, false);

}

  • connectString: 连接的地址,包括主机名和端口号,多个的话用逗号隔开

  • sessionTimeout: 等待客户端通信的最长时间,客户端如果超过这个时间没有和服务端进行通信,那么就认为该客户端已经终止,一般设置值为 5-10秒,单位为毫秒

  • watcher: 监听器,用于接收会话事件的接口,需要自己定义,实现process()方法

连接Zookeeper

Zookeeper zkClient = “”;

String connectStr = “192.168.2.1:2181”;

zkClient = new ZooKeeper(connectStr, 5000, new Watcher() {

@Override

public void process(WatchedEvent watchedEvent) { }

});

创建节点

public String create(String path, byte[] data, List acl, CreateMode createMode) throws KeeperException, InterruptedException {}

  • path: 节点路径

  • data: 节点数据

  • acl: 节点权限,例如:ZooDefs.Ids.OPEN_ACL_UNSAFE

OPEN_ACL_UNSAFE:完全开发,采用world验证模式,由于每个ZK连接都有world验证模式,所以当我们节点设置了该参数时,对所有连接开放

CREATOR_ALL_ACL: 创建该Znode连接的拥有所有权限,这里采用的是auth验证模式,用sessionID做验证,如果设置了该参数,只有创建改Znode节点的连接才能对这个Znode进行任何操作

READ_ACL_UNSAFE:所有的客户端都可读,这里采用world验证模式,和第一条同理,所有连接都可以读取该znode

  • createMode: 节点类型,例如:CreateMode.PERSISTENT

PERSISTENT:持久节点

PERSISTENT_SEQUENTIAL:持久有序节点

EPHEMERAL:短暂节点

EPHEMERAL_SEQUENTIAL:短暂有序节点

完整APIDemo:

import lombok.extern.slf4j.Slf4j;

import org.apache.zookeeper.*;

import org.apache.zookeeper.data.Stat;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.concurrent.CountDownLatch;

/** @Author mxn

  • @Description //TODO ZooKeeper Java API测试

  • @Date 10:22 2021/9/29

  • @Param

  • @return

**/

@Slf4j

public class ZookeeperTest {

// IP 和端口

private final static String ipAddress = “192.168.2.123:2181”;

public static void main(String[] args) {

ZookeeperTest test = new ZookeeperTest();

String key = “/zkMxn”;

String value = “wo is muxiaonong”;

//创建Znode

test.add(key,value);

// 获取节点数据

// test.get(key);

//修改节点数据

// test.modify(key,“wo is zhuzhuxia”);

//删除节点

// test.delete(key);

}

/**

  • @return

  • @Author mxn

  • @Description //TODO 获取ZooKeeper连接

  • @Date 10:22 2021/9/29

  • @Param

**/

public static ZooKeeper getConntection() {

ZooKeeper zooKeeper = null;

try {

final CountDownLatch countDownLatch = new CountDownLatch(1);

//watch机制(回调),监听是否连接成功

zooKeeper = new ZooKeeper(ipAddress, 5000, new Watcher() {

@Override

public void process(WatchedEvent watchedEvent) {

if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {

//如果受收到了服务端的响应事件,连接成功

countDownLatch.countDown();

}

}

});

countDownLatch.await();

log.info(“zookeeper状态:{}”,zooKeeper.getState());//CONNECTED

} catch (IOException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

return zooKeeper;

}

/** @Author lyy

  • @Description //TODO 关闭ZooKeeper连接

  • @Date 14:57 2021/9/29

  • @Param

  • @return

**/

public static void closeConnection(ZooKeeper zooKeeper) {

try {

// zooKeeper.close();

} catch (Exception e) {

e.printStackTrace();

}

}

/** @Author lyy

  • @Description //TODO 添加节点

  • @Date 13:36 2021/9/29

  • @Param

  • @return

**/

public void add(String key ,String value) {

ZooKeeper zooKeeper = ZookeeperTest.getConntection();

try {

//参数类型

//1.key

//2.value

//3.对应的ACL,当前节点的权限控制

//4.设置当前节点类型

zooKeeper.create(key, value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

ZookeeperTest.closeConnection(zooKeeper);

} catch (KeeperException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

/** @Author lyy

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

麻烦帮忙转发一下这篇文章+关注我

就这一次!拼多多内部架构师培训Kafka源码笔记(现已绝版)

keeperTest.getConntection();

try {

//参数类型

//1.key

//2.value

//3.对应的ACL,当前节点的权限控制

//4.设置当前节点类型

zooKeeper.create(key, value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

ZookeeperTest.closeConnection(zooKeeper);

} catch (KeeperException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

/** @Author lyy

总结

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。

麻烦帮忙转发一下这篇文章+关注我

[外链图片转存中…(img-yq0Lxl9f-1714481983906)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 17
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值