原文链接:http://blog.csdn.net/xyang81/article/details/53002175
Zookeeper 分布式服务框架是 Apache Hadoop 下的一个子项目,它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
Zookeeper的安装非常简单,本文在Linux CentOS7环境下,以Zookeeper 3.4.9 Release版本为例(最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/ 来获取),从单机和集群两种模式下分别介绍Zookeeper的安装和配置。
单机模式安装非常简单,只需将Zookeeper的压缩包解压到某个目录,如:/opt/zookeeper-3.4.9 下,将conf/zoo_sample.cfg文件复制一份,并重命名为zoo.cfg,因为Zookeeper在启动时会找这个文件作为默认的配置文件,然后执行bin目录下的 zkServer.sh start
脚本即可启动Zookeeper单机服务。下面是安装和配置过程:
shell> cd /opt
shell> wget http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
shell> tar -zxvf zookeeper-3.4.9.tar.gz
shell> cd zookeeper-3.4.9
## 拷贝配置文件
shell> cp conf/zoo_sample.cfg conf/zoo.cfg
## 启动服务
shell> ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
## 检查服务是否启动
shell> ps -ef | grep zookeeper
从上面启动脚本的提示信息和进程信息可以看出,Zookeeper服务已经启动成功。
上面提到Zookeeper启动时会从conf目录中查找zoo.cfg文件,作为默认配置文件,配置文件中有几个重要的参数需要了解:
tickTime=2000
dataDir=/tmp/zookeeper
clientPort=2181
netstat -ntlp
命令检查2181端口是否在监听。如下图所示: Zookeeper的面世就是为了解决分布式系统环境中,众多服务的协调问题,也只有在分布式环境下才能充分体现它的价值所在,所以单机模式一般只用于小规模项目和学习使用。ZK同时支持N个节点组成的集群来提供服务,并且有一个要求,集群节点必须超过一半以上的实例启动后,才能正常提供服务。比如由3个节点组成的集群,必须启动2个节点集群才能正常运行,所以Zookeeper集群环境的节点数一般为单数比较合理。
实际上Zookeeper还支持另外一种 伪集群 的方式,即在一台服务器上,运行多个Zookeeper实例。
集群模式的配置,除以上单机模式的三个基本配置外,每个节点 还要增加下面几个配置项:
initLimit=5
syncLimit=2
server.1=192.168.1.100:2888:3888
server.2=192.168.1.101:2888:3888
server.A=B:C:D:其中 A 是一个数字,表示这个是集群中第几台服务器;B 是这台服务器的 IP 地址; C 是这台服务器与集群中Leader服务器交换数据的端口; D 表示万一集群中的Leader服务器挂了,需要一个端口在集群的Follower服务器中重新选举出一个新的Leader,而这个端口就是用来执行选举时Follower服务器之间相互通信的端口。如果是伪集群的配置方式,由于B都是同一个IP,所以不同的Zookeeper实例通信端口号不能一样,需要给它们分配不同的端口号,且clientPort也需要修改成不一样。
伪集群server配置示例:
server.1=192.168.1.200:2888:3888
server.2=192.168.1.200:2889:3889
server.3=192.168.1.200:2890:3890
除了修改zoo.cfg配置文件,集群模式下还要配置一个文件myid
,这个文件放在dataDir目录下(/tmp/zookeeper
),这个文件里面就有一个数据就是A的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与zoo.cfg 里面配置信息进行比较,从而才能判断出自己到底是哪台服务器。
服务器节点规划:
节点1:192.168.1.200
节点2:192.168.1.201
节点3:192.168.1.202
参考 单机模式 在每个节点安装Zookeeper
shell> vi /opt/zookeeper-3.4.9/conf/zoo.cfg
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/tmp/zookeeper
clientPort=2181
## 集群所有节点配置
server.1=192.168.1.200:2888:3888
server.2=192.168.1.201:2888:3888
server.3=192.168.1.202:2888:3888
在dataDir目录下创建一个myid文件,并写入服务器编号1
shell> mkdir /tmp/zookeeper
shell> echo 1 > /tmp/zookeeper
shell> vi /opt/zookeeper-3.4.9/conf/zoo.cfg
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/tmp/zookeeper
clientPort=2181
## 集群所有节点配置
server.1=192.168.1.200:2888:3888
server.2=192.168.1.201:2888:3888
server.3=192.168.1.202:2888:3888
在dataDir目录下创建一个myid文件,并写入服务器编号2
shell> mkdir /tmp/zookeeper
shell> echo 2 > /tmp/zookeeper
shell> vi /opt/zookeeper-3.4.9/conf/zoo.cfg
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/tmp/zookeeper
clientPort=2181
## 集群所有节点配置
server.1=192.168.1.200:2888:3888
server.2=192.168.1.201:2888:3888
server.3=192.168.1.202:2888:3888
在dataDir目录下创建一个myid文件,并写入服务器编号3
shell> mkdir /tmp/zookeeper
shell> echo 2 > /tmp/zookeeper
在每个节点上执行如下命令,启动Zookeeper实例
shell> /opt/zookeeper-3.4.9/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper01/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
shell> telnet 192.168.1.200 2181
Trying 192.168.1.200...
Connected to 192.168.1.200.
Escape character is '^]'.
stat ## 注意在这里输入stat命令
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
/192.168.1.200:41465[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 4
Connection closed by foreign host.
通过telnet命令连接到192.168.1.200这个节点,输入stat
命令得到Zookeeper服务器的响应,从而可以看出Zookeeper集群已经正常工作了,且该节点的运行模式为 follower 。