一、序言

      以下是我对zookeeper 的一些理解:       zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。

栗子1号:

假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视我KTV 的情况吧,是不是有人打架,或者发生火灾什么的,这时候我会给设置一个视频监控,然后每一家都连接到我的视频监控里面,那么我就可以在家里看到所有KTV 的情况了,如果某一家出现问题,我就能及时发现,并且做出反应。

这个视频监控就相当于zookeeper,每一家的连接,就相当于KTV 的信息。

二、安装过程

2.1  http://mirrors.hust.edu.cn/apache/zookeeper/  下载,我的版本是 3.4.6(stable) 稳定

2.2  解压到 F:\zookeeper-3.4.6

3.3  到目录conf 下创建 zoo.cfg 文件,默认就是加载这个文件,文件内容 我直接copy 的sample里面的

  1. #zoo.cfg 的内容
  2. #   心跳检查的时间 2秒
  3. tickTime=2000
  4. # 初始化时 连接到服务器端的间隔次数,总时间10*2=20秒
  5. initLimit=10
  6. # ZK Leader 和follower 之间通讯的次数,总时间5*2=10秒
  7. syncLimit=5
  8. # 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
  9. dataDir=F:\\zk\\tmp\\zookeeper
  10. # 错误日志的存放位置
  11. dataLogDir=F:\\zk\\logs\\zookeeper
  12. # ZK 服务器端的监听端口
  13. clientPort=2181
#zoo.cfg 的内容
# 心跳检查的时间 2秒
tickTime=2000
# 初始化时 连接到服务器端的间隔次数,总时间10*2=20秒
initLimit=10
# ZK Leader 和follower 之间通讯的次数,总时间5*2=10秒
syncLimit=5
# 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
dataDir=F:\\zk\\tmp\\zookeeper
# 错误日志的存放位置
dataLogDir=F:\\zk\\logs\\zookeeper # ZK 服务器端的监听端口
clientPort=2181

上面的说明介绍:http://zookeeper.apache.org/doc/current/zookeeperStarted.html

然后 cd 到bin 目录下 执行zkServer.cmd 就启动成功了。

注意:dataDir  和  dataLogDir 目录不会自动创建,得手动创建才能启动。

可以用netstat -ano|findstr "2181" 看看是否OK。

也可以用JPS 查看启动的JAVA 进程的情况,会出现这样

  1. C:\windows\system32>jps
  2. 8068
  3. 10040 QuorumPeerMain  // 这东西是zk的东西,源码有介绍
  4. 10556 Jps
C:\windows\system32>jps
8068
10040 QuorumPeerMain // 这东西是zk的东西,源码有介绍
10556 Jps

也可以用自带客户端命令 :  zkCli.cmd -server 127.0.0.1:2181

关于JPS的东西,可以自己去JAVA_HOME\bin 目录下去看,里面很多命令。

四、JAVA 操作zookeeper :

上面安装挺简单的,我们来实际操作下:

4.1  导入依赖:

  1. <dependency>
  2. <groupId>org.apache.zookeeper</groupId>
  3. <artifactId>zookeeper</artifactId>
  4. <version>3.4.6</version>
  5. </dependency>
 <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>

4.2 JAVA 实现:这里我们简单实现上面的栗子

  1. // 根节点
  2. public static final String ROOT = "/root-ktv";
  3. public static void main(String[] args) throws Exception {
  4. // 创建一个与服务器的连接
  5. ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, new Watcher() {
  6. // 监控所有被触发的事件
  7. public void process(WatchedEvent event) {
  8. System.out.println("状态:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
  9. }
  10. });
  11. // 创建一个总的目录ktv,并不控制权限,这里需要用持久化节点,不然下面的节点创建容易出错
  12. zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  13. // 然后杭州开一个KTV ,       PERSISTENT_SEQUENTIAL 类型会自动加上 0000000000 自增的后缀
  14. zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
  15. // 也可以在北京开一个,       EPHEMERAL session 过期了就会自动删除
  16. zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  17. // 同理,我可以在北京开多个,EPHEMERAL_SEQUENTIAL  session 过期自动删除,也会加数字的后缀
  18. zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  19. // 我们也可以 来看看 一共监视了多少家的ktv
  20. List<String> ktvs = zk.getChildren(ROOT, true);
  21. System.out.println(Arrays.toString(ktvs.toArray()));
  22. for(String node : ktvs){
  23. // 删除节点
  24. zk.delete(ROOT+"/"+node,-1);
  25. }
  26. // 根目录得最后删除的
  27. zk.delete(ROOT, -1);
  28. zk.close();
  29. }
    // 根节点
public static final String ROOT = "/root-ktv"; public static void main(String[] args) throws Exception {
// 创建一个与服务器的连接
ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
System.out.println("状态:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
}
});
// 创建一个总的目录ktv,并不控制权限,这里需要用持久化节点,不然下面的节点创建容易出错
zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 然后杭州开一个KTV , PERSISTENT_SEQUENTIAL 类型会自动加上 0000000000 自增的后缀
zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); // 也可以在北京开一个, EPHEMERAL session 过期了就会自动删除
zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); // 同理,我可以在北京开多个,EPHEMERAL_SEQUENTIAL session 过期自动删除,也会加数字的后缀
zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); // 我们也可以 来看看 一共监视了多少家的ktv
List<String> ktvs = zk.getChildren(ROOT, true);
System.out.println(Arrays.toString(ktvs.toArray()));
for(String node : ktvs){
// 删除节点
zk.delete(ROOT+"/"+node,-1);
}
// 根目录得最后删除的
zk.delete(ROOT, -1);
zk.close();
}

zookeeper 的结构图和其他的一些功能,可参考:                                                                                         http://www.blogjava.net/shenh062326/archive/2011/10/29/zookeeper_yuling.html

三、zookeeper 伪集群

上面栗子我们看到,如果我们的监控室也停电了,那不是就监测不到KTV情况了?一般情况下,zk 也是作为分布式部署了,也就是有多台监控,由于监控多了,肯定要有一定为准(比如直播会有一些延迟),就要涉及到选举的算法,这里暂时不介绍,先搭建一个伪集群,因为机器不够,只能再一台机器上模拟搭建,整个过程无非是将上面的一些配置copy 几份,然后配置不同的 地址和端口就行。

3.1  我们将F:\zookeeper-3.4.6\conf\下的zoo.cfg 改成zoo1.cfg,内容改为:

  1. # 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
  2. # 每一个文件路径和下面的对应,zk1 zk2 zk3
  3. dataDir=F:\\zk\\tmp\\zk1
  4. # 错误日志的存放位置
  5. dataLogDir=F:\\zk\\logs\\zk1
  6. # ZK 服务器端的监听端口
  7. # 对应分别:2181  2182  2183
  8. clientPort=2181
  9. # 伪集群
  10. #2887 是server 之间通讯的,3887 是应用程序通讯的
  11. # 同时加入其他两个服务的地址和端口信息
  12. server.1=127.0.0.1:2887:3887
  13. server.2=127.0.0.1:2888:3888
  14. server.3=127.0.0.1:2889:3889
  15. # 最后在钱文件目录下创建3份,zoo1.cfg,zoo2.cfg,zoo3,cfg 记得改参数
# 存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
# 每一个文件路径和下面的对应,zk1 zk2 zk3
dataDir=F:\\zk\\tmp\\zk1
# 错误日志的存放位置
dataLogDir=F:\\zk\\logs\\zk1 # ZK 服务器端的监听端口
# 对应分别:2181 2182 2183
clientPort=2181
# 伪集群
#2887 是server 之间通讯的,3887 是应用程序通讯的
# 同时加入其他两个服务的地址和端口信息
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
# 最后在钱文件目录下创建3份,zoo1.cfg,zoo2.cfg,zoo3,cfg 记得改参数

3.2 同时我们将F:\zookeeper-3.4.6\bin\下的 zkServer.cmd 改为zkServer1.cmd,内容加上:

  1. set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
  2. # 读取配置的路径,每个启动服务对应一份
  3. set ZOOCFG=..\conf\zoo1.cfg
  4. # 同理创建3个zkServer1.cmd,zkServer2.cmd,zkServer3.cmd  记得改zoo 1 2 3.cfg
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
# 读取配置的路径,每个启动服务对应一份
set ZOOCFG=..\conf\zoo1.cfg
# 同理创建3个zkServer1.cmd,zkServer2.cmd,zkServer3.cmd 记得改zoo 1 2 3.cfg

3.3 还得在dataDir 指定目录,也就是F:\\zk\\tmp\\zk1 下创建myid 的文件,内容对应1 2 3 即可。

这个的数字是唯一的,在1-255 之间,用来表示自身的id(其实我不明白 为啥zk 要这么设计- -!)

3.4 启动3个zkServer1.cmd 就OK了,如果要多服务器配置,只需要要将 3份分开放到不同服务器就OK

依次启动的时刻有错误信息,因为你启动server1 的时候 2 和 3 没找到,但是后面都启动了 就没问题了。

小结:

1.zookeeper  现在大家都用得比较多,这里也是仅仅介绍下入门知识,linux 上安装区别不打,还是得看具体应用。

2.关于选举、一致性 和一些其他的东西,慢慢再写!

3.有错误,请指出哦~。~ 感激。

zookeeper windows 入门安装和测试的更多相关文章

  1. NodeJs在windows上安装配置测试

    Node.js简介简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个 ...

  2. windows x64安装与测试redis

    说明:安装与测试的系统为windows X64: 1.下载redis:https://github.com/microsoftarchive/redis/releases 2.解压Redis-x64- ...

  3. Python在Windows上安装配置测试

    Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的. 2.x还是3.x 目前,Python ...

  4. Memcached(一)在Windows上安装和测试memcached

    1)下载memcached的windows安装程序 memcached-1.2.4-Win32-Preview-20080309_bin.zip 或其他版本 2)解压memcached  用管理员身份 ...

  5. windows下安装oracle11g测试是否成功与监听器问题和网页控制台登录

    测试步骤1:请执行操作系统级的命令:tnsping orcl 测试步骤 2:请执行操作系统级的命令:sqlplus system/password@orcl 安装完oracle后要启动oracle服务 ...

  6. Zookeeper windows环境安装

    环境要求:必须要有jdk环境,我自己是使用的 jdk1.8 1.安装jdk 2.安装Zookeeper. 在官网http://zookeeper.apache.org/下载zookeeper.我下载的 ...

  7. FFmpeg Windows下安装与测试

    FFmpeg 简介 FFmpeg的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward",FFmpeg是一套可以用来记录.转换数字音频.视 ...

  8. ZooKeeper介绍,安装,配置文件解析

    什么是ZooKeeper? ZooKeeper是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务. 所有这些类型的服务都以分布式应用程序以某种形式或另一种形式使用.每次实施时,都有很多工 ...

  9. Windows环境安装MySQL数据库

    Windows环境安装MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Java语言,开发环境在Windows操作系统上,因此需要在Windows上安装My ...

随机推荐

  1. Linux内核循环链表经典分析和移植

    为什么说这个链表做的经典呢,哥哥我从Linux内核里边儿扣出来的,要么怎么说内核不是一般人能写的,这代码太TM优美了! 这里有一篇参考文章:http://isis.poly.edu/kulesh/st ...

  2. C#对HTML文档的解析

    http://www.2cto.com/kf/201312/268777.html http://jingyan.baidu.com/article/7e44095334bb162fc0e2efad. ...

  3. 【JavaScript】JS_Object跟Function的区别

    JS_Object和Function的区别 我们本次的解释,主要通过下图 粗看该图,估计你不一定能看明白.不过接下来让我逐行向你解释. 最左侧:意思是,有两个对象f1和f2,他们是通过new Foo( ...

  4. lua练手基础

    lua的库文件地址: http://luaforge.net/projects/lua官网 http://lua.org --[[ print string. multiple line commen ...

  5. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  6. [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统

    [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统 试题描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录 ...

  7. SMTP协议--在cmd下利用bat命令行发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 选择‘开始’-‘运行’,输入cmd,进入命令提示符窗口. Windows7默认没有开始Telnet服务,请在运 ...

  8. hiho #1326 : 有序01字符串

    #1326 : 有序01字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0.那么,你最少需要修改 ...

  9. OpenGL基础图形的绘制

    例一:绘制五角星 设五角星5个顶点分别为ABCDE,顶点到坐标轴原点距离为r,ABCDE各点用r表示,分别为 A(0,r); B(-r*sin(2/5*Pi),r*cos(2/5*Pi)); C(-r ...

  10. Android 数据存储之 SQLite数据库存储

    ----------------------------------------SQLite数据库---------------------------------------------- SQLi ...