最近打算搭建一个storm集群学习下storm,发现storm使用zookeeper进行管理的,所以需要先搭建一下zookeeper集群。本文记录一下过程。

zookeeper是一个分布式的协调服务,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。如果将 storm,kafka 这些分布式组件的集群节点比喻成一个个小动物的话,zookeeper扮演的就是动物管理员的角色,负责集群中各个节点的通信协调等,就像它的名字一样。例如在 storm 集群中,各个 storm 节点是无状态的,状态信息是由zookeeper存储,storm 节点增加删除通信都是通过 zookeeper 完成的。通过将 kafka集群 和storm 集群使用同一个 zookeeper 维护,可以很方便地将 kafka 的数据传给 storm 消费。

系统环境

本文使用vmware15创建了三个centos7实例。选择centos7的主要原因是其支持docker容器,后续可以学习docker。vmware安装centos7的过程很简单,直接按照提示安装即可。如果在公司内网安装的话还需要设置相应的代理。

本人使用2k显示器,所以安装完centos7之后图形界面的字体特别小,目前只调整了terminal的字体,字体Liberation,字号16。

安装jdk

在安装好centos之后,第一件事就是安装jdk(三个centos实例执行相同的操作)。因为storm是基于Java的。
首先需要将centos7自带的Java组件删除,查看自带Java组件的命令是:

1
rpm -qa|grep java

然后将所有自带的组件删除:

1
sudo rpm -e --nodeps java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64 python-javapackages-3.4.1-6.el7_0.noarch tzdata-java-2015a-1.el7.noarch java-1.7.0-openjdk-headless-1.7.0.75-2.5.4.2.el7_0.x86_64  javapackages-tools-3.4.1-6.el7_0.noarch

下载jdk(tar.gz格式的,本文下载的是jdk-8u211-linux-x64.tar.gz),然后在/home目录下新建java目录,将jdk压缩包放置该目录下,然后执行如下命令解压:

1
sudo tar -zxvf jdk-8u211-linux-x64.tar.gz

在/home/java目录下会生成解压之后的文件,即jdk1.8.0_211。
接下来需要将Java路径配置到系统路径中,即将如下代码添加到/etc/profile文件中。

1
2
3
4
ZOOKEEPER_HOME=/home/dzb/app/zookeeper-3.4.9   # 这个是zookeeper的变量,暂且忽略
export JAVA_HOME=/home/java/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin # 最后一个分号后面的是zookeeper的变量,暂且忽略

然后执行命令使配置立即生效:

1
source /etc/profile

然后就可以执行java,javac查看Java环境是否配置成功。

安装zookeeper

在jdk安装成功之后就可以安装zookeeper了,过程也十分简单。首先在一个centos实例上安装zookeeper。

本文使用的是zookeeper-3.4.9,下载tar.gz格式的。然后放置/home/dzb/app目录下(也可以是其它目录,只不过配置系统路径时需要相应修改),进入该目录,使用如下命令解压:

1
tar -zxvf zookeeper-3.4.9.tar.gz

解压完成之后,需要对zookeeper进行配置,首先需要拷贝一份样例配置文件。

1
2
cd zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg

然后在zoo.cfg中增加自己的配置,可以参考下图进行配置。

在上图中,dataDir负责存储内存中的数据库快照的位置,如果没有指定dataLogDir,还将存储数据库更新的事务日志。dataLogDir负责存储数据库更新的事务日志。上图中配置了zookeeper-3.4.9/data/和zookeeper-3.4.9/logs/两个路径,但是data和logs目录并不存在,所以需要手动创建。

server.1=192.168.9.128:2888:3888是用来配置集群节点的,格式为server.id=host:port1:port2,具体含义如下:

  • server.id中的id为一个数字,表示zk进程的id,这个id也是data目录下myid文件的内容(myid文件需要自己新建,并且写入对应的id),各个进程的id不可以重复。
  • host 是该zk进程(zookeeper节点)所在的IP地址
  • port1 表示follower和leader交换消息所使用的端口
  • port2 表示选举leader所使用的端口

在上述配置文件中一共配置了三个zookeeper节点。
在配置完成之后,需要在每个zookeeper节点的data目录下生成myid文件,保存进程的id。以server.1=192.168.9.128:2888:3888对应的节点为例,在zookeeper-3.4.9目录下执行如下命令(其它节点同理):

1
echo "1" > data/myid

三个centos实例均按照上述流程安装zookeeper。

需要注意的是,每新增一个zookeeper节点,都需要在集群每个节点的zoo.cfg增加server.id=host:port1:port2。并且在新增节点的data目录下生成myid文件。

之后需要将zookeeper路径追加到系统路径中,参见安装jdk部分的图示。

为了避免防火墙对zookeeper造成影响,还需要关闭防火墙。执行如下命令:

1
2
禁用防火墙命令 systemctl disable firewalld.service 
停止防火墙 systemctl stop firewalld.service

最后,测试zookeeper服务。测试之前首先要启动所有节点的zookeeper服务,zookeeper服务管理可以使用脚本控制(见参考文献3)。下面是zookeeper基础命令。

1
2
3
zkServer.sh start  #启动
zkServer.sh status #查看状态
zkServer.sh start #关闭

参考文献

1 zookeeper3.4.9集群模式安装部署
2 zookeeper三节点集群安装记录
3 CentOs7.3 搭建 ZooKeeper-3.4.9 Cluster 集群服务
4 Zookeep启动正常,却报错:Error contacting service. It is probably not running.
5 CentOS7 下载安装jdk1.8