Zookeeper入门

目录

概念

ZK命令操作

数据模型

服务端命令

bash 复制代码
./zkServer.sh start
./zkServer.sh stop
./zkServer.sh status
./zkServer.sh restart

客户端命令

bash 复制代码
./zkCli.sh -server 127.0.0.1:2181 #登录命令
quit #退出命令
ls / #查看根目录下子节点
ls /dir1/dir2 #查看指定目录下子节点
create /test #创建test节点
get /test #读取节点数据
set /test hehe #设置节点数据
delete /test #删除节点,若包含子节点则无法删除
deleteall /test #删除子树
create -e /test #创建临时节点,当前会话关闭时节点删除
create -s /test #创建顺序节点
create -es /test #创建临时顺序节点
ls -s /test # 可以查看test节点的详细信息

Java API操作

Curator

java 复制代码
//创建基本节点,带有数据,没有数据时则默认客户端ip为数据
client.create().forPath("/app1","hello");
//设置节点类型为临时节点,默认是持久化节点
client.create().withMode(CreateMode.EPHEMEAL).forPath("/path");
//创建多级节点
client.create().creatingParentsIfNeed().forPath("/path");
//查询节点,获取节点数据
client.getData().forPath("/app1");
//查询子节点,获取当前节点的子节点
client.getChildren().forPath("/app1");
//查询节点状态信息
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("/app1");
//修改节点数据
client.setData().forPath("/app1","world");
//根据版本信息修改数据法,防止多个客户端同时对数据进行操作,出现并发问题
client.setData().withVersion(stat.getVersion()).forPath("/app2","hahha".getBytes());
//删除带有子节点的节点
client.delete().deletingChildrenIfNeed().forPath("/app3");
//删除必须成功
client.delete().guaranteed().forPath("/app4");
//回调
client.delete().inBackground(()->{}).forPath("/app5");
事件监听

监听特定节点

java 复制代码
//注册NodeCache对象,监听单个节点
final NodeCache nodeCache = new NodeCache(client,"/app1");
//注册监听
nodeCache.getListenable().addListener(()->{
	//获取修改后节点的数据
	byte[] data = nodeCache.getCurrentData().getData();
});
//开启监听
nodeCache.start(true);

监听子节点

java 复制代码
//创建监听对象
PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/app2",true);
nodeCache.getListenable().addListener(()->{
	//监听子节点的变化,并且拿到变更后的数据
	PathChildrenCacheEvent.Type type = event.getType();
	if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
		byte[] data = event.getData().getData();
	}
});
pathChildrenCache.start();

监听子树

java 复制代码
TreeCache treeCache = new TreeCache(client,"/app3");
treeCache.getListenable().addListener(()->{
});
treeCache.start();

分布式锁

ZK集群

Leader选举

这里先比较Zxid,再比较Serverid,并且在开始选举时,都会先投票给自己,然后广播投票内容,其他节点收到广播后再根据上述规则确定是否改变投票。

搭建集群

bash 复制代码
1.下载安装包,然后解压,创建data文件夹
2.data文件夹下创建myid文件,并写入id(1,2,3,...)
3.配置zoo.cfg文件,写入集群所有服务器ip:port,格式如下:
server.1 = 127.0.0.1:2181#这里的1是写入myid里的id
...
4.配置zoo.cfg文件,配置dataDir为刚创建的data文件夹
5.启动zk

ZK核心理论

相关推荐
JLWcai2025100916 小时前
树脂砂轮质保与科学存放
mongodb·zookeeper·spark·memcached·storm
2601_9622186117 小时前
万象生鲜系统全链路溯源一码查询技术实现食材来源可查
分布式·微服务·云原生·架构
Dreams_l17 小时前
RabbitMQ介绍及其工作模式
分布式·rabbitmq
2601_9622186119 小时前
万象生鲜系统大数据采购预测算法降低库存积压稳居第一
分布式·微服务·云原生·架构
程序员夏洛20 小时前
Redis 中如何实现分布式锁?
数据库·redis·分布式
程序员夏洛1 天前
Redis 实现分布式锁时可能遇到的问题有哪些?
数据库·redis·分布式
千里码aicood1 天前
基于Hadoop的汽车销量分析与可视化
大数据·hadoop·分布式
国科安芯2 天前
ASC8T245S:把 8 位并行总线稳稳“跨过“电压域的双电源收发器
网络·分布式·单片机·嵌入式硬件·fpga开发·架构
MetaLite2 天前
Spring-Scheduled多实例重复执行怎么办-Redis分布式锁如何只让一个节点运行
redis·分布式·spring
Code知行合壹2 天前
数据中台设计
大数据·分布式·spark