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核心理论

相关推荐
天天喝旺仔16 分钟前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
lisanmengmeng2 小时前
分布式追踪与监控:Skywalking(三)
分布式·skywalking
会周易的程序员11 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
青山木1 天前
RocketMQ 入门到原理(一):整体架构与消息的生命周期
java·分布式·后端·中间件·架构·rocketmq
lisanmengmeng2 天前
分布式追踪与监控:Skywalking介绍(一)
分布式·skywalking
HanhahnaH2 天前
Redis单线程和Tair多线程架构设计对比
分布式·缓存
rustfs2 天前
MinIO 国产开源平替正式 GA
分布式·docker·云原生·rust
螺蛳粉 螺蛳粉2 天前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
孙启超2 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust