zookeeper概念 zookeeper常用客户端指令 Curator 事件监听 zookeeper分布式锁 ZooKeeper 集群搭建
Posted halulu.me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper概念 zookeeper常用客户端指令 Curator 事件监听 zookeeper分布式锁 ZooKeeper 集群搭建相关的知识,希望对你有一定的参考价值。
zookeeper概念
- ZooKeeper 是 Apache Hadoop 项目下的一个子项目,是一个树形目录服务。
- ZooKeeper 翻译过来就是 动物园管理员,他是用来管 Hadoop(大象)、Hive(蜜蜂)的管理员。
- ZooKeeper 是一个分布式的、开源的分布式应用程序的协调服务。
- ZooKeeper 提供的主要功能包括:
1、配置管理
2、分布式锁:(同时锁住2个JVM )
3、注册中心(dubbo的registry)
4、集群管理(dubbo多个提供者provider)
zookeeper常用客户端指令
连接和退出:
查看目录:
创建节点:
获取节点值:
设置节点值:
删除节点:
临时节点e和顺序节点s:
临时节点:-e 连接中断,节点就消失了。
顺序节点: -s 会在后面加一堆数字,方便进行排序
查看节点详细信息:
Curator 事件监听
ZooKeeper提供了三种Watcher:
- NodeCache : 只是监听某一个特定的节点
- PathChildrenCache : 监控一个ZNode的子节点(子节点增删改了)
- TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合
NodeCache
@Test
public void NodeCache() throws Exception{
// 1. 创建监听器对象
final NodeCache nodeCache = new NodeCache(client, "/app1");
// 2. 绑定监听器
nodeCache.getListenable().addListener(new NodeCacheListener() {
// 当/app1节点发生改变,就会回调nodeChanged
public void nodeChanged() throws Exception {
System.out.println("节点改变了...");
// 获取改变后的数据
ChildData currentData = nodeCache.getCurrentData();
byte[] data = currentData.getData();
// 打印数据
System.out.println(new String(data));
}
});
// 3. 开启监听,如果参数为true开启监听时,如果设置为true,那么NodeCache在第一次启动的时候就会立刻在Zookeeper上读 // 取对应节点的数据内容,并保存在Cache中。
nodeCache.start(true);
// 不让线程结束
while(true){
}
}
PathChildrenCache
@Test
public void pathChildrenCache() throws Exception {
// 1. 创建监听器对象,参数3-是否加载缓存数据
PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/app2", true);
// 2. 绑定监听器
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)
throws Exception {
// event={type=CHILD_ADDED, data=ChildData{path='/app2/p2', stat=..,data=null}}
// event={type=CHILD_UPDATED, data=ChildData{path='/app2/p2', stat=..,data=null}}
// event={type=CHILD_REMOVED, data=ChildData{path='/app2/p2', stat=..,data=null}}
System.out.println("子节点变化了," + event);
// 获取type类型
PathChildrenCacheEvent.Type type = event.getType();
if (type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
byte[] data = event.getData().getData();
System.out.println("获取变化后数据:" + new String(data));
}
}
});
// 3. 开启监听
pathChildrenCache.start();
while (true){
}
}
TreeCache
/**
* TreeCache : 可以监控整个树上的所有节点,相当于NodeCache+PathChildrenCache组合
*/
@Test
public void treeCache() throws Exception {
// 1. 创建监听器对象
TreeCache treeCache = new TreeCache(client, "/app3");
// 2. 绑定监听器
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println("子节点变化了," + event);
// 获取type类型
TreeCacheEvent.Type type = event.getType();
// 监听修改节点的事件,获取修改后的值(不管自己还是儿子发生变化都监控到)
if (type.equals(TreeCacheEvent.Type.NODE_UPDATED)){
byte[] data = event.getData().getData();
System.out.println("获取变化后数据:" + new String(data));
}
}
});
// 3. 开启监听
treeCache.start();
while (true){
}
}
zookeeper分布式锁
原理
- 客户端准备获取锁时,在lock节点下创建临时顺序节点。
- 然后获取lock下面的所有子节点,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
- 如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
- 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
ZooKeeper 集群搭建
以上是关于zookeeper概念 zookeeper常用客户端指令 Curator 事件监听 zookeeper分布式锁 ZooKeeper 集群搭建的主要内容,如果未能解决你的问题,请参考以下文章
[高级]Zookeeper介绍——Zookeeper中的基本概念
Zookeeper -- 初识ZookeeperZookeeper的安装和配置Zookeeper命令操作(Zookeeper数据模型 Zookeeper服务端 / 客户端常用命令)