分布式服务管理框架-Zookeeper安装与配置(单机、集群)

原文链接: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安装与配置(单机、集群)_第1张图片
从上面启动脚本的提示信息和进程信息可以看出,Zookeeper服务已经启动成功。

上面提到Zookeeper启动时会从conf目录中查找zoo.cfg文件,作为默认配置文件,配置文件中有几个重要的参数需要了解:

tickTime=2000
dataDir=/tmp/zookeeper
clientPort=2181
  • tickTime:这个时间是作为客户端与服务器或Zookeeper主从节点之间维持心跳的时间间隔,也就是每隔tickTime时间段,客户端就会像服务器发送一个心跳,或集群环境中,Follower节点向Leader节点发送一个心跳。
  • dataDir:Zookeeper保存节点数据的目录,同时写数据的日志也保存在这个目录当中。
  • clientPort:客户端连接到Zookeeper服务器的端口,Zookeeper会监听这个端口,等待客户端的连接请求。
    Zookeeper服务启动成功后,可通过netstat -ntlp命令检查2181端口是否在监听。如下图所示:
    分布式服务管理框架-Zookeeper安装与配置(单机、集群)_第2张图片

集群模式

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
  • initLimit:Follow服务器连接到Leader服务器,初始化时最长能忍受多少个心跳时间间隔。即每隔tickTime段时间,Follow向Leader发送一个心跳,如果initLimit次后还没有向Leader发送心跳,则Leader服务器会认为该Follow服务器已经宕机,即会将它从服务器集群中移除。即initLimit * tickTime(5 * 2000 = 10秒)后,Leader服务器还没有收到Follow服务器发送的心跳,则会将Follow服务器从集群中移除。
  • syncLimit:标识Leader 与 Follower 之间发送消息,请求和应答的时间长度,最长不能超过 syncLimit 个 tickTime 的时间长度,这里配置的总时间长度为:2 * 2000 = 4秒
  • 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

1> 安装Zookeeper

参考 单机模式 在每个节点安装Zookeeper

2> 节点1配置(192.168.1.200)

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

3> 节点2配置(192.168.1.201)

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

4> 节点3配置(192.168.1.202)

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

5> 启动集群

在每个节点上执行如下命令,启动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

6> 集群服务测试

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 。

你可能感兴趣的:(分布式开发,Zookeeper)