zookeeper笔记
1、定义作用
zookeeper是典型的一个分布式数据一致性的解决方案,分布式应用程序协调服务。
zookeeper为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
主要功能有:数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列
2、四大节点
临时节点、临时顺序节点、永久节点、永久顺序节点
临时节点:客户端session关闭之后,节点会被删除
顺序节点:顺序节点是在节点后按顺序添加十位数字
3、事件、监听
数据一旦发生变化,客户端会立即感应到。
主要有事件:None,NodeCreated, NodeDataChanged, NodeDeleted, NodeChildrenChanged
ZK的所有读操作都可以设置watch监视点: getData, getChildren, exists. 写操作则是不能设置监视点的。
实现Watcher接口
4、leader选举
5、数据同步
6、启动
docker pull zookeeper
docker run --name myZookeeper --restart always -e JVMFLAGS="-Xmx1024m" -p 2181:2181 zookeeper
docker exec -it 6383fb95f639 /bin/bash
7、zkCli.sh 基本命令
远程连接 ./zkCli.sh -timeout 0 -r -server ip:port ./zkCli.sh -timeout 5000 -server 192.9.200.242:2181
create [-s] [-e] path data acl -s 表示是顺序节点 -e 标识是临时节点 path 节点路径 data 节点数据 acl 节点权限
ls path:查看某个节点下的所有子节点信息(ls -s显示详情)
stat path :获取指定节点的状态信息
get path 获取当前节点的数据内容
delete path [version] 删除指定路径的节点 如果有子节点要先删除子节点
rmr path 删除当前路径节点及其所有子节点
8、客户端demo
package com.taoge.test;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.util.concurrent.CountDownLatch;
/**
* Desc:
*
* @author taoxuefeng
* @date 2021/5/28
*/
public class Main {
public static void main(String[] args) {
try {
final CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zooKeeper =
new ZooKeeper("localhost:2181",
4000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (Event.KeeperState.SyncConnected == event.getState()) {
//如果收到了服务端的响应事件,连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
//CONNECTED
zooKeeper.create("/c", "c".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(zooKeeper.getState());
byte[] data = zooKeeper.getData("/c", true, new Stat());
System.out.println(new String(data));
zooKeeper.delete("/c", -1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
curator开发
package com.taoge.test;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.data.Stat;
/**
* Desc:
*
* @author taoxuefeng
* @date 2021/5/28
*/
public class Main2 {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.
builder().connectString("127.0.0.1:2181").
sessionTimeoutMs(4000).retryPolicy(new
ExponentialBackoffRetry(1000, 3)).
namespace("").build();
curatorFramework.start();
Stat stat = new Stat();
//查询节点数据
byte[] bytes = curatorFramework.getData().storingStatIn(stat).forPath("/c");
System.out.println(new String(bytes));
curatorFramework.close();
}
}