本文介绍的 Zookeeper 是以 3.4.8 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单,下面将从单机模式和集
群模式两个方面介绍 Zookeeper 的Windows安装和配置.
首先需要安装JdK,从Oracle的Java网站下载,安装很简单,下面Linux会详述。
单机安装非常简单,只要获取到 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 端口号在监听服务。
所谓 “伪分布式集群” 就是在,在一台PC中,启动多个ZooKeeper的实例。“完全分布式集群” 是每台PC,启动一个ZooKeeper实例,只是单纯的IP地址信息的改变,伪分布式的IP只是本机IP; 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
集群模式跟上述的伪分布式模式的配置相同,只是
<span style="font-family:KaiTi_GB2312;font-size:18px;"># The number of milliseconds of each tick # CS通信心跳数 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。 tickTime=2000 # The number of ticks that the initial # synchronization phase can take # LF初始通信时限 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。 initLimit=10ad # The number of ticks that can pass between # sending a request and getting an acknowledgement # LF同步通信时限 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。 syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. # 数据文件目录 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。 dataDir=E:/web-server/Zookeeper/data/ # Zookeeper保存日志文件的目录。 dataLogDir=E:/web-server/Zookeeper/log/ # the port at which the clients will connect # 客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。 clientPort=2181 # ****************************** 集群配置*****************************************************************# # 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口) #server.id=host:port:port 该参数没有默认值,单机模式下可以不配置,不支持系统属性方式的配置。 #该参数用于配置组成Zookeeper集群机器的列表,其中ID即为ServerID ,与每台服务器myID文件中的数字想对应,第一个端口指定Follower服务器与Leader进行运行时通讯与数据同步时所使用的端口 #第二个端口则专门用于进行Leader选择过程中投票通信,在Zookeeper服务器启动的时候,其会根据myid文件中配置的ServerID来确定自己是那台服务器,并使用对应的端口来启动。 #server.N=YYY:A:B #非伪集群的例子 #server.0=233.34.9.144:2008:6008 #server.1=233.34.9.145:2008:6008 #server.2=233.34.9.146:2008:6008 #server.3=233.34.9.147:2008:6008 #伪集群 #server.0=127.0.0.1:2008:6008 #server.1=127.0.0.1:2007:6008 #server.2=127.0.0.1:2006:6008 # ***********************************************************************************************# # the maximum number of client connections. # increase this if you need to handle more clients #这个操作将限制连接到 ZooKeeper 的客户端的数量,限制并发连接的数量,它通过 IP 来区分不同的客户端。此配置选项可以用来阻止某些类别的 Dos 攻击。将它设置为 0 或者忽略而不进行设置将会取消对并发连接的限制。 #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # #http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #这个参数和下面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个 #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。 #autopurge.purgeInterval=1</span>
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 ← 重启机器配置生效
本次安装实例假设启动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的值
~ vi /home/server/zookeeper3.4.8/conf/zoo-1.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/home/server/zookeeper/zk1clientPort=2181server.1=192.168.1.201:2888:3888server.2=192.168.1.201:2889:3889server.3=192.168.1.201:2890:3890~ vi /home/server/zookeeper3.4.8/conf/zoo-2.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/home/server/zookeeper/zk2clientPort=2182server.1=192.168.1.201:2888:3888server.2=192.168.1.201:2889:3889server.3=192.168.1.201:2890:3890~ vi /home/server/zookeeper3.4.8/conf/zoo-3.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/home/server/zookeeper/zk3clientPort=2182server.1=192.168.1.201:2888:3888server.2=192.168.1.201:2889:3889<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
~ 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
常用命令
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
基础的Zookeeper客户端API实例,实现的方式有Zookeeper API、zkclient API、curatorAPI 实例练习
源码地址:http://git.oschina.net/gz-tony/Zookeeper