踩坑之路(三) Zookeeper集群搭建

在我们大数据的这个坑里,最主要的概念当然就是分布式存储分布式计算

一旦提到分布式,那么注册中心的概念就又用到了。

大数据生态圈里,有很多组件的元数据信息都是借助ZooKeeper去管理和调度的,包括Kafka等等(虽然Kafka扬言要脱离Zookeeper,但我去官网看了下最新版的release,发现还没有实现,希望Kafka能尽早实现吧,尽量减少组件之间的依赖性)。

那我们也不等不搭建一个ZooKeeper集群了,来实现分布式协调服务。

1 下载上传Zookeeper安装包

https://zookeeper.apache.org/releases.html

1
2
3
链接:https://pan.baidu.com/s/1uBuiIO3c-UgkbVLm_mBD5g 
提取码:8888
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V4的分享

apache-zookeeper-3.4.6.tar.gz,把他上传到/lankr/software

2 解压配置zookeeper

创建脚本init_zookeeper.sh

1
2
cd /lankr/script/zookeeper
vim init_zookeeper.sh

写入下面内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/bin/bash

# 判断/lankr/application是否已经由zookeeper3.6.3的包
ZOOKEEPER_APP_NAME="/lankr/application/zookeeper-3.4.6"

if [ -d $ZOOKEEPER_APP_NAME ]; then
echo "zookeeper3.4.6的安装包已经存在,可能以前安装过,现在直接退出"
exit 1
else
echo "zookeeper的安装包不存在,现在开始安装和配置操作"
fi

echo

# 解压zookeeper到/lankr/application/
echo "开始解压zookeeper到/lankr/application"
tar -zxvf /lankr/software/zookeeper-3.4.6.tar.gz -C /lankr/application
echo "完成解压zookeeper"

echo

# 备份配置文件
echo "开始备份配置文件"
cd /lankr/application/zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
echo "完成备份配置文件"

echo

# 创建数据存储目录
echo "开始创建数据存储目录"
mkdir -p /lankr/application/zookeeper-3.4.6/zkdatas/
echo "完成创建数据存储目录"

echo

echo "开始书写配置文件"
echo '#Zookeeper的数据存放目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里
dataDir=/lankr/application/zookeeper-3.4.6/zkdatas/
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
initLimit=10
syncLimit=5
clientPort=2181
autopurge.purgeInterval=8928
# 集群中服务器地址
server.3=node3:2888:3888
server.4=node4:2888:3888
server.5=node5:2888:3888
server.6=node6:2888:3888
server.7=node7:2888:3888' > /lankr/application/zookeeper-3.4.6/conf/zoo.cfg
echo "完成书写配置文件"

echo

# echo "我用的这个版本,zookeeper识别不了JAVA_HOME,所以下面强制写入一下"

# sed -i '2i JAVA_HOME="/lankr/application/jdk1.8.0_291"' /lankr/application/zookeeper-3.4.6/bin/zkEnv.sh

# 配置zookeeper集群的myid
echo "开始配置zookeeper集群的myid"
echo 3 > /lankr/application/zookeeper-3.4.6/zkdatas/myid
echo "完成配置zookeeper集群的myid"

echo

# 分发zookeeper到各个服务器
echo "开始分发zookeeper到各个服务器"
for i in {4..7}
do
scp -r /lankr/application/zookeeper-3.4.6/ node$i:/lankr/application/
# 修改各个服务器的zookeeper的myid的值
ssh node$i "echo $i > /lankr/application/zookeeper-3.4.6/zkdatas/myid"
done
echo "完成分发zookeeper到各个服务器"

执行安装

1
2
chmod +x /lankr/script/zookeeper/init_zookeeper.sh
/lankr/script/zookeeper/init_zookeeper.sh

3 创建集群启动脚本

创建脚本start_zookeeper.sh

1
vim /lankr/script/zookeeper/start_zookeeper.sh

写入下面内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

# 启动zookeeper集群
echo "准备启动zookeeper集群"
for i in {1..7}
do
# 启动zookeeper
echo "准备启动node$i上的zookeeper"
ssh node$i "export JAVA_HOME=/lankr/application/jdk1.8.0_291 && /lankr/application/zookeeper-3.4.6/bin/zkServer.sh start"

# 查看zookeeper状态
echo "node$i上的zookeeper状态如下:"
ssh node$i "/lankr/application/zookeeper-3.4.6/bin/zkServer.sh status"

echo
done

执行脚本启动

1
2
chmod +x /lankr/script/zookeeper/bin/satrt_zookeeper.sh
/lankr/script/zookeeper/satrt_zookeeper.sh

查看下详细的日志

1
/lankr/application/zookeeper-3.4.6/bin/zkServer.sh start-foreground

4 客户端工具连接

可以使用客户端可视化工具连接Zookeeper。我使用ZooInspector

1
2
3
链接:https://pan.baidu.com/s/1mW_Fp2MsxsQCfjLvS4-A6A 
提取码:8888
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V4的分享

如图所示,双击start.bat,然后输入zookeeper的ip:host就可以连接到了

5 坑

默默留下没有技术的泪水

5.1 启动集群失败

查看状态

1
2
3
4
5
/lankr/application/zookeeper-3.4.6/bin/zkServer.sh status

发现报错
Using config: /lankr/application/zookeeper-3.4.6/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

事故原因

又是排查了半下午,心态崩了。

原来是防火墙的原因,以前我自己都是在本地搞,防火墙都是关掉的,可是服务器上的防火墙不能关怎么办,只能是开放对应的端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看防火墙状态,确保他是开着的
systemctl status firewalld

# 查看已经开放的端口,看有没有我们需要的那个
firewall-cmd --list-ports

# 开启zookeeper需要的三个端口
firewall-cmd --permanent --zone=public --add-port=2181/tcp
firewall-cmd --permanent --zone=public --add-port=2888/tcp
firewall-cmd --permanent --zone=public --add-port=3888/tcp

# 重启防火墙
systemctl restart firewalld.service

# 重载配置文件
firewall-cmd --reload

# 再次查看已经开放的端口
firewall-cmd --list-ports

5.2 远程启动集群失败

这个问题困了我一整个下午,人都麻了,后来问了文杰老哥解决的,记录一下,太难了。

注意:远程启动zookeeper集群的时候,写一下export JAVA_HOME=/lankr/application/jdk1.8.0_291,因为shell脚本执行的过程中,登录shell非登录shell读取的环境变量配置文件不同。

登录shell会读取/etc/profile,~、。bash_profile,~/.bash_login,~/.profile等文件,而非登录shell读取的脚本有/etc/bashrc~/.bashrc,像java,path这些环境变量是读取不到的。

解决办法两个:一是将/etc/profile文件中的环境变量复制到~/.bashrc就解决了二是在执行时暴露一下环境变量,像我上面那样

联系博主,加入【羊山丨交流社区】

联系博主


本博客所有文章除特别声明外,均为原创。版权归博主小马所有。任何团体、机构、媒体、网站、公众号及个人不得转载。如需转载,请联系博主(关于页面)。如其他团体、机构、媒体、网站、博客或个人未经博主允许擅自转载使用,请自负版权等法律责任!