ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(DistributedSynchronization)、命名服务(NamingService)、集群维护(GroupMaintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。具体ZooKeeper的介绍还有很多,这边就不一一介绍。
因为工作中需要使用ZooKeeper,因此这边简单介绍下,ZooKeeper的安装。
这边选择的3.4.6版的ZooKeeper,去官网下载
http://www.apache.org/dist/zookeeper/zookeeper-3.4.6/
一、单机安装ZooKeeper
单机配置十分简单,只需要解压缩后,简单配置一下即可以启动ZooKeeper服务器进程。
1、 先解压ZooKeeper,这边设安装路径为$ZOOKEEPER_HOME
2、 进入目录$ZOOKEEPER_HOME/conf生成以下配置文件zoo.cfg(基本内容都来自zoo_sample.cfg)
#配置文件名zoo.cfg
tickTime =2000
dataDir=/usr/local/zookeeper_data
clientPort =2181
initLimit=5
syncLimit=2
其中
tickTime是用来判断心跳与会话超时用的,默认是2秒
dataDir是存放数据的位置
clientPort是客户端侦听端口
下面是启动ZooKeeper服务器进程的命令
$ZOOKEEPER_HOME/bin/zkServer.sh start
JPS命令可以看到QuorumPeerMain这个进程,这个就是ZooKeeper服务器进程。
下面是以客户端形式连接ZooKeeper服务器命令
bin/zkCli.sh -server $HOSTNAME:2181
然后客户端连接信息如下所示:
[hadoop@carl zookeeper-3.4.6]$ bin/zkCli.sh -server carl:2181
Connecting to carl:2181
2014-11-05 16:12:33,925 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
2014-11-05 16:12:33,977 [myid:] - INFO [main:Environment@100] - Client environment:host.name=carl
2014-11-05 16:12:33,978 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_60
2014-11-05 16:12:34,019 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2014-11-05 16:12:34,022 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/local/jdk1.7/jre
2014-11-05 16:12:34,025 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:.:/usr/local/jdk1.7/lib:/usr/local/jdk1.7/jre/lib::/usr/local/zookeeper-3.4.6/lib
2014-11-05 16:12:34,030 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2014-11-05 16:12:34,032 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2014-11-05 16:12:34,034 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2014-11-05 16:12:34,037 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2014-11-05 16:12:34,043 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
2014-11-05 16:12:34,048 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.18-128.el5
2014-11-05 16:12:34,049 [myid:] - INFO [main:Environment@100] - Client environment:user.name=hadoop
2014-11-05 16:12:34,052 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/home/hadoop
2014-11-05 16:12:34,054 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/usr/local/zookeeper-3.4.6
2014-11-05 16:12:34,070 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=carl:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@28e13c84
Welcome to ZooKeeper!
2014-11-05 16:12:35,505 [myid:] - INFO [main-SendThread(carl:2181):ClientCnxn$SendThread@975] - Opening socket connection to server carl/192.168.233.128:2181. Will not attempt to authenticate using SASL (unknown error)
2014-11-05 16:12:35,622 [myid:] - INFO [main-SendThread(carl:2181):ClientCnxn$SendThread@852] - Socket connection established to carl/192.168.233.128:2181, initiating session
JLine support is enabled
2014-11-05 16:12:36,250 [myid:] - INFO [main-SendThread(carl:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server carl/192.168.233.128:2181, sessionid = 0x1497e0e46a10000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
然后进入客户端后用help命令查看基本操作命令。
二、分布式安装ZooKeeper
1、配置IP映射。
在配置的ZooKeeper集群的时候,每一个结点的host到IP地址的映射都要配置上集群中其它结点的映射信息。官网说Zookeeper集群配置至少需要三台,所以这个不也是配置三台。请在每台主机文件/etc/hosts下进行配置
192.168.233.128 carl
192.168.233.129 slave1
192.168.233.130 slave2
2、修改配置文件
因为是集群的配置,因此需要添加内容,我们现在一台主机上进行配置。在$ZOOKEEPER_HOME/conf/zoo.cfg 文件中添加如下内容
#配置文件名zoo.cfg
tickTime=2000
dataDir=/home/hadoop/storage/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=carl:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
其中server.id=host:port:port,id是为每个Zookeeper节点的编号,保存在dataDir目录下的myid文件中,carl、slave1以及slave2表示各个Zookeeper节点的hostname,第一个port是用于连接leader的端口,第二个port是用于leader选举的端口
然后我们把现在配置的整个ZooKeeper目录,复制到其他主机上,这样就可以省略掉配置的步骤。
请敲命令
scp -r zookeeper-3.4.6/ hadoop@slave1:/usr/local/
scp -r zookeeper-3.4.6/ hadoop@slave2:/usr/local/
这里是将本机的Zookeeper文件全部复制到其他台=主机的/usr/local/目录下
3、设置myid
在dataDir目录下创建myid文件,文件中只包含一行,且内容为该节点conf/zoo.cfg文件中配置的server.id中的id编号
[hadoop@carl local]$ echo "1" > /home/hadoop/storage/zookeeper/myid
[hadoop@slave1 local]$ echo "2" > /home/hadoop/storage/zookeeper/myid
[hadoop@slave2 local]$ echo "2" > /home/hadoop/storage/zookeeper/myid
4、启动ZooKeeper集群
在每台主机的$ZOOKEEPER_HOME下面执行集群启动命令
[hadoop@carl zookeeper-3.4.6]$ bin/zkServer.sh start
[hadoop@slave1 zookeeper-3.4.6]$ bin/zkServer.sh start
[hadoop@slave2 zookeeper-3.4.6]$ bin/zkServer.sh start
5、查看启动结果
在每台主机的$ZOOKEEPER_HOME下面执行命令:bin/zkServer.sh status
[hadoop@carl zookeeper-3.4.6]$ bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[hadoop @slave1 zookeeper-3.4.6]# bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[hadoop@slave2 zookeeper-3.4.6]$ bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
我们发现主机slave1被选举为Leader,其余的两个节点是Follower,这个是由其内部算法选举生成的。
至此,集群已经安装完毕,这个时候用客户端命令去访问则是访问的是整个Zookeeper集群。