Bigdata-ZooKeeper集群快速搭建配置与扩容

Posted by Yancy on 2017-05-26

ZooKeeper集群快速搭建

之前搞过了hadoop和spark,hue,现在使用kafka集群结合zookeeper集群做数据消费处理,本文是ZooKeeper的快速搭建,旨在帮助大家以最快的速度完成一个ZK集群的搭建,以便开展其它工作。

集群:

本文使用了3台机器部署ZooKeeper集群,IP和主机名对应关系如下:

1
2
3
4
IP 主机名
169.44.62.11 zk1.jollychic.com
169.44.59.12 zk2.jollychic.com
169.44.62.13 zk3.jollychic.com

安装说明

Zookeeper机器间不需要设置免密码登录,其它hadoop也可以不设置,只要不使用hadoop-daemons.sh来启动、停止进程,注意不是hadoop-daemon.sh,而是带“s”的那个,带“s”的会读取hadoop的salves文件,远程ssh启动DataNode和备NameNode等。

配置/etc/hosts
将3台机器的IP和主机名映射关系,在3台机器上都配置一下,亦即在3台机器的/etc/hosts文件中,均增加以下内容(可以先配置好一台,然后通过scp等命令复制到其它机器上,注意主机名不能包含任何下划线):

1
2
3
4
127.0.0.1 localhost.localdomain localhost
169.44.62.12 zk1.jollychic.com
169.44.59.13 zk2.jollychic.com
169.44.62.14 zk3.jollychic.com

Step1:

配置JAVA环境。检验方法:执行 java –versionjavac –version 命令。
下载并解压 zookeeper链接一链接二 (更多版本:http://dwz.cn/37HGI)

Step2:

1
2
3
4
5
6
7
1.zookeeper的环境变量的配置:
为了今后操作方便,我们需要对Zookeeper的环境变量进行配置,方法如下:
在/etc/profile.d/zk.sh文件中加入如下的内容:
#set zookeeper environment
export ZOOKEEPER_HOME=/data/tools/zookeeper-3.4.5
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf

Step3:

1
2
3
4
5
6
7
8
9
10
11
2.下载以后解压到我自己新建的:
[hadoop@namenode ~]$ tar -zxvf zookeeper-3.3.6.tar.gz -C /srv/hadoop/
[hadoop@namenode ]$ cd /srv/hadoop/zookeeper-3.3.6/conf/
### 将zoo_sample.cfg拷贝一份命名为zoo.cfg,这里我拷贝一份命名为:zoo.cfg
[hadoop@namenode conf]$ cp -r zoo_sample.cfg zoo.cfg
### 这里先创建/data和/logs 这两个目录。
mkdir -p /data/tools/zookeeper-3.4.5/zookeeper/data
mkdir -p /data/tools/zookeeper-3.4.5/zookeeper/logs

注意上图的配置中master,slave1分别为主机名。

在上面的配置文件中"server.id=host:port:port"中的第一个port是从机器(follower)连接到主机器(leader)的端口号,第二个port是进行leadership选举的端口号。

修改配置:zoo.cfg修改有的默认存在,添加红色的内容:

1
2
3
4
5
6
7
8
9
10
11
tickTime=2000
clientPort=2181
initLimit=10
syncLimit=5
maxClientCnxns=0 #这个是设置连接数0没有做限制
dataDir=/data/tools/zookeeper-3.4.5/zookeeper/data
dataLogDir=/data/tools/zookeeper-3.4.5/zookeeper/logs
server.0=zk1.jollychic.com:2888:3888
server.1=zk2.jollychic.com:2888:3888
server.2=zk3.jollychic.com:2888:3888

创建maid:

这里所有节点都需要创建,接下来在dataDir所指定的目录下创建一个文件名为myid的文件,文件中的内容只有一行,为本主机对应的id值,也就是上图中server.id中的id。例如:在服务器1中的myid的内容应该写入1。
创建myid:在zoo.cfg配置文件中的dataDir的目录下面创建myid,每个节点myid要求不一样:

1
2
vim /data/tools/zookeeper-3.4.5/tmp/myid
0

Step4:

远程复制分发安装文件。
最好是把文件打包scp过去。
接下来将上面的安装文件拷贝到集群中的其他机器上对应的目录下:

1
2
3
4
5
scp -P58958 -r zookeeper-3.4.5 jollybi@169.44.62.137:/data/tools/.
scp -P58958 -r zookeeper-3.4.5 jollybi@169.44.59.138:/data/tools/.
拷贝完成后修改对应的机器上的myid。例如修改其他两台机器中的myid如下:
echo 1 > /data/tools/zookeeper-3.4.5/tmp/myid
echo 2 > /data/tools/zookeeper-3.4.5/tmp/myid

Step5:

启动 ZooKeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本,如下所示:

1
2
3
4
5
6
7
8
9
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本,如下所示:
[jollybi@zk1.jollychic.com ~]$ /data/tools/zookeeper-3.4.5/bin/zkServer.sh start
[jollybi@zk1.jollychic.com ~]$ /data/tools/zookeeper-3.4.5/bin/zkServer.sh start
[jollybi@zk1.jollychic.com ~]$ /data/tools/zookeeper-3.4.5/bin/zkServer.sh start
[jollybi@zk1.jollychic.com ~]$ jps
123189 QuorumPeerMain
123309 Kafka
1151 Jps

执行

1
/haozhuo/hadoop/zookeeper-3.4.5/bin/zkServer.sh start

Step6:

检测是否成功启动:执行 jps

1
24933 QuorumPeerMain

其中,QuorumPeerMain是zookeeper进程,启动正常。

./zkServer.sh status 查看当前运行状态。

namenode1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[jollybi@zk1.jollychic.com zookeeper-3.4.5]# ./zkServer.sh status
JMX enabled by default
Using config: /srv/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[jollybi@zk1.jollychic.com zookeeper-3.4.5]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /srv/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
[jollybi@zk1.jollychic.com zookeeper-3.4.5]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /srv/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader

链接测试

1
2
3
bin/zkCli.sh -server 127.0.0.1:2181
bin/zkCli.sh -server 127.0.0.1:2181
bin/zkCli.sh -server 127.0.0.1:2181

Step7:

如果单台可以其他几台不行,看配置,如果没有问题。启动查看状态出现异常。

异常解决:Error contacting service. It is probably not running.

1
2
3
4
5
而其他一个节点却是现实正常;
先stop掉原zk
./bin/zkServer.sh stop
然后以start-foreground方式启动,会看到启动日志
./bin/zkServer.sh start

当出现问题的时候,记得查看日志zookeeper.out,在你配置的dataDir(在conf/zoo.cfg中查看)目录下。

1
2
3
2015-12-29 11:09:38,034 [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@400] - Cannot open channel to 3 at election address Node2/10.0.0.102:38888
java.net.ConnectException: 拒绝连接
at java.net.PlainSocketImpl.socketConnect(Native Method)

可以看到是连接到Node2的3888端口不通(我配置文件设置的节点端口,server.3=Node2:2888:3888),这样就找到问题了,所以当遇到问题的时候记得查看日志文件,这才是最有帮助的,而不是修改什么nc参数。

这里主要看下是否加入hosts

查看Node2节点发现,38888端口绑带到127.0.0.1上了,这让Master节点怎么连接呀,只需修改/etc/hosts文件即可,同理,修改Node1,然后重启zookeeper,发现问题解决。

1
2
3
4
5
127.0.0.1 localhost zk1.jollychic.com
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
169.44.62.12 zk1.jollychic.com
169.44.59.13 zk2.jollychic.com
169.44.62.14 zk3.jollychic.com

这里我127.0.0.1 localhost zk1.jollychic.com 就可以了。

Step8: 如何扩容zookeeper?

只需要将已有的zookeeper打包复制到新的机器上,然后修改myid文件并设置好,然后启动zookeeper即可。


设置开机自动启动

1.写个启动脚本放到/etc/rc.d/init.d/zookeeper
这里touch zookeeper && chmod +x zookeeper && vim zookeeper

1
2
3
4
5
6
7
8
9
10
11
12
13
!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/srv/jdk1.8.0_66
export PATH=$JAVA_HOME/bin:$PATH
case $1 in
start) su root /srv/zookeeper-3.3.6/bin/zkServer.sh start;;
stop) su root /srv/zookeeper-3.3.6/bin/zkServer.sh stop;;
status) su root /srv/zookeeper-3.3.6/bin/zkServer.sh status;;
restart) su root /srv/zookeeper-3.3.6/bin/zkServer.shrestart;;
*) echo "requirestart|stop|status|restart";;
esac

2.设置开机启动

1
chkconfig zookeeper on

3.验证

1
2
chkconfig --add zookeeper
chkconfig --list zookeeper

这个时候我们就可以用service zookeeper start/stop来启动停止zookeeper服务了.
使用chkconfig--add zookeeper命令把zookeeper添加到开机启动里面
添加完成之后接这个使用chkconfig--list来看看我们添加的zookeeper是否在里面
如果上面的操作都正常的话;重启服务器测试就行。



注意:zookeeper重启出现几种报错:

1. 启动服务报错找不到指定好的pid文件。
2. 关闭服务报错没有在/tmp/路径下面没有/srv/zookeeper-3.3.6/zookeeper/data/zookeeper_server.pid
1
2
3
4
5
6
7
8
9
10
11
12
[root@zookeeper zookeeper-3.3.6]# ./bin/zkServer.sh start
JMX enabled by default
Using config: /srv/zookeeper-3.3.6/bin/../conf/zoo.cfg
Starting zookeeper ... ./bin/zkServer.sh: line 93: [: /tmp/zookeeper: binary operator expected
./bin/zkServer.sh: line 103: /tmp/zookeeper
/srv/zookeeper-3.3.6/zookeeper/data/zookeeper_server.pid: 没有那个文件或目录
FAILED TO WRITE PID
[root@zookeeper zookeeper-3.3.6]# ./bin/zkServer.sh stop
JMX enabled by default
Using config: /srv/zookeeper-3.3.6/bin/../conf/zoo.cfg
Stopping zookeeper ... no zookeeper to stop (could not find file /tmp/zookeeper
/srv/zookeeper-3.3.6/zookeeper/data/zookeeper_server.pid)

解决方法:网上很少有人讲这么详细,这里我就说下,就是你在修改zoo.cfg配置文件里面:

dataDir指定的路径是自定义的话等于的时候不要空格写。

如果重新另外写dataDir ,不要注释掉之前的,最好直接删除,重新指定这样就不会报错了,如果注释掉默认的#dataDir = /tmp这里需要空格。

Step9.报错占用端口:

1
2
3
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo3.cfg
Starting zookeeper ... STARTED

查看状态:
用jps命令查看进程:

1
2
3
4
5
6
7
# jps
24617 QuorumPeerMain (这个就是zookeeper进程)
/opt/app/zookeeper/bin/zkServer.sh status zoo1.cfg
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo1.cfg
Error contacting service. It is probably not running.

Ihaozhuo_b3314
说明有错误,查看日志文件:

1
2
3
4
5
# cd <zookeeper_home>
# less zookeeper.out
java.net.BindException: 地址已在使用
杀掉当前进程:
# kill -9 24617

报错: 启动服务正常。

1
2
3
4
[root@api1 zookeeper-3.3.6]# ./bin/zkServer.sh start
JMX enabled by default
Using config: /srv/zookeeper-3.3.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

可是查询进程不存在,可是看pid是有的,然后关闭服务就说没有这个进程。

1
2
3
JMX enabled by default
Using config: /srv/zookeeper-3.3.6/bin/../conf/zoo.cfg
Stopping zookeeper ... ./zkServer.sh: line 133: kill: (31415) - 没有那个进程

走kafka查看是否所有节点都启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@kafka_03 bin]# sh zkCli.sh
Connecting to localhost:2181
2017-01-04 19:20:24,849 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
2017-01-04 19:20:24,853 [myid:] - INFO [main:Environment@100] - Client environment:host.name=kafka_03
2017-01-04 19:20:24,853 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_66
2017-01-04 19:20:24,856 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2017-01-04 19:20:24,856 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/srv/jdk1.8.0_66/jre
2017-01-04 19:20:24,856 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/srv/zookeeper-3.4.6/bin/../build/classes:/srv/zookeeper-3.4.6/bin/../build/lib/*.jar:/srv/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/srv/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/srv/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/srv/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/srv/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/srv/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/srv/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/srv/zookeeper-3.4.6/bin/../conf:
2017-01-04 19:20:24,856 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
[zk: localhost:2181(CONNECTED) 0] ls /
[controller_epoch, brokers, zookeeper, kafka, dubbo, admin, isr_change_notification, consumers, config, sthp]
[zk: localhost:2181(CONNECTED) 5] ls /kafka/brokers/ids
[0, 1, 2]
显示0 1 2 三台集群机器。

kafka 三台集群这里可以看到获取到ids。

Step10: 相关文档

《HBase-0.98.0分布式安装指南》

《Hive 0.12.0安装指南》

《ZooKeeper-3.4.6分布式安装指南》

《Hadoop 2.3.0源码反向工程》

《在Linux上编译Hadoop-2.4.0》

《Accumulo-1.5.1安装指南》

《Drill 1.0.0安装指南》

《Shark 0.9.1安装指南》

更多,敬请关注技术博客:http://blog.yancy.cc

Step11: 结束语

至此,ZooKeeper分布式安装大告成功!更多细节,请浏览官方文档

交流学习:

🐧 Linux shell_高级运维派: 459096184 圈子 (系统运维-应用运维-自动化运维-虚拟化技术研究欢迎加入)
🐧 BigData-Exchange School : 521621407 圈子(大数据运维)(Hadoop开发人员)(大数据研究爱好者) 欢迎加入

相应Bidata有内部微信交流群互相学习,加入QQ群有链接。