目录
概念

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