Window下Zookeeper的安装:

    本文介绍的 Zookeeper 是以 3.4.8 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单,下面将从单机模式和集

群模式两个方面介绍 Zookeeper 的Windows安装和配置.

    首先需要安装JdK,从Oracle的Java网站下载,安装很简单,下面Linux会详述。

A. 单机模式:

   单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:  E:\web-server\Zookeeper\zookeeper-3.4.8 下,Zookeeper 的启动脚本在 bin 目录下,Windows 下的启动脚本是 zkServer.cmd。

   在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。下面会详细介绍一下配置文件中各个配置项的意义。当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过 netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。

B.伪集群模式:

    所谓 “伪分布式集群” 就是在,在一台PC中,启动多个ZooKeeper的实例。“完全分布式集群” 是每台PC,启动一个ZooKeeper实例,只是单纯的IP地址信息的改变,伪分布式的IP只是本机IP;  Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。

   主要配置的选项:

  • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • dataLogDir:顾名思义就是 Zookeeper 保存日志文件的目录
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
  • dataDir:数据文件目录 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
  • dataLogDir:Zookeeper保存日志文件的目录。
  • 集群模式除了上面的三个配置项还要增加下面几个配置项:
# ****************************** 集群配置*****************************************************************#
# 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
server.1=192.168.1.201:2888:3888
server.2=192.168.1.201:2889:3889
server.3=192.168.1.201:2890:3890       
 

C.集群模式

   集群模式跟上述的伪分布式模式的配置相同,只是

Zookeeper配置详解:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"># The number of milliseconds of each tick  
  2. # CS通信心跳数 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。  
  3. tickTime=2000  
  4. # The number of ticks that the initial  
  5. # synchronization phase can take  
  6. # LF初始通信时限 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。  
  7. initLimit=10ad  
  8. # The number of ticks that can pass between  
  9. # sending a request and getting an acknowledgement  
  10. # LF同步通信时限 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。  
  11. syncLimit=5  
  12. # the directory where the snapshot is stored.  
  13. # do not use /tmp for storage, /tmp here is just  
  14. # example sakes.  
  15. # 数据文件目录 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。  
  16. dataDir=E:/web-server/Zookeeper/data/  
  17.    
  18. # Zookeeper保存日志文件的目录。  
  19. dataLogDir=E:/web-server/Zookeeper/log/   
  20.    
  21. # the port at which the clients will connect  
  22. # 客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。  
  23. clientPort=2181  
  24.    
  25. # ****************************** 集群配置*****************************************************************#  
  26. # 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)  
  27. #server.id=host:port:port 该参数没有默认值,单机模式下可以不配置,不支持系统属性方式的配置。  
  28. #该参数用于配置组成Zookeeper集群机器的列表,其中ID即为ServerID ,与每台服务器myID文件中的数字想对应,第一个端口指定Follower服务器与Leader进行运行时通讯与数据同步时所使用的端口  
  29. #第二个端口则专门用于进行Leader选择过程中投票通信,在Zookeeper服务器启动的时候,其会根据myid文件中配置的ServerID来确定自己是那台服务器,并使用对应的端口来启动。  
  30. #server.N=YYY:A:B   
  31. #非伪集群的例子  
  32. #server.0=233.34.9.144:2008:6008   
  33. #server.1=233.34.9.145:2008:6008   
  34. #server.2=233.34.9.146:2008:6008   
  35. #server.3=233.34.9.147:2008:6008   
  36. #伪集群  
  37. #server.0=127.0.0.1:2008:6008   
  38. #server.1=127.0.0.1:2007:6008   
  39. #server.2=127.0.0.1:2006:6008    
  40. # ***********************************************************************************************#  
  41.    
  42. # the maximum number of client connections.  
  43. # increase this if you need to handle more clients  
  44. #这个操作将限制连接到 ZooKeeper 的客户端的数量,限制并发连接的数量,它通过 IP 来区分不同的客户端。此配置选项可以用来阻止某些类别的 Dos 攻击。将它设置为 0 或者忽略而不进行设置将会取消对并发连接的限制。  
  45. #maxClientCnxns=60  
  46. #  
  47. # Be sure to read the maintenance section of the  
  48. # administrator guide before turning on autopurge.  
  49. #  
  50. #http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance  
  51. #  
  52. # The number of snapshots to retain in dataDir  
  53. #这个参数和下面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个  
  54. #autopurge.snapRetainCount=3  
  55. # Purge task interval in hours  
  56. # Set to "0" to disable auto purge feature  
  57. #ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。  
  58. #autopurge.purgeInterval=1</span>  


Linux下的伪分布安装

 第一步:下载JDK并准备工作

wget : http://download.oracle.com/otn-pub/java/jdk/6u33-b04/jre-6u33-linux-x64.bin

                 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

   查看Linux自带的JDK是否已安装(卸载centOS已安装的)

   安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息:

  java version "1.6.0"

   OpenJDK Runtime Environment (build1.6.0-b09)

   OpenJDK 64-Bit Server VM (build1.6.0-b09, mixed mode)

最好还是先卸载掉openjdk,在安装sun公司的jdk.

先查看 rpm -qa| grep java

显示如下信息:

java-1.4.2-gcj-compat-1.4.2.0-40jpp.115

java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5

卸载:

rpm -e --nodepsjava-1.4.2-gcj-compat-1.4.2.0-40jpp.115

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5

还有一些其他的命令

rpm -qa| grep gcj

rpm -qa| grep jdk

如果出现找不到openjdksource的话,那么还可以这样卸载

yum -y remove java java-1.4.2-gcj-compat-1.4.2.0-40jpp.115

yum -y remove java java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5

 

 nameserver 218.85.157.99

<1># rpm-qa|grep jdk ←查看jdk的信息或直接执行 

或 

# rpm -q jdk 

或 

# java -version 

<2># rpm -qa | grep gcj ← 确认gcj的版本号 

<3># yum -y remove java-1.4.2-gcj-compat ← 卸载gcj 


第二步:安装JDK 

<1>从SUN下载jdk-1_5_0_14-linux-i586-rpm.bin或jdk-1_5_0_14-linux-i586.bin 

在/usr下新建java文件夹,将安装包放在opt目录下 

# mkdir opt 

<2>安装JDK 

# cd / opt  

①jdk-1_5_0_14-linux-i586-rpm.bin文件安装 

# chmod 777 jdk-1_5_0_14-linux-i586-rpm.bin ← 修改为可执行 

# ./jdk-1_5_0_14-linux-i586-rpm.bin ← 选择yes同意上面的协议 

# rpm -ivh jdk-1_5_0_14-linux-i586.rpm ← 选择yes直到安装完毕 

②jdk-1_5_0_14-linux-i586.bin文件安装 

# chmod a+x jdk-1_5_0_14-linux-i586.bin ← 使当前用户拥有执行权限 

# ./jdk-1_5_0_14-linux-i586.bin ← 选择yes直到安装完毕 


第三步:配置环境变量 

<1># vi /etc/profile 

<2>在最后加入以下几行: 

  1.查询jdk安装在那个目录下

  echo $JAVA_HOME

  echo $PATH

  2.通过vi /etc/profile 进行编辑

  ESC:退出 :wq 退出保存;a,进入insert模式;

  export JAVA_HOME=/usr/java/jdk1.6.0_45

  exportPATH=$PATH:${JAVA_HOME}/bin

<3>#

  source /etc/profile  <----配置文件立即生效

reboot ← 重启机器配置生效        

 第二步:下载并配置Zookeeper

  本次安装实例假设启动3个ZooKeeper的实例。

  创建环境目录

~ mkdir /home/server/zookeeper/zk1
~ mkdir /home/server/zookeeper/zk2
~ mkdir /home/server/zookeeper/zk3

 新建myid文件

~ echo "1" > /home/server/zookeeper/zk1/myid
~ echo "2" > /home/server/zookeeper/zk2/myid
~ echo "3" > /home/server/zookeeper/zk3/myid
 

 拷贝配置文件

    生成三个配置文件:zoo-1.cfg: (另外两个zoo-2.cfg 和zoo-3.cfg)。zoo-slave1.cfg需要为dataDir和dataLogDir设置目录,
  改动内容如下:修改:dataDir,clientPort
  增加:集群的实例,server.X,”X”表示每个目录中的myid的值
   
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.   
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ~ vi /home/server/zookeeper3.4.8/conf/zoo-1.cfg  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. tickTime=2000  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. initLimit=10  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. syncLimit=5  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. dataDir=/home/server/zookeeper/zk1  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. clientPort=2181  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.1=192.168.1.201:2888:3888  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.2=192.168.1.201:2889:3889  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.3=192.168.1.201:2890:3890  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.   
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ~ vi /home/server/zookeeper3.4.8/conf/zoo-2.cfg  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. tickTime=2000  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. initLimit=10  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. syncLimit=5  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. dataDir=/home/server/zookeeper/zk2  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. clientPort=2182  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.1=192.168.1.201:2888:3888  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.2=192.168.1.201:2889:3889  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.3=192.168.1.201:2890:3890  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.   
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ~ vi /home/server/zookeeper3.4.8/conf/zoo-3.cfg  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. tickTime=2000  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. initLimit=10  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. syncLimit=5  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. dataDir=/home/server/zookeeper/zk3  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. clientPort=2182  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.1=192.168.1.201:2888:3888  
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. server.2=192.168.1.201:2889:3889  

  
  
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">server.3=192.168.1.201:2890:3890</span>  

       3个节点的ZooKeeper集群配置完成,接下来我们的启动服务。

 启动集群

~ /home/server/zookeeper3.4.8/bin/zkServer.sh start zoo-1.cfg
~ /home/server/zookeeper3.4.8/bin/zkServer.sh start zoo-2.cfg
~ /home/server/zookeeper3.4.8/bin/zkServer.sh start zoo-3.cfg
 
~ jps
5422 QuorumPeerMain
5395 QuorumPeerMain
5463 QuorumPeerMain
5494 Jps
 

 查看节点状态

~ /home/server/zookeeper3.4.8/bin/zkServer.sh status zoo-1.cfg JMX enabled by default
Using config: /home/server/zookeeper3.4.8/bin/bin/../conf/ zoo-1.cfg
Mode: follower
 
~ /home/server/zookeeper3.4.8/bin/zkServer.sh status zk2.cfg
JMX enabled by default
Using config: /home/server/zookeeper3.4.8/bin/../conf/ zoo-2.cfg
Mode: leader
 
~ /home/server/zookeeper3.4.8/bin/zkServer.sh status zk3.cfg
JMX enabled by default
Using config: /home/server/zookeeper3.4.8/bin/../conf/ zoo-3.cfg 
Mode: follower

 

我们可以看到zk2是leader,zk1和zk3是follower

 

 查看ZooKeeper物理文件目录结构

~ tree  -L 3 /home/server/zookeeper
/home/server/zookeeper
├── zk0
├── zk1
   ├── myid
   ├── version-2
     ├── acceptedEpoch
     ├── currentEpoch
     ├── log.100000001
     └── snapshot.0
   └── zookeeper_server.pid
├── zk2
   ├── myid
   ├── version-2
     ├── acceptedEpoch
     ├── currentEpoch
     ├── log.100000001
     └── snapshot.0
   └── zookeeper_server.pid
└── zk3
    ├── myid
    ├── version-2
    │   ├── acceptedEpoch
    │   ├── currentEpoch
    │   ├── log.100000001
    │   └── snapshot.100000000
    └── zookeeper_server.pid

 zookeeper命令行操作

常用命令

4.1. 启动ZK服务:   bin/zkServer.sh start

4.2. 查看ZK服务状态: bin/zkServer.sh status

4.3  停止ZK服务:    bin/zkServer.shstop

4.4. 重启ZK服务:   bin/zkServer.sh restart 

4.5  连接服务器     zkCli.sh-server 127.0.0.1:2181

4.6  查看根目录 ls /

4.7  创建 testnode节点,关联字符串"zz" create /zk/testnode"zz"

4.8  查看节点内容  get/zk/testnode 

4.9  设置节点内容  set/zk/testnode abc

4.0  删除节点      delete /zk/testnode

 

  我们通过客户端连接ZooKeeper的集群,我们可以任意的zookeeper是进行连接。

   ~ /home/server/zookeeper3.4.8/bin/zkCli.sh -server 192.168.1.201:2181
 
#ls,查看/目录内容
[zk: 192.168.1.201(CONNECTED) 1] ls /
[zookeeper]
 
#create,创建一个znode节点
[zk: 192.168.1.201(CONNECTED) 2] create /node conan
Created /node
 
#ls,再查看/目录
[zk: 192.168.1.201(CONNECTED) 3] ls /
[node, zookeeper]
 
#get,查看/node的数据信息
[zk: 192.168.1.201(CONNECTED) 4] get /node
conan
cZxid = 0x100000006
ctime = Mon Aug 12 05:32:49 CST 2013
mZxid = 0x100000006
mtime = Mon Aug 12 05:32:49 CST 2013
pZxid = 0x100000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
 
#set,修改数据
[zk: 192.168.1.201(CONNECTED) 5] set /node fens.me
cZxid = 0x100000006
ctime = Mon Aug 12 05:32:49 CST 2013
mZxid = 0x100000007
mtime = Mon Aug 12 05:34:32 CST 2013
pZxid = 0x100000006
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
 
#get,再查看/node的数据信息,已改为fens.me
[zk: 192.168.1.201(CONNECTED) 6] get /node
fens.me
cZxid = 0x100000006
ctime = Mon Aug 12 05:32:49 CST 2013
mZxid = 0x100000007
mtime = Mon Aug 12 05:34:32 CST 2013
pZxid = 0x100000006
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
 
#delete,删除/node
[zk: 192.168.1.201(CONNECTED) 7] delete /node
[zk: 192.168.1.201(CONNECTED) 8] ls /
[zookeeper]
 
#quit,退出客户端连接
[zk: 192.168.1.201(CONNECTED) 19] quit
Quitting...
2013-08-12 05:40:29,304 [myid:] - INFO  [main:ZooKeeper@684] - Session: 0x1406f3c1ef90002 closed
2013-08-12 05:40:29,305 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@509] - EventThread shut down

Java编程现实命令行操作

  基础的Zookeeper客户端API实例,实现的方式有Zookeeper API、zkclient API、curatorAPI 实例练习

源码地址:http://git.oschina.net/gz-tony/Zookeeper

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐