---------------------------------------------------------
| zookeeper叢集的搭建,從兩個方法着手,
| 1. 遇見的問題
| 2. 搭建過程
----------------------------------------------------------
遇見的問題
檢視日志
docker zookeeper叢集搭建遇見的問題搭建過程腳本内容

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 [email protected]:~
将zookeeper.sh 檔案推送到 101 伺服器的root使用者的根目錄下。
推送完成後,執行腳本