---------------------------------------------------------
| zookeeper集群的搭建,从两个方法着手,
| 1. 遇见的问题
| 2. 搭建过程
----------------------------------------------------------
遇见的问题
查看日志
zookeeper-2181容器创建成功,但是无法启动,
查看docker容器的日志, 发现有这个错误
Invalid config, exiting abnormally
解决方式:
1.zoo.cfg配置文件中,每行后面有多余的空格,,,,,我的是这个原因引起
2.myid配置文件转中,出现字符(只能是数字),,,,,这个是网上说的,可以试试
进入到容器内部,发现集群没有正常工作。
+++++++++++++++++++++++++++++++++++++++++++++++++++++
方法一:
网上查找说的是tomcat服务使用的8080端口,zookeeper使用的也是8080端口,
如果机器上同时安装这两个服务,则需要修改tomcat的端口
查看是否有tomcat服务启动,发现没有tomcat服务启动,则不是这个问题。
安装telnet服务
查看8080端口是否通
查看防火墙,是否开放8080端口
firewall-cmd --zone=public --query-port=8080/tcp
查看当前起作用的zone
firewall-cmd --get-active-zones
开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重启防火墙,配置的规则才会生效
100的机器开通了8080端口,102的机器没有开通,则连接失败
8080,2181,2888,3888
开通端口的shell脚本
vim zookeeperPart.sh
chmod 700 zookeeperPart.sh
. zookeeperPart.sh
#!/src/bin/bash
port1=`firewall-cmd --zone=public --add-port=8080/tcp --permanent`
echo "8080----> $? "
port2=`firewall-cmd --zone=public --add-port=2181/tcp --permanent`
echo "2181----> $? "
port3=`firewall-cmd --zone=public --add-port=3888/tcp --permanent`
echo "3888----> $? "
port4=`firewall-cmd --zone=public --add-port=2888/tcp --permanent`
echo "2888----> $? "
firewalld=`systemctl restart firewalld.service`
echo "firewall----> $? "
重启zookeeper-2181容器
发现容器集群还是没有启动(给防火墙开放端口失败,应该是还有其它的操作)
这个时候我将101这台机器的防火墙关闭,则该机器变为(leader)(这样是变相的通过端口的方式完成了集群的搭建,不过不可取,防火墙在生产环境是不能关闭的)
发现:集群中如果有一台机器的防火墙关闭了,则其他子节点都需要通过该机器进行通信,则该机器自然成为 leader
方法二:
简单的方式,将所有机器的防火墙关闭,该方法简单粗暴,适合于开发测试环境
+++++++++++++++++++++++++++++++++++++++++++++++++++++
搭建过程
1.准备3台服务器(虚拟机)(我这里使用的centos7.7)
2.设置为固定的ip(192.168.232.100 ,192.168.232.101, 192.168.232.102)
3.拉取zookeeper的docker镜像(拉取的时候尽量配置一下aliyun的docker加速器,https://blog.csdn.net/yang_zzu/article/details/104849132 这篇文章我有说明怎么使用aliyun加速器,搜索:阿里云,就能看到)每台服务器都要拉取镜像。
4.执行安装脚本,脚本内容如下
vim zookeeper.sh
chmod 700 zookeeper.sh
. zookeeper.sh
脚本的数据需要根据自己服务器的情况进行修改,
网卡,ip,server.xxx,配置文件地址(如果有reshuffle要求自己进行修改)
脚本内容
#!/usr/bin/bash
#zookeeper集群搭建
#创建文件夹
if [ ! -d /zookeeper/conf ];then
mkdir -p /zookeeper/conf
if [ $? -eq 0 ];then
echo '创建 /zookeeper/conf 成功.................'
else
echo '创建 /zookeeper/conf 失败!!!!!!!!!!'
exit 1
fi
fi
if [ ! -d /zookeeper/data ];then
mkdir -p /zookeeper/data
if [ $? -eq 0 ];then
echo '创建 /zookeeper/conf 成功.................'
else
echo '创建 /zookeeper/conf 失败!!!!!!!!!!'
exit 1
fi
fi
#创建配置文件
if [ -d /zookeeper/conf ];then
echo "#客户端连接端口,监听客户端连接的端口
clientPort=2181
#数据文件目录+数据持久化路径
dataDir=/data
#日志文件目录
dataLogDir=/data/log
#通信心跳数,单位ms
tickTime=2000
#leader(L)-follower(F)初始通信时限,initLimit*tickTime
initLimit=5
#leader(L)-follower(F)同步通信时限,syncLimit*tickTime
syncLimit=2
#
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
#根据集群的ip地址,进行设置,server.XXX,这个XXX在后面还要用到
server.000=192.168.232.100:2888:3888
server.001=192.168.232.101:2888:3888
server.002=192.168.232.102:2888:3888" > /zookeeper/conf/zoo.cfg
if [ $? -eq 0 ];then
echo "创建 /zookeeper/conf/zookeper.cfg 成功................."
else
echo "创建 /zookeeper/conf/zookeper.cfg 失败!!!!!!!!!"
exit 1
fi
fi
#获得该服务器的IP地址,网卡 ens33 需要查看服务器的网卡名称,进行调整
ip=`ifconfig ens33 | grep 'inet' | awk '{ print $2}' | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
#创建 /zookeeper/data/myid 用到前面设置的 XXX 内容
if [ "$ip" = "192.168.232.100" ];then
echo "ip地址为:$ip"
echo "000" > /zookeeper/data/myid
if [ $? -eq 0 ];then
echo "创建 /zookeeper/data/myid 成功................."
else
echo "创建 /zookeeper/data/myid 失败!!!!!!!!!"
exit 1
fi
elif [ "$ip" = "192.168.232.101" ];then
echo "ip地址为:$ip"
echo "001" > /zookeeper/data/myid
if [ $? -eq 0 ];then
echo "创建 /zookeeper/data/myid 成功................."
else
echo "创建 /zookeeper/data/myid 失败!!!!!!!!!"
exit 1
fi
elif [ "$ip" = "192.168.232.102" ];then
echo "ip地址为:$ip"
echo "002" > /zookeeper/data/myid
if [ $? -eq 0 ];then
echo "创建 /zookeeper/data/myid 成功................."
else
echo "创建 /zookeeper/data/myid 失败!!!!!!!!!"
exit 1
fi
fi
#启动docker服务
echo '启动docker服务...............'
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
restartdocker=`systemctl restart docker.service`
if [ $? -eq 0 ];then
echo 'docker服务启动成功........................'
else
echo 'docker服务启动失败!!!!!!!!!!!!'
exit 1
fi
#开启防火墙
echo '启动firewalld服务...............'
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
restartfirewalld=`systemctl restart firewalld.service`
if [ $? -eq 0 ];then
echo 'firewalld服务启动成功......................'
else
echo 'firewalld服务启动失败!!!!!!!!!!!!'
exit 1
fi
#判断是否之前存在zookeeper-2181容器,如果有则清除容器,没有则创建容器
zookeeperId=`docker ps -a | grep zookeeper-2181 | awk '{print $1}'`
if [ ! -n "$zookeeperId" ];then
echo "容器id为:$zookeeperId"
else
echo "容器id为:$zookeeperId"
echo "正在清除之前的zookeeper-2181容器..................."
echo ">>>>>>>>>>>>>>>>>>>>>>>"
zookeeperStop=`docker stop $zookeeperId`
if [ $? -eq 0 ];then
echo "zookeeper-2181容器停止成功..................."
zookeeperRm=`docker rm $zookeeperId`
if [ $? -eq 0 ];then
echo "zookeeper-2181容器清除成功..................."
else
echo "zookeeper-2181容器清除失败!!!!!!!!!!!!"
exit 1
fi
else
echo "zookeeper-2181容器停止失败!!!!!!!!!!!!"
exit 1
fi
fi
#运行zookeeper镜像
echo '创建zookeeper容器...............'
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
irunzookeeper=`docker run -i -t -d --network host -v /zookeeper/data:/data -v /zookeeper/conf:/conf --name zookeeper-2181 zookeeper`
if [ $? -eq 0 ];then
echo 'docker服务启动成功.................'
else
echo 'docker服务启动失败!!!!!'
exit 1
fi
5.将脚本推到其他服务器(或者在其他服务器上面再进行复制粘贴,权限修改,执行)
推送 scp zookeeper.sh root@192.168.232.101:~
将zookeeper.sh 文件推送到 101 服务器的root用户的根目录下。
推送完成后,执行脚本