ZooKeeper的安装与部署html
ZooKeeper支持的运行平台java
ZooKeeper能够运行在多种系统平台上面,上表展现了zk支持的系统平台,以及在该平台上是否支持开发环境或者生产环境。linux
系统apache |
开发环境vim |
生产环境服务器 |
Linux网络 |
支持session |
支持app |
Solarissocket |
支持 |
支持 |
FreeBSD |
支持 |
支持 |
Windows |
支持 |
不支持 |
MacOS |
支持 |
不支持 |
ZooKeeper是用Java编写的,运行在Java环境上,所以,在部署zk的机器上须要安装Java运行环境。为了正常运行zk,咱们须要JRE1.6或者以上的版本。
对于集群模式下的ZooKeeper部署,3个ZooKeeper服务进程是建议的最小进程数量,并且不一样的服务进程建议部署在不一样的物理机器上面,以减小机器宕机带来的风险,以实现ZooKeeper集群的高可用。
ZooKeeper对于机器的硬件配置没有太大的要求。例如,在Yahoo!内部,ZooKeeper部署的机器其配置一般以下:双核处理器,2GB内存,80GB硬盘。
能够从 https://zookeeper.apache.org/releases.html 下载ZooKeeper,目前最新的稳定版本为 3.4.8 版本,用户能够自行选择一个速度较快的镜像来下载便可
[root@xuegod42 ~]# tar xf zookeeper-3.4.8.tar.gz -C /usr/local/src/
下载并解压ZooKeeper软件压缩包后,能够看到zk包含如下的文件和目录
[root@xuegod42 ~]# ls /usr/local/src/zookeeper-3.4.8/
bin contrib ivy.xml README_packaging.txt zookeeper-3.4.8.jar
build.xml dist-maven lib README.txt zookeeper-3.4.8.jar.asc
CHANGES.txt docs LICENSE.txt recipes zookeeper-3.4.8.jar.md5
conf ivysettings.xml NOTICE.txt src zookeeper-3.4.8.jar.sha1
bin目录 : zk的可执行脚本目录,包括zk服务进程,zk客户端,等脚本。其中,.sh是Linux环境下的脚本,.cmd是Windows环境下的脚本。
conf目录 : 配置文件目录。zoo_sample.cfg为样例配置文件,须要修改成本身的名称,通常为zoo.cfg。log4j.properties为日志配置文件。
lib :zk依赖的包。
contrib目录 : 一些用于操做zk的工具包。
recipes目录 : zk某些用法的代码示例
ZooKeeper的安装包括单机模式安装,以及集群模式安装。
单机模式较简单,是指只部署一个zk进程,客户端直接与该zk进程进行通讯。
在开发测试环境下,经过来讲没有较多的物理资源,所以咱们常使用单机模式。固然在单台物理机上也能够部署集群模式,但这会增长单台物理机的资源消耗。故在开发环境中,咱们通常使用单机模式。
可是要注意,生产环境下不可用单机模式,这是因为不管从系统可靠性仍是读写性能,单机模式都不能知足生产的需求。
[root@xuegod42 ~]# rpm -ivh jdk-8u60-linux-x64.rpm
配置环境变量
[root@xuegod42 ~]# vim /etc/profile #添加以下配置
export JAVA_HOME=/usr/java/jdk1.8.0_60
export JAVA_BIN=/usr/java/jdk1.8.0_60/bin
export PATH=${JAVA_HOME}bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib.dt.jar:${JAVA_HOME}/lib/tools.jar
[root@xuegod42 ~]# source /etc/profile
[root@xuegod42 ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
[root@xuegod42 ~]# scp /etc/profile root@192.168.10.43:/etc/
上面提到,conf目录下提供了配置的样例zoo_sample.cfg,要将zk运行起来,须要将其名称修改成zoo.cfg。
打开zoo.cfg,能够看到默认的一些配置。
[root@xuegod42 conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg
[root@xuegod42 conf]# mv zoo_sample.cfg zoo.cfg
[root@xuegod42 conf]# vim zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
[root@xuegod42 ~]# mv /usr/local/src/zookeeper-3.4.8/ /usr/local/
[root@xuegod42 ~]# mv /usr/local/zookeeper-3.4.8/ /usr/local/zookeeper
在Windows环境下,直接双击zkServer.cmd便可。在Linux环境下,进入bin目录,执行命令
[root@xuegod42 bin]# ./zkServer.sh start
这个命令使得zk服务进程在后台进行。
若是想在前台中运行以便查看服务器进程的输出日志,能够经过如下命令运行:
./zkServer.sh start-foreground
执行此命令,能够看到大量详细信息的输出,以便容许查看服务器发生了什么。
使用文本编辑器打开zkServer.cmd或者zkServer.sh文件,能够看到其会调用zkEnv.cmd或者zkEnv.sh脚本。zkEnv脚本的做用是设置zk运行的一些环境变量,例如配置文件的位置和名称等。
若是是链接同一台主机上的zk进程,那么直接运行bin/目录下的zkCli.cmd(Windows环境下)或者zkCli.sh(Linux环境下),便可链接上zk。
直接执行zkCli.cmd或者zkCli.sh命令默认以主机号 127.0.0.1,端口号 2181 来链接zk,若是要链接不一样机器上的zk,可使用 -server 参数,例如:
[root@xuegod42 zookeeper]# ./bin/zkCli.sh -server 127.0.0.1:2181
单机模式的zk进程虽然便于开发与测试,但并不适合在生产环境使用。在生产环境下,咱们须要使用集群模式来对zk进行部署。
注意:
在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。若是只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。所以,部署2个进程甚至比单机模式更不可靠,由于2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。
在集群模式下,全部的zk进程可使用相同的配置文件(是指各个zk进程部署在不一样的机器上面),例如以下配置:
tickTime=2000
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.10.42:2888:3888
server.2=192.168.10.43:2888:3888
server.3=192.168.10.44:2888:3888
注意:
若是仅为了测试部署集群模式而在同一台机器上部署zk进程,server.id=host:port1:port2配置中的port参数必须不一样。可是,为了减小机器宕机的风险,强烈建议在部署集群模式时,将zk进程部署不一样的物理机器上面。
假如咱们打算在三台不一样的机器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一个zk进程,以构成一个zk集群。
三个zk进程均使用相同的 zoo.cfg 配置:
tickTime=2000
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
initLimit=5
syncLimit=2
server.1=192.168.10.42:2888:3888
server.2=192.168.10.43:2888:3888
server.3=192.168.10.44:2888:3888
在三台机器dataDir目录( /home/myname/zookeeper 目录)下,分别生成一个myid文件,其内容分别为1,2,3。而后分别在这三台机器上启动zk进程,这样咱们便将zk集群启动了起来。
[root@xuegod42 data]# cat myid
1
[root@xuegod43 data]# cat myid
2
[root@xuegod44 data]# cat myid
3
可使用如下命令来链接一个zk集群:
bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181
成功链接后,能够看到以下输出:
2016-06-28 19:29:18,074 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4
Welcome to ZooKeeper!
2016-06-28 19:29:18,146 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2016-06-28 19:29:18,161 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session
2016-06-28 19:29:18,199 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0]
图2:客户端链接zk集群的输出日志
从日志输出能够看到,客户端链接的是192.168.229.162:2181进程(链接上哪台机器的zk进程是随机的),客户端已成功链接上zk集群。
所谓伪集群, 是指在单台机器中启动多个zookeeper进程, 并组成一个集群. 以启动3个zookeeper进程为例.
将zookeeper的目录拷贝2份:
Bash代码
更改zookeeper0/conf/zoo.cfg文件为:
Bash代码
新增了几个参数, 其含义以下:
参照zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg, 和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort参数便可.
在以前设置的dataDir中新建myid文件, 写入一个数字, 该数字表示这是第几号server. 该数字必须和zoo.cfg文件中的server.X中的X一一对应.
/Users/apple/zookeeper0/data/myid文件中写入0, /Users/apple/zookeeper1/data/myid文件中写入1, /Users/apple/zookeeper2/data/myid文件中写入2.
分别进入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三个目录, 启动server.
任意选择一个server目录, 启动客户端:
Bash代码
参考资料:
1.http://blog.csdn.net/lihao21/article/details/51778255
2.http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
3.http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html
4.《ZooKeeper分布式系统开发实战》课程,主讲人:玺感
5.《ZooKeeper分布式过程协同技术详解》,Flavio Junqueira等著,谢超等译
6.百度百科有关quorum的解释,http://baike.baidu.com/link?url=pqWrzgH-_VhMLnscR1iRTpPjovfyhxG-8Qs9HxGutiGi5bhnA_lX_pmabLQ-3MiDeigcHRFMYSbFg90RAYVAta
7.《Zookeeper 安装和配置》,http://coolxing.iteye.com/blog/1871009