1.zk的详细使用
1.zk的节点分为持久节点和临时节点
1.持久节点------>会做一个持久化操作
2.临时节点----->是和客户端会话连接的
我们通常创建的节点叫做持久节点 意味着可以持久化的
我们也可以创建临时节点
create -e /luban 1
我们也可以使用create -e 命令创造临时节点 临时节点就意味着当我们关闭客户端的时候这个节点会消失
临时节点不能再创建子节点
zk对每个节点的最大数据量有一个上线 1M
create -s /lvhao3 "22"
顺序节点
每当我们使用 get命令的时候
zk里面每一个操作,不管你是create set 都会有一个自己的事务,也就是说每次事务都有一个id,
创建一个节点的时候 事务Id是多少呢 ,m代表你修改的事务Id p 操作子节点的一个事务Id
zk的acl
任何一个客户端都可以连接上 并且可以操作这些节点,呢么我在生产上,肯定有一些节点不允许去写,或者去更改,zk也有他的权限控制
getAcl /lvhao2 可以查看某个节点的权限
world anyone
cdrwa 代表 我当前这个节点任何人都可以操作 创建 删除 修改 查询 以及更改权限,
我们可以使用setAcl更改权限,比如说我此时吧权限更改为这个node只能创建, 然后当修改的时候就会报错
https://blog.csdn.net/liuxiao723846/article/details/79391650 //权限 看大佬博客
https://blog.csdn.net/qq_45895388/article/details/114315746 // zk 看大佬的博客
addouth digest: zhangsan:12345 // 首先你要加这个用户 // 类似于登录 关于用户认证
// 谁可以吧吧这个节点删除
只有一个办法 删除物理文件
zk的watch机制
//默认的watch
ZooKeeper client = new ZooKeeper("localhost:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("连接的时候 " + event);
}
});
此时我用原生的客户端连接zk 在 客户端连接的时候会吧这个zk打印处出来
他这个watch 是一个默认的watch,在连接的时候执行watch 我们也可以针对于一个节点进行监听
byte[] data = client.getData("/node5", new Watcher() {
@Override
public void process(WatchedEvent event) {
if( Event.EventType.NodeDataChanged.equals(event.getType())){
System.out.println("1------>改变");
}
}
}, new Stat());
比如说 当数据进行改变的时候,触发这个watch机制 但是 原生的watch机制只能用一次,当我再进行改变的时候 不会触发
基于这个事件监听器实现消费订阅
当我们程序这样写的话 就会设置一个默认监听器
client.getData("/data",true,new Stat()) // 默认监听器
client.getData("/data",false,new Stat()) 如果这样的话就不会设置监听器
Zookeeper异步API调用:AsyncCallback
watch 机制和 AsyncCallback 的区别
Watcher关注的是节点的状态变化,AsyncCallback关注的是API调用返回结果,一个是监听节点将来的变化,一个是获取节点当前的状态或数据,所以两者并不冲突,也可以共存。
原生的客户端有一点不好的就是当对一个节点进行wanch监听的时候,只会触发一次 ,所以有一种现在通用的客户端 Curator
CuratorFramework client = CuratorFrameworkFactory.newClient(
"localhost:2181",
//重试策略 循环3次m ,每隔100ms 重试一次
new RetryNTimes(3, 100));
client.start();
// 1.执行什么操作 2. 操作在什么地方
// client.create().withMode(CreateMode.EPHEMERAL)
// .forPath("/data","1".getBytes());
//
String path = "/node5";
NodeCache nodeCache = new NodeCache(client, path);
nodeCache.start();
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("11");
}
});
System.in.read();
此时我们配置的重试策略是 循环3次m ,每隔100ms 重试一次
他这个框架是针对于一个节点的进行的缓存
zk的作用
1. 统一命名服务
2. 配置中心
3. 利用顺序节点可以生成全局唯一id
4. 分布式锁
5. 监控系统 [https://blog.csdn.net/u011486068/article/details/50971796]