-
持久节点
-
临时节点
-
持久顺序节点
-
临时顺序节点
创建顺序节点命令(加上 “-s”参数):create -s /module1/app app
我们会看到 Created /module1/app0000000001
意思是我们创建了一个持久顺序节点“/module1/app0000000001” 如果再执行上面命令 会生成节点 “/module1/app0000000002”,同理 如果我们 create -s
后面添加 -e 参数,就表示我们创建了一个临时节点。
节点数据
-
创建节点的时候,我们可以指定节点中存储的数据,ZooKeeper可以保证读写都是原子操作,而且每次读写操作都是对数据的完整读取或者完成写入,不提供对数据的部分读取或者写入操作。
-
ZooKeeper 虽然提供了节点存储数据的功能,但是我们并不能把它当成一个数据库,重点不要把Zookeeper 当成数据库用,因为Zookeeper 规定了节点的数据大小不能超过1M,所以我们不能在节点上存储过多的数据,尽可能保证小的数据量,因为数据过大,会导致ZK的性能下降。
-
如果确实需要存储大量的数据,一般可以在分布式数据库或者Redis保存这部分数据,然后在Znode中保留数据库中的索引。
java 环境
配置JAVA环境,检验环境 java -version
下载安装Zookeeper
下载地址:https://zookeeper.apache.org/releases.html
下载解压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
当我们看到下图的信息的时候,表示我们启动成功
基本命令
-
create : 在树中的某个位置创建一个节点
-
delete : 删除一个节点存在:测试节点是否存在于某个位置
-
get data : 从节点读取数据
-
set data: 将数据写入节点
-
get children : 检索节点的子节点列表
-
sync : 等待数据被传播
操作Zookeeper
- 查看Zookeeper中包含的key
ls /
- 创建一个新的Znode
创建成功以后我们可以使用 ls /
查看我们创建的内容
create /zkMxn muxiaonong
ls /
[zkMxn, zookeeper]
get
命令获取创建Znode的内容
get /zkMxn
- set 命令来对 zk 所关联的字符串进行设置
set /zkMxn mxn666
- 删除Znode
delete /zkMxn
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代码。
麻烦帮忙转发一下这篇文章+关注我
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)]