伪分布式集群安装

伪分布式就是指多个Zookeeper实例在一台主机上的情况,我们需要做的就是整三个不同的配置文件,使用不同的配置文件启动Zookeeper:

主要修改的配置项为:

  • dataDir ,保证不同的Zookeeper实例的数据保存在不同路径下(记得要创建文件夹)
  • clientPort客户端连接端口不能冲突
  • server.ID=IP:CONNECT:ELECTON ,集群配置信息。因为是在同一个主机上,所以这里要保证 CONNECT_PORT 端口和 ELECTON 端口都不一样

除此之外还要在每个dataDir下按照创建 myid 文件,ID来自于 server.ID 里的ID

到这里然后使用命令行分别启动三个 ZooKeeper 实例:

  1. # 注意,这里的--config 只能指定zoo.cfg所在的目录。比如下面的zoo1其实是目录,真实的配置文件路径是
  2. # /home/apache-zookeeper-3.6.1-bin/conf/zoo1/zoo.cfg
  3. ./zkServer.sh --config /home/apache-zookeeper-3.6.1-bin/conf/zoo1
  4. ./zkServer.sh --config /home/apache-zookeeper-3.6.1-bin/conf/zoo2
  5. ./zkServer.sh --config /home/apache-zookeeper-3.6.1-bin/conf/zoo3

分布式集群安装

相比伪分布式集群,此种方式就是一个ZooKeeper实例一个主机,相关的配置项有以下这几个:

  • initLimit=10 ,集群之间“商量”选举出Leader的时间限制,时长为 initLimit * tickTime
  • syncLimit=5 ,指定了 follower 和 leader 之间 允许的超时时间间隔
  • server.ID=IP:CONNECT:ELECTON ,ID表示ZooKeeper实例的ID(只能是数字);IP表示对应的Zookeeper实例的地址; CONNECT 表示Zookeeper之间交流通信的端口; ELECTON 表示选举Leader的端口

PS:要注意防火墙问题,还有不同主机上的系统时间问题(Zookeeper对时间很敏感)
最后给每台ZooKeeper实例的dataDir目录下,创建一个 myid 文件,里面的值是该Zookeeper实例的ID,各实例的配置文件如下所示:
image.png image.png image.png
image.pngimage.pngimage.png

分布式启动

因为ZooKeeper没有提供启动集群的脚本,所以我们自己写了一个可以简单操作集群的脚本:

  1. #!/bin/bash
  2. # 这是我hadoop的根目录
  3. zooKeeperHome="/opt/module/zookeeper-3.4.10/bin/zkServer.sh"
  4. # 遍历主机名
  5. for i in hadoop1 hadoop2 hadoop3
  6. do
  7. echo "-------$i--------"
  8. ssh $i $zooKeeperHome $1
  9. done

假设我要启动集群里各个机器:

[codeleven@hadoop1 bin]$ ./zkCluster.sh start
-------hadoop1--------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
-------hadoop2--------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
-------hadoop3--------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED