天天看點

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

---------------------------------------------------------

| zookeeper叢集的搭建,從兩個方法着手,

|      1.   遇見的問題

|      2.   搭建過程

----------------------------------------------------------

遇見的問題

檢視日志

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

zookeeper-2181容器建立成功,但是無法啟動,

檢視docker容器的日志, 發現有這個錯誤

Invalid config, exiting abnormally

解決方式:

1.zoo.cfg配置檔案中,每行後面有多餘的空格,,,,,我的是這個原因引起

2.myid配置檔案轉中,出現字元(隻能是數字),,,,,這個是網上說的,可以試試

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

進入到容器内部,發現叢集沒有正常工作。

+++++++++++++++++++++++++++++++++++++++++++++++++++++

方法一:

網上查找說的是tomcat服務使用的8080端口,zookeeper使用的也是8080端口,

如果機器上同時安裝這兩個服務,則需要修改tomcat的端口

檢視是否有tomcat服務啟動,發現沒有tomcat服務啟動,則不是這個問題。

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

安裝telnet服務 

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

 檢視8080端口是否通

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

檢視防火牆,是否開放8080端口 

 firewall-cmd --zone=public --query-port=8080/tcp

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

檢視目前起作用的zone

firewall-cmd --get-active-zones

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

開放8080端口 

  firewall-cmd --zone=public --add-port=8080/tcp --permanent

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

重新開機防火牆,配置的規則才會生效 

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

 100的機器開通了8080端口,102的機器沒有開通,則連接配接失敗

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

 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容器

發現容器叢集還是沒有啟動(給防火牆開放端口失敗,應該是還有其它的操作)

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

這個時候我将101這台機器的防火牆關閉,則該機器變為(leader)(這樣是變相的通過端口的方式完成了叢集的搭建,不過不可取,防火牆在生産環境是不能關閉的)

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

 發現:叢集中如果有一台機器的防火牆關閉了,則其他子節點都需要通過該機器進行通信,則該機器自然成為 leader

方法二:

簡單的方式,将所有機器的防火牆關閉,該方法簡單粗暴,适合于開發測試環境

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

+++++++++++++++++++++++++++++++++++++++++++++++++++++

搭建過程

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要求自己進行修改)

docker zookeeper叢集搭建遇見的問題搭建過程腳本内容 

腳本内容 

#!/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使用者的根目錄下。

推送完成後,執行腳本

繼續閱讀