文档章节

快速开始Zookeeper

吴伟祥
 吴伟祥
发布于 2018/07/11 16:49
字数 1969
阅读 14
收藏 0

什么是Zookeeper

Zookeeper是一个高性能的分布式应用协调服务的框架。Zookeeper=Zoo+keeper,中文直译是动物园的看守者。

是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户

为什么要使用Zookeeper

Zookeeper可以用于解决很多分布式系统遇到的问题,比如分布式锁,分布式协调,分布式消息队列等。

安装Zookeeper

在官网下载最新的Zookeeper稳定版,http://zookeeper.apache.org/releases.html#download,将下载的文件存放在本地目录及安装完毕,本文将Zookeeper安装在/Developer/java/project目录。本文下载的是zookeeper-3.4.9版本。

单机模式启动Zookeeper

下载完之后,将conf目录下的zoo_sample.cfg文件重命名成zoo.cfg文件。这个文件存放着Zookeeper的所有配置信息。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
  • tickTime:客户端和服务器端维持心跳的时间,单位为毫秒。
  • initLimit:
  • syncLimit:
  • dataDir:用来存放快照数据,官方建议不要使用/tmp目录,可以使用/tmp/zookeeper。
  • clientPort;启动Zookeeper服务的默认端口。
  • maxClientCnxns:最大客户端连接数。如果客户端的数量超过了指定的数量,则新连接的客户端会抛出java.io.IOException: Connection reset by peer异常。
  • autopurge.snapRetainCount:
  • autopurge.purgeInterval:

通过zkServer.sh start命令启动Zookeeper,启动后默认端口是2181,启动成功后命令行会回显已经启动成功的标示STARTED。

tengfeifangtf:bin tengfei.fangtf$ sh /Developer/java/project/zookeeper-3.4.9/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /Developer/java/project/zookeeper-3.4.9/bin/../conf/zoo.cfg
-n Starting zookeeper ...
STARTED

通过命令行调用Zookeeper

连接Zookeeper

通过如下命令连接Zookeeper服务器端。如果服务器端不存在,则会抛出java.net.ConnectException: Connection refused异常

tengfeifangtf:bin tengfei.fangtf$ sh /Developer/java/project/zookeeper-3.4.9/bin/zkCli.sh -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
2016-09-17 22:02:00,703 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2016-09-17 22:02:00,707 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=192.168.100.224
2016-09-17 22:02:00,707 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.6.0_65
2016-09-17 22:02:00,710 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Apple Inc.
2016-09-17 22:02:00,710 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
2016-09-17 22:02:00,710 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/Developer/java/project/zookeeper-3.4.9/bin/../build/classes:/Developer/java/project/zookeeper-3.4.9/bin/../build/lib/*.jar:/Developer/java/project/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/Developer/java/project/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/Developer/java/project/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/Developer/java/project/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/Developer/java/project/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/Developer/java/project/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/Developer/java/project/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/Developer/java/project/zookeeper-3.4.9/bin/../conf:
2016-09-17 22:02:00,711 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=.:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
2016-09-17 22:02:00,711 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/var/folders/6s/z6xt4ypn387239k7q1ty_rkc0000gn/T/
2016-09-17 22:02:00,713 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2016-09-17 22:02:00,713 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Mac OS X
2016-09-17 22:02:00,714 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=x86_64
2016-09-17 22:02:00,714 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=10.11.6
2016-09-17 22:02:00,714 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=tengfei.fangtf
2016-09-17 22:02:00,714 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/Users/tengfei
2016-09-17 22:02:00,714 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/Developer/java/project/zookeeper-3.4.9/bin
2016-09-17 22:02:00,716 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@3a21b220
Welcome to ZooKeeper!
2016-09-17 22:02:00,754 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (java.lang.SecurityException: Unable to locate a login configuration)
JLine support is enabled
2016-09-17 22:02:00,775 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@876] - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
[zk: 127.0.0.1:2181(CONNECTING) 0] 2016-09-17 22:02:01,075 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x157386e843d0004, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

连接成功后会进入Zookeeper交互式窗口,命令行左边显示如下,然后你就可以使用Zookeeper提供的命令来创建,修改和删除节点。

[zk: 127.0.0.1:2181(CONNECTED) 0]

创建节点

使用create参数创建节点,第一个参数是节点路径,第二个参数是节点的数据。

[zk: 127.0.0.1:2181(CONNECTED) 1] create /dmcNode data
Created /dmcNode

注意:节点路径是大小写敏感的。

查看节点

使用get命令查询节点的数据,会显示节点的数据长度,数据的版本

[zk: 127.0.0.1:2181(CONNECTED) 2] get /dmcNode
data
cZxid = 0x54
ctime = Sat Sep 17 22:07:49 CST 2016
mZxid = 0x54
mtime = Sat Sep 17 22:07:49 CST 2016
pZxid = 0x54
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

通过get命令我们可以看到Zookeeper节点的数据结构

  • cxxid:当前节点事务的xxid。
  • ctime:当前节点的创建时间。
  • mxxid: 当前节点最近修改的xxid。
  • pZxid : 子节点的最后版本
  • cversion:这个节点的子节点变化次数,创建一个子节点会加1。
  • dataVersion:数据的版本,每次修改会加一。
  • aclVersion:这个节点的ACL变化次数。
  • ephemeralOwner :如果这个节点是临时节点,表示创建者的会话id。如果不是临时节点,这个值是0。
  • dataLength:这个节点存放的数据长度。
  • numChildren:这个节点的子节点个数。
  • mtime:这个节点的最后修改时间。

这些属性可以参考《Zookeeper官方文档》Zookeeper tatStructure章节https://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_zkStatStructure

修改节点

可以发现dataVersion从刚才的0变成了1,数据长度也变化了。

[zk: 127.0.0.1:2181(CONNECTED) 3] set /dmcNode data1
cZxid = 0x54
ctime = Sat Sep 17 22:07:49 CST 2016
mZxid = 0x55
mtime = Sat Sep 17 22:10:46 CST 2016
pZxid = 0x54
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

删除节点

通过delete [path]命令删除节点

[zk: 127.0.0.1:2181(CONNECTED) 12] delete /dmcNode

help命令

我们通过help命令可以看下Zookeeper提供哪些操作命令。

[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    connect host:port
    get path [watch]
    ls path [watch]
    set path data [version]
    rmr path
    delquota [-n|-b] path
    quit
    printwatches on|off
    create [-s] [-e] path data acl
    stat path [watch]
    close
    ls2 path [watch]
    history
    listquota path
    setAcl path acl
    getAcl path
    sync path
    redo cmdno
    addauth scheme auth
    delete path [version]
    setquota -n|-b val path    
  • quit:退出连接。
  • history:查看当前连接历史执行命令。

关闭Zookeeper

如果先关闭了Zookeeper服务端,而客户端没有关闭,则客户端会不断的重连服务器端,并抛出异常closing socket connection and attempting reconnect。

sh /Developer/java/project/zookeeper-3.4.9/bin/zkServer.sh stop

通过Java API调用Zookeeper

1:引入POM

<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.4.7</version>
</dependency>

2:Java测试代码

演示了ZooKeeper节点的创建,修改和删除操作。

import java.io.IOException;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;

/**
 * 
 * @author tengfei.fangtf
 * @version $Id: TestZookeeper.java, v 0.1 Sep 14, 2016 5:05:07 PM tengfei.fangtf Exp $
 */
public class TestZookeeper {

    public static void main(String[] args) throws IOException, InterruptedException,
                                           KeeperException {
        //创建ZooKeeper实例
        ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 100, null);
        String path = "/dmc";

        //创建一个节点,模式是PERSISTENT
        zk.create(path, "1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建节点" + path + ",数据为:" + new String(zk.getData(path, null, null)));
        //修改节点数据
        zk.setData(path, "2".getBytes(), -1);
        System.out.println("修改节点" + path + ",数据为:" + new String(zk.getData(path, null, null)));
        //删除一个节点
        System.out.println(zk.exists(path, null));
        zk.delete(path, -1);
        //节点是否存在
        System.out.println(zk.exists(path, null));

    }

}

输出的结果如下:

创建节点/dmc,数据为:1
修改节点/dmc,数据为:2
78,79,1474120607561,1474120607575,1,0,0,0,1,0,78

null

参考资料

本文转载自:http://ifeve.com/zookeeper-talk-quick-start/

吴伟祥

吴伟祥

粉丝 34
博文 500
码字总数 285677
作品 0
泉州
后端工程师
私信 提问
加载中

评论(0)

ZooKeeper教程资源收集(简介/原理/示例/解决方案)

菩提树下的杨过: ZooKeeper 笔记(1) 安装部署及hello world ZooKeeper 笔记(2) 监听数据变化 ZooKeeper 笔记(3) 实战应用之【统一配置管理】 ZooKeeper 笔记(4) 实战应用之【消除单点故障】...

easonjim
2017/09/05
0
0
linux- 快速安装zookeeper

  前言   zookeeper是apache的一个开源项目,在国内都有对应的镜像地址。安装之前确认已经安装了JDK。      下载   cd /root   wget https://mirrors.aliyun.com/apache/zookee...

linux运维菜
2018/08/28
0
0
【Kafka 1.x】快速入门

本博客文章如无特别说明,均为原创!转载请注明出处:Big data enthusiast(http://www.lubinsu.com/) 本文链接地址:【Kafka 1.x】快速入门(http://www.lubinsu.com/index.php/archives/475)...

snoopy93
2018/05/08
0
0
ZooKeeper Java例子(四)

A Simple Watch Client 为了向你介绍ZooKeeper Java API,我们开发了一个非常简单的监视器客户端。ZooKeeper客户端监视一个ZooKeeper节点的改变并且通过开始和停止一个程序来作出响应。 必备条...

chenkangyao
2018/08/02
53
0
给新人的ZooKeeper学习计划

初步了解ZooKeeper ZooKeeper的学习,包括了产品级别的学习,和源码级别的学习。产品级别的学习,主要就是通过一些文章,了解ZooKeeper是什么东西,可以提供什么服务,提供什么样的语义保证,...

Jiang阿涵
2019/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java基本程序设计结构

简述 Java起源于Sun公司为机顶盒开发的一款开发语言“Oak”,由于该名称被抢注更名为“Java”。Java是基于面向对象的开发语言,其特性在于“一次编译,到处运行”,这实现依赖于JVM。 Java程...

Yongy
24分钟前
49
0
【jquery仿dataList——性能优化】模板预编译思想提高性能10倍以上!!!

那撒,IE和google性能不减反增,求高手解释....... 前言 呵呵,当然,什么预编译什么性能提高5倍以上基本上市坑爹的,这里就是为了吸引阅读量,哈哈。 上当的大哥主动顶下哇??? 正题 之前...

shzwork
28分钟前
57
0
用博客系统开发作文网站探索MYSQL数据库性能和缓存技巧[图]

用博客系统开发作文网站探索MYSQL数据库性能和缓存技巧[图] 最近忙着建站,感觉现在建站是越来越难了,但还是用ZBLOG系统建了一个作文网站,叫做求索作文网,但是发现博客系统的缺点也还是有...

原创小博客
31分钟前
31
0
LinearLayout不在ScrollView内扩展

我在ScrollView中有一个LinearLayout ,它有android:layout_height="fill_parent" ,但它没有扩展到ScrollView的整个高度。 我的布局看起来像: level layout layout_width layout_......

技术盛宴
49分钟前
37
0
docker上启动nginx,并配置修改nginx的配置文件

1.使用docker 下载nginx 镜像 docker pull nginx 2.启动nginx docker run --name nginx -p 80:80 -d nginx 这样就简单的把nginx启动了,但是我们想要改变配置文件nginx.conf ,进入容器,命令...

yuxw
53分钟前
45
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部