ZooKeeper系列之一:Zookeeper伪集群环境搭建

一 30th, 2013

ZooKeeper的部署方式主要有三种单机模式、伪集群模式、集群模式。其实剩下的两种模式都是集群模式的特殊情况。这里我采取部署伪集群模式来说明,了解伪集群模式的部署方式,基本也就知道单机模式和集群模式该如何部署了!

1.下载ZK的部署包

我这里选用cloudera的3.3.3定制版,ZK下载地址:

http://archive.cloudera.com/cdh/3/zookeeper-3.3.3-cdh3u0.tar.gz

2. 明确集群服务器数量和目录结构

伪集群模式的二种目录结构,都以 2n+1 = 3 搭建,这也就是说允许最多n台服务器的失效

   目录结构1:

image

   目录结构2:

image

二种目录结构,可以很明显得出2比较有优势,目录1会存在冗余,刚开始这些都不是很重要,搞清楚本质就好了。继续下一步,按第一种方式进行,第二种目录结构也会提到。

将zookeeper部署包分别拷贝到server0,1,2三个文件夹下面。

3. 新建配置文件:

在服务启动之前,需要新建一个配置文件,这个配置文件习惯性命名为 zoo.cfg , 默认是存放在其conf/下面。

以server0为例:我新建了一个文件zoo0.cfg (server 0)。

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/home/pbserversolrtest/zookeeper/server0/zookeeper/data

dataLogDir=/home/pbserversolrtest/zookeeper/server0/zookeeper/logs

clientPort=2181

server.0=10.20.151.34:2887:7770

server.1=10.20.151.34:2888:7771

server.2=10.20.151.34:2889:7772

由于是在单机上搭建,所以每个server的clientPort需要不一样的值,如下这个对应关系:

server.0-2181,server.1->2182,server.2->2183

配置文件的说明:

  • tickTime :基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  • dataDir :存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • clientPort :这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
  • initLimit:这个配置项是用来配置 Zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 5 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。
  • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
  • server.A = B:C:D : A表示这个是第几号服务器,B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader

4. 创建myid文件:

在集群模式下,需要通过myid来确定是哪一个server,上面配置的zoo.cfg中有一个值dataDir,在其指定的路径下新建一个文件myid

该文件中只需要写入相应的A值,如在server.0,该值就应该是0

5. 执行运行脚本:

需要到不同的zookeeper路径下去执行 ./zkServer.sh start, 由于这种方式,导致我们没有配置相应的环境变量,存在找不到conf/路径的风险,所以在执行这个脚本的时候,最好能指定下配置文件的路径,如:

./zkServer.sh start ../conf/zoo0.cfg

6. 附:按目录二结构进行搭建:

在ZK的目录下面新建3个data文件夹,每个文件夹中分别新建myid文件,同方式一。

conf/ 路径下新建3个zoo.cfg 文件,每个文件的配置同目录一。

7. 注意的问题:

1. 在启动./zkServer.sh start ../conf/zoo0.cfg,这时候去检查ZK,./zkCli.sh -server 10.20.151.34:2181,会出现这样的情况: java.net.ConnectException: Connection refused ,详细看下图。

image

这是由于ZooKeeper集群启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志的异常是可以忽略的。当集群在选出一个Leader后,最后就会稳定了。

2.  但是如果等待一段时间,还是出现这种拒绝连接的异常,就需要检查下是不是端口号被占用了。这里一不小心就会写错(因为我就写错过一次,检查好久才发现的)

server.0=10.20.151.34:2887:7770

server.1=10.20.151.34:2888:7771

server.2=10.20.151.34:2889:7772

3.  如果zoo.cfg文件配置了dataLogDir,一直要保证该路径是存在的,如上面的配置文件中配置的路径/home/pbserversolrtest/zookeeper/server0/zookeeper/logs这个路径必须存在。

4.  如果zk服务还是不可用,可用查看bin/zookeeper.out 这个文件,里面记录了所有的信息。可用通过它来查看问题。





除非注明,本站文章均为原创。本文基于 BY-NC-SA 协议进行授权,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 metaboy(包含链接).

本文链接地址: http://blog.wangyuxiong.com/archives/51712

订阅本站:http://www.wangyuxiong.com/feed

分类: 分布式系统与计算         标签: ,
  1. 雅荷之家
    十 27th, 201302:14

    云计算是未来的主流吗

    • metaboy
      十一 3rd, 201323:29

      随着数据量的爆发式增加,云计算应该是一个趋势。。。

无觅相关文章插件,快速提升流量