您的位置:首页 > 其它

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

2014-07-31 20:01 387 查看
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:





目录结构2:





二种目录结构,可以很明显得出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 ,详细看下图。





这是由于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 这个文件,里面记录了所有的信息。可用通过它来查看问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: