ZooKeeper的使用
引言
在之前的学习中,了解了ZooKeeper的一些基本原理和概念。这篇文章中主要介绍ZooKeeper的使用。
前期准备
ZooKeeper是基于Java语言开发的一个中间件,因此首先需要准备一个Java环境。至于操作系统,则不推荐在FreeBSD系统上部署,因为该系统的JVM对Java的NIO Selector支持并不是很友好。
准备好上面的两个条件,即可安装ZooKeeper。首先下载安装包并进行解压,并将ZooKeeper的执行目录添加到系统变量中;其次重点关注zoo.cfg文件(初次安装后有一个zoo_sample.cfg文件,把这个文件改一下名字即可),这个文件是ZooKeeper的配置文件。如果需要组建集群还需要在dataDir目录下创建一个myid文件,文件第一行写上当前机器的id值。
配置完成后使用zkServer.sh start | status | stop指令可以实现启动ZooKeeper、查看状态和停止ZooKeeper。
客户端的使用
在机器上执行zkCli.sh脚本可以进入ZooKeeper的客户端,有一些比较常用指令在下文进行详细说明。
创建
create命令,可以创建一个ZooKeeper节点。其中-s 或 -e表示当前节点是顺序节点还是临时节点,默认生成持久节点。
create [-s] [-e] path data acl
读取
读取相关的指令有两个:ls和get。使用ls命令可以列出ZooKeeper指定节点下一级的所有子节点。使用get命令可以获取ZooKeeper指定节点保存的数据信息和属性信息。ls和get命令中的path表示指定的节点
ls path get path
更新
使用set命令可以更新指定节点的数据。其中data是要更新的内容,set命令后面还有一个version参数,在ZooKeeper中节点的数据是有版本的概念,这个参数是用来指定对ZNode中哪一个版本的数据进行更新。
set path data [version]
删除
是u哟功能delete命令可以删除ZooKeeper上指定的节点,这个命令中的version参数和set命令中的意思是一致的。
delete path [version]
ZooKeeper客户端Curator使用
Curator是Netflix 开源的 Java 客户端框架,功能丰富,封装了大量高级特性(如重试、锁、计数器等),是目前最主流、支持最好的第三方客户端。本节主要介绍一下Curator中的一些常见api及使用。
前期准备
如果想要使用Curator需要额外引入Jar包。第一个Jar是Curator客户端的Jar,第二个Jar是Curator监听机制的Jar。
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
创建客户端
创建客户端通过CuratorFrameworkFactory.newClient()方法或者CuratorFrameworkFactory.builder()方法创建。创建客户端后需要调用start()方法启动客户端。在创建客户端的时候可以设置连接地址,以ip:port形式拼接,如果要连接多台机器则使用英文逗号分隔;还可以设置连接的超时时间、会话的超时时间、跟节点的名称、重试策略等信息。重试策略需要实现RetryPolicy接口。
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.namespace("test")
.sessionTimeoutMs(5000)
.retryPolicy(new ExponentialBackoffRetry(50, 3, 100))
.build();
CRUD节点
create
创建节点直接使用create()方法,create方法可以设置节点类型、回调方法、是否递归创建父节点、节点路径等属性。
String zNode = client.create().storingStatIn(stat)
.withMode(CreateMode.EPHEMERAL)
.inBackground(callback, threadPool)
.forPath("/nodeTest", "nodeTest".getBytes());
get
调用getData()方法查询节点的数据,同时还可以通过storingStatIn()方法获取节点状态。
byte[] bytes = client.getData().storingStatIn(stat).forPath("/hjf");

浙公网安备 33010602011771号