喝杯咖啡了解下zookeeper的基本操作

什么是zookeeper?

官方版:

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集, 提供Java和C的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

作者目前使用到的:

在ZooKeeper上创建节点然后再对应的节点上进行增删的操作的同时使用Curator引入了Cache来实现对Zookeeper服务端事件监听,Cache事件监听可以理解为一个本地缓存视图与远程Zookeeper视图的对比过程。Cache提供了反复注册的功能。Cache分为两类注册类型:节点监听和子节点监听。

每个子目录项如 NameService 都被称作为znode,和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。 有四种类型的znode: 1、PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在 。 2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 。 3、EPHEMERAL-临时目录节点 客户端与zookeeper断开连接后,该节点被删除 。 4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 。

话不多说首先我们来来看看zookeeper在linux下的安装吧!

在linux下安装zookeeper的之前我们首先要安装jdk,对于jdk的安装我们使用yum命令安装非常的简便

1.列出所有jdk版本:

yum -y list java*

2.选择版本安装

yum -y install java-1.7.0-openjdk*

3.验证是否ok

java

javac

java -version

zookeeper在linux的安装那就更加的简便了到zookeeper官网下载稳定版 https://archive.apache.org/dist/zookeeper 的 tar.gz 的上传至linux下的/usr/local目录下其实放在哪个目录下都随意将包解压命令tar -zxvf 包的名称 即可解压到当前目录

进入到zookeeper的bin目录下

输入 sh zkServer.sh start 启动zookeeper

输入sh zkCli.sh 进入zookeeper的命令行查看当前我的zookeeper的节点

admin和zk-huey是小编自己创建的。

接下来我们一起走进代码编写吧

小编先贴上代码的截图吧

引入zookeeper所需要的jar包

代码实现

package com.open.zookeeper;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.cache.NodeCache;import org.apache.curator.framework.recipes.cache.NodeCacheListener;import org.apache.curator.framework.recipes.cache.PathChildrenCache;import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;import org.apache.curator.retry.ExponentialBackoffRetry;/** * @author lyj * @date 2019年1月8日 上午10:00:25 * Curator事件监听测试 * 使用Curator监听事件 */public class CarutorDemo {	/**	 * ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher通知是一次性的,	 * 因此开发过程中需要反复注册Watcher,比较繁琐。Curator引入了Cache来监听ZooKeeper服务端的事件。	 * Cache对ZooKeeper事件监听进行了封装,能够自动处理反复注册监听,简化了ZooKeeper原生API繁琐的开发过程。	 * @param args	 * @throws Exception	 */		public static void main(String[] args) throws Exception {        CuratorFramework client = CuratorFrameworkFactory.builder()            .connectString("118.25.26.200:2181")            .sessionTimeoutMs(5000)            .connectionTimeoutMs(3000)            .retryPolicy(new ExponentialBackoffRetry(1000, 3))            .build();        client.start();                // 创建节点        client.create()            .creatingParentsIfNeeded()            .forPath("/zk-huey/cnode", "hello".getBytes());                /**         * 在注册监听器的时候,如果传入此参数,当事件触发时,逻辑由线程池处理         */        ExecutorService pool = Executors.newFixedThreadPool(2);                /**         * 监听数据节点的变化情况         */        final NodeCache nodeCache = new NodeCache(client, "/zk-huey/cnode", false);        nodeCache.start(true);        nodeCache.getListenable().addListener(            new NodeCacheListener() {                @Override                public void nodeChanged() throws Exception {                    System.out.println("Node data is changed, new data: " +                         new String(nodeCache.getCurrentData().getData()));                }            },             pool        );                /**         * 监听子节点的变化情况         */        final PathChildrenCache childrenCache = new PathChildrenCache(client, "/zk-huey", true);        childrenCache.start(StartMode.POST_INITIALIZED_EVENT);        childrenCache.getListenable().addListener(            new PathChildrenCacheListener() {                @Override                public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)                        throws Exception {                        switch (event.getType()) {                        case CHILD_ADDED:                            System.out.println("CHILD_ADDED: " + event.getData().getPath());                            break;                        case CHILD_REMOVED:                            System.out.println("CHILD_REMOVED: " + event.getData().getPath());                            break;                        case CHILD_UPDATED:                            System.out.println("CHILD_UPDATED: " + event.getData().getPath());                            break;                        default:                            break;                    }                }            },            pool        );                client.setData().forPath("/zk-huey/cnode", "world".getBytes());         Thread.sleep(10 * 1000);        pool.shutdown();        client.close();    }	}
运行之后的效果:

当前的节点下是没有子节点的看看有子节点的效果
存储数据之后的效果到此我么的zookeeper的zookeeper的基本使用就到这了

原文发布于微信公众号 - 技术从心(gh_d845efe513db)

原文发表时间:2019-01-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券