docker zookeeper集羣搭建

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

| 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 [email protected]:~

將zookeeper.sh 文件推送到 101 服務器的root用戶的根目錄下。

推送完成後,執行腳本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章