ZooKeeper JAVA API 之环境准备和创建会话

Zookeeper是一个开放源代码的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的元语集,并以一系列简单易用的接口提供给用户使用。

单机模式部署与运行(Windows)

  1. 确保已经安装了JAVA 1.6及其以上版本的JDK
  2. 下载Zookeeper    http://zookeeper.apache.org/releases.html  目前稳定版本即stable版本为3.4.6。将下载完成的压缩包解压到%ZK_HOME%下,其中ZK_HOME 目录可以随意设定,如:D://programes 等
  3. 配置文件 zoo.cfg ,单机模式下,只需要将%ZK_HOME%/conf/zoo_sample.cfg文件重命名即可
  4. 启动服务,在%ZK_HOME%bin目录下执行zkServer.cmd即可启动zookeeper服务器

Zookeeper 可执行脚本说明

  1. zkCleanup  清理ZooKeeper历史数据,包括事务日志和快照文件
  2. zkCli  ZooKeeper的一个建议客户端
  3. zkEnv  设置ZooKeeper的环境变量
  4. zkServer  ZooKeeper服务器的启动、停止和重启脚本

创建会话

       客户端可以通过创建一个ZooKeeper实例来连接ZooKeeper服务器。该类中的注释这样写道:

ZooKeeper类是ZooKeeper客户端库的主类。要使用ZooKeeper服务,应用程序首先必须要实现一个ZooKeeper的实例。所有的迭代都将通过调用ZooKeeper类的方法来完成。这个类的方法都是线程安全的除非另有说明。
 一旦一个与服务器的连接被建立,会分配给客户端一个Session ID. 客户端会周期性地发送心跳到服务器端,以保持会话有效。
 只要Session ID 有效,应用程序都可以通过客户端调用ZooKeeper的 API
  如果因为某些原因,导致客户端未能在指定的时间段内(超过SessionTimeout的值)发送心跳到服务器端,则该会话将过期,Session ID 将失效。
  如果客户端对象不可用,为了调用ZooKeeper API,应用程序必须创建一个新的客户端

ZooKeeper的构造方法有:

ZooKeeper(String connectString,int sessionTimeout,Watcher watcher)

ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,boolean canBeReadOnly)

ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,boolean canBeReadOnly)

ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd, boolean canBeReadOnly)

connectString 是指ZooKeeper服务器的列表,host:prot,host:port 这样的格式构成,即主机:端口号通过英文逗号分隔。当然如果是单击模式下只需要一个;

sessionTimeout 值会话的超时时间,单位是毫秒

watcher Watcher事件的处理器,如果设置为null,表示不需要默认的Watcher事件处理器

canBeReadOnly 用于表示当前会话是否支持 read-only

sessionId,sessionPasswd 分别代表 会话的Id和密钥。这两个参数可以唯一确定一个会话。可以通过ZooKeeper 实例调用 getSesssionId()和getSessionPasswd()方法获取。

Java代码  

  1. /**
  2. *创建一个最基本的ZooKeeper会话示例
  3. * @author zhangwei_david
  4. * @version $Id: ZKConstructorDemo.java, v 0.1 2015年5月1日 下午5:55:21 zhangwei_david Exp $
  5. */
  6. public class ZKConstructorDemo implements Watcher {
  7. private static CountDownLatch connectedSemphore = new CountDownLatch(1);
  8. public static void main(String[] args) throws Exception {
  9. //创建Zookeeper会话实例
  10. ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181", 5000, new ZKConstructorDemo());
  11. // 输出当前会话的状态
  12. System.out.println("zk客户端的状态是:" + zookeeper.getState());
  13. System.out.println("zk 客户端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"
  14. + new String(zookeeper.getSessionPasswd()));
  15. try {
  16. // 当前闭锁在为0之前一直等待,除非线程中断
  17. connectedSemphore.await();
  18. } catch (Exception e) {
  19. System.out.println("Zookeeper session established");
  20. }
  21. }
  22. /**
  23. * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent)
  24. */
  25. public void process(WatchedEvent event) {
  26. System.out.println("Receive watched event:" + event);
  27. //如果客户端已经处于连接状态闭锁减去1
  28. if (KeeperState.SyncConnected == event.getState()) {
  29. connectedSemphore.countDown();
  30. }
  31. }
  32. }

结果:

Java代码  

  1. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
  2. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:host.name=David
  3. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.version=1.8.0
  4. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.io.tmpdir=C:\Users\Lenovo\AppData\Local\Temp\
  5. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.compiler=<NA>
  6. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.name=Windows 8.1
  7. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.arch=x86
  8. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.version=6.3
  9. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.name=Lenovo
  10. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.home=C:\Users\Lenovo
  11. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.dir=H:\Alipay.com\workspace4alipay\demo
  12. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorDemo@1e717c2
  13. zk客户端的状态是:CONNECTING
  14. zk 客户端的sessionId=0,  sessionPasswd是:

Java代码  

  1. **
  2. *使用SessionId和Sessionpwd创建的ZooKeeper会话示例
  3. @author  zhangwei_david
  4. * @version $Id: ZKConstructorWithIdAndPasswdDemo.java, v 0.1 2015年5月1日 下午5:55:21 zhangwei_david Exp $
  5. */
  6. public class ZKConstructorWithIdAndPasswdDemo implements Watcher {
  7. private static CountDownLatch connectedSemphore = new CountDownLatch(1);
  8. public static void main(String[] args) throws Exception {
  9. //创建Zookeeper会话实例
  10. ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181", 5000,
  11. new ZKConstructorWithIdAndPasswdDemo());
  12. // 输出当前会话的状态
  13. System.out.println("未使用id和密钥创建zk客户端的状态是:" + zookeeper.getState());
  14. long sessionId = zookeeper.getSessionId();
  15. byte[] sessionPasswd = zookeeper.getSessionPasswd();
  16. System.out.println("zk 客户端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"
  17. + new String(zookeeper.getSessionPasswd()));
  18. zookeeper = new ZooKeeper("127.0.0.1:2181", 5000, new ZKConstructorWithIdAndPasswdDemo(),
  19. sessionId, sessionPasswd);
  20. System.out.println("使用id和密钥创建zk客户端的状态是:" + zookeeper.getState());
  21. zookeeper = new ZooKeeper("127.0.0.1:2181", 5000, new ZKConstructorWithIdAndPasswdDemo(),
  22. 1L, "test".getBytes());
  23. System.out.println("使用错误id和密钥创建zk客户端的状态是:" + zookeeper.getState());
  24. try {
  25. // 当前闭锁在为0之前一直等待,除非线程中断
  26. connectedSemphore.await();
  27. } catch (Exception e) {
  28. System.out.println("Zookeeper session established");
  29. }
  30. }
  31. /**
  32. * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent)
  33. */
  34. public void process(WatchedEvent event) {
  35. System.out.println("Receive watched event:" + event);
  36. //如果客户端已经处于连接状态闭锁减去1
  37. if (KeeperState.SyncConnected == event.getState()) {
  38. connectedSemphore.countDown();
  39. }
  40. }
  41. }

结果:

Java代码  

  1. 2015-05-01 19:14:34  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@1e717c2
  2. 未使用id和密钥创建zk客户端的状态是:CONNECTING
  3. zk 客户端的sessionId=0,  sessionPasswd是:
  4. 2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@aa7bc2 sessionId=0 sessionPasswd=<hidden>
  5. 使用id和密钥创建zk客户端的状态是:CONNECTING
  6. 2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@ccd017 sessionId=1 sessionPasswd=<hidden>
  7. 使用错误id和密钥创建zk客户端的状态是:CONNECTING
  8. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  9. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  10. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  11. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
  12. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
  13. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
  14. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70006, negotiated timeout = 5000
  15. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Unable to reconnect to ZooKeeper service, session 0x1 has expired, closing socket connection
  16. Receive watched event:WatchedEvent state:SyncConnected type:None path:null
  17. Receive watched event:WatchedEvent state:Expired type:None path:null
  18. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70007, negotiated timeout = 5000
  19. 2015-05-01 19:14:34  [ main-EventThread:47 ] - [ INFO ]  EventThread shut down
时间: 2024-10-12 13:41:16

ZooKeeper JAVA API 之环境准备和创建会话的相关文章

zookeeper java api

package bjsxt.zookeeper.watcher; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import org.apache.log4j.Logger; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.

笔记:MyBatis 使用 Java API配置

我们已经讨论了各种MyBatis配置元素,如envronments.typeAlias和typeHandlers,以及如何使用XML配置它们.即使你想使用基于JavaAPI的MyBatis配置,MyBatis的SqlSessionFactory接口除了使用基于XML的配置创建外也可以通过Java API 编程式地被创建.每个在XML中配置的元素,都可以编程式的创建.使用Java API创建SqlSessionFactory,代码如下: ? ? ????public?static?SqlSessi

ZooKeeper Java Example

A Simple Watch Client Requirements Program Design The Executor Class The DataMonitor Class Complete Source Listings A Simple Watch Client To introduce you to the ZooKeeper Java API, we develop here a very simple watch client. This ZooKeeper client wa

Java API操作ZooKeeper

创建会话 1 package org.zln.zk; 2 3 import org.apache.zookeeper.WatchedEvent; 4 import org.apache.zookeeper.Watcher; 5 import org.apache.zookeeper.ZooKeeper; 6 7 import java.io.IOException; 8 9 /** 10 * Created by sherry on 16/8/27. 11 */ 12 public class

Zookeeper客户端API之创建节点(七)

本篇博客主要讲一下使用Zookeeper原生的客户API来创建一个数据节点. 创建数据节点方法 Zookeeper提供了两个创建数据节点的方法. 同步创建数据节点方法: public String create(final String path, byte data[], List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException 异步创建数据节点方法: public void crea

Zookeeper客户端API之创建会话(六)

Zookeeper对外提供了一套Java的客户端API.本篇博客主要讲一下创建会话. 创建项目 首选,创建一个基于maven管理的简单java工程.在pom文件中引入zookeeper. <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> </d

使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)

使用Kafka的同学都知道,我们每次创建Kafka主题(Topic)的时候可以指定分区数和副本数等信息,如果将这些属性配置到server.properties文件中,以后调用Java API生成的主题将使用默认值,先改变需要使用命令bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my-topic --config max.message.bytes=128000显示的修改,我们也希望将此过程在Producer调用之前通

HBase 常用java api获得客户端,创建表,查询,删除

1,前期准备 (1) 本文采用的hbase是采用三台服务器搭建的集群,zookeeper也是相同服务器搭建的集群,集群ip分别是192.168.183.101: 192.168.183.102: 192.168.183.103.其中102是主节点(HMaster),101以及103都是HRegionServer (2) 这次测试安装的hbase的版本是 hbase-0.99.2.-bin.tar (3)java api引用的maven依赖路径如下 <dependency> <groupI

Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建

[TOC] Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建 Redis Java API使用(一):单机版本Redis API使用 Redis的Java API通过Jedis来进行操作,因此首先需要Jedis的第三方库,因为使用的是Maven工程,所以先给出Jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactI