zookeeper集群搭建脚本(最简单的搭建方式)

zookeeper集群搭建脚本

> 注意点1:  centos7.x的系统,低版本没有尝试

> 注意点2:  IPADDRS的服务器间通信必须正常,防火墙关闭或开放对应集群的选举端口和通信端口以及2181

> 注意点3:  !!!!!! 必须在IPADDRS中的某一台服务器上用root账号执行此脚本 !!!!!! 
		   执行时必须在此服务器执行的命令: yum install sshpass -y  
		   安装完成后不使用此脚本可以remove掉sshpass,自己决定
  
> 注意点4:  ZOOHOME指定的目录下不建议存在zookeeper开头的任何文件夹,不然此脚本会影响你的
		   文件,删除集群时可能造成误删除.

> 注意点5:  IPADDRS和PASSWORD的顺序必须一一对应,此脚本不支持为分布式安装,IPADDRS和PASSWORD和OBSERVER和MYID必须设置正确,TARNAME必须填写你上传到每台服务器的jdk压缩包名,因为jdk需要登录下载,所以此处不支持wget下载jdk,需要手动上传到每台服务器.

> 注意点6:  ELECTPORT是集群选举的端口号,TELNETPORT是集群通信的端口号

使用方法

#1. 安装依赖环境
脚本.sh install
#2. 目录配置和编译源码
脚本.sh make
#3. 启动集群
脚本.sh start
#4. 停止集群
脚本.sh stop
#5. 卸载集群
脚本.sh delete
#6. 重启集群
脚本.sh restart

脚本内容:

#!/bin/bash

# 基础设置
#节点选举端口,不可是2181,因为2181端口是客户端端口,选不被占用的端口
ELECTPORT=3000
#节点间通信起始端口号,不可是2181,因为2181端口是客户端端口,选不被占用的端口
TELNETPORT=2000
#服务器ip集合,数组长度必须是奇数
IPADDRS=(192.168.92.30 192.168.92.31 192.168.92.32 192.168.92.33 192.168.92.34 192.168.92.35 192.168.92.36)
#服务器密码集合,与ip对应,数组长度必须是奇数
PASSWORD=(root root root root root root root)
#observer节点配置,与IPADDRS数组中的下标对应,1就是observer节点,0不是,数组长度必须是奇数
OBSERVER=(0 0 0 0 0 1 1)
#myid标识,与IPADDRS数组中的下标对应,建议用ip地址最后一个点后的数值,192.168.92.30就用30,如果不是同一网段,可自己定义,数组长度必须是奇数
MYID=(30 31 32 33 34 35 36)
#zk安装根目录,默认安装zk3.5.6
ZOOHOME=/opt
#JDK安装根目录,最后不要加斜杠
JAVA_BASE_HOME=/usr/local
#JDK安装包文件名,版本必须大于等于1.8
TARNAME=jdk-8u231-linux-x64.tar.gz


if [ -a config.sh ]
then
    source "config.sh"
fi

#安装zoo集群依赖环境以及jdk1.8
if [ "$1" == "install" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		echo -e "\033[43;31m install $IPADDR  Start \033[0m"
		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "yum install wget -y && cd $JAVA_BASE_HOME && mkdir $JAVA_BASE_HOME/jdk1.8 && tar -zxf ./$TARNAME  -C ./jdk1.8 --strip-components 1 && echo 'export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8' >> /etc/profile && echo 'export PATH=\$JAVA_HOME/bin:\$PATH' >> /etc/profile && echo 'export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar' >> /etc/profile && source /etc/profile " 
		echo -e "\033[43;31m install $IPADDR  End \033[0m"
	done
	exit 0    
fi

#编译zoo集群
if [ "$1" == "make" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		echo -e "\033[43;31m download $IPADDR  Start \033[0m"
		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "cd $ZOOHOME && wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.6/apache-zookeeper-3.5.6-bin.tar.gz && tar -zxf $ZOOHOME/apache-zookeeper-3.5.6-bin.tar.gz "
		echo -e "\033[43;31m download $IPADDR  End \033[0m"

		PORT=$ELECTPORT
		TELNET=$((TELNETPORT+i))
		echo -e "\033[43;31m make $IPADDR:$PORT  Start \033[0m"
		MID=${MYID[p]}
		echo "$MID"
		left="cp -R $ZOOHOME/apache-zookeeper-3.5.6-bin $ZOOHOME/zookeeper-3.5.6-$PORT && mkdir $ZOOHOME/zookeeper-3.5.6-$PORT/logs && mkdir $ZOOHOME/zookeeper-3.5.6-$PORT/data && cp $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo_sample.cfg $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && sed -i '12c #dataDir=/tmp/zookeeper' $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && echo 'dataDir=$ZOOHOME/zookeeper-3.5.6-$PORT/data' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && echo 'dataLogDir=$ZOOHOME/zookeeper-3.5.6-$PORT/logs' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && touch $ZOOHOME/zookeeper-3.5.6-$PORT/data/myid && echo '$MID' >> $ZOOHOME/zookeeper-3.5.6-$PORT/data/myid"
		
		right=""
		for two in ${!IPADDRS[@]}; do
			TIP=${IPADDRS[$two]}
			if [ ${OBSERVER[two]} == 1 ];then
				tmp="&& echo 'server.${MYID[two]}=$TIP:$TELNET:$PORT:observer' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg "
			else
				tmp="&& echo 'server.${MYID[two]}=$TIP:$TELNET:$PORT' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg "
			fi
			right="$right $tmp"
			
			if [[ ${OBSERVER[p]} == 1 ]] && [[ ${OBSERVER[two]} == 1 ]] ;then
				right="$right && echo 'peerType=observer' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg "
			fi
		done;

		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "$left$right"
		echo -e "\033[43;31m make $IPADDR:$PORT  End \033[0m"

		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "rm -rf $ZOOHOME/apache-zookeeper-3.5.6-bin && rm -rf $ZOOHOME/apache-zookeeper-3.5.6-bin.tar.gz"
	done
	exit 0    
fi


#运行集群
if [ "$1" == "start" ]
then
	HOSTS=""
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		PORT=$ELECTPORT
		echo -e "\033[43;31m Starting $IPADDR:$PORT Start \033[0m"
		
		sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8 && cd $ZOOHOME/zookeeper-3.5.6-$PORT/bin/ && ./zkServer.sh start"
		
		echo -e "\033[43;31m Starting $IPADDR:$PORT End \033[0m"
	done
	exit 0    
fi

#停止集群
if [ "$1" == "stop" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		PORT=$ELECTPORT
		echo -e "\033[43;31m Stopping $IPADDR:$PORT Start \033[0m"
		sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8 && cd $ZOOHOME/zookeeper-3.5.6-$PORT/bin/ && ./zkServer.sh stop"
		echo -e "\033[43;31m Stopping $IPADDR:$PORT End \033[0m"
	done
	exit 0    
fi

#重启集群
if [ "$1" == "restart" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		PORT=$ELECTPORT
		echo -e "\033[43;31m Restart $IPADDR:$PORT Start \033[0m"
		sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8 && cd $ZOOHOME/zookeeper-3.5.6-$PORT/bin/ && ./zkServer.sh restart"
		echo -e "\033[43;31m Restart $IPADDR:$PORT End \033[0m"
	done
	exit 0    
fi


#删除集群
if [ "$1" == "delete" ];then
	read -p "你确定要删除整个集群么?删除前请先stop,该操作会删除所有数据,输入[yes/no]?" input
	echo $input
	if [ $input = "yes" ];then
		for p in ${!IPADDRS[@]}; do
			IPADDR=${IPADDRS[$p]}
			echo -e "\033[43;31m Delete $IPADDR:$PORT Start \033[0m"
			sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "sed -i '/JAVA_HOME/d' /etc/profile && rm -rf $ZOOHOME/zookeeper-* && rm -rf $JAVA_BASE_HOME/jdk1.8"
			echo -e "\033[43;31m Delete $IPADDR:$PORT End \033[0m"
		done
	fi
	exit 0
fi

if [ "$1" == "service" ];then
	read -p "设置成服务会重启系统,我也不建议你注册成服务,确定要操作么,输入[yes/no]?" input
	echo $input
	if [ $input = "yes" ];then
		for p in ${!IPADDRS[@]}; do
			IPADDR=${IPADDRS[$p]}
			PORT=$FIRSTPORT
			echo -e "\033[43;31m service $IPADDR:$PORT Start \033[0m"
			zks=/usr/lib/systemd/system/zookeeper.service
			sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "touch $zks && echo '[Unit]' >> $zks && echo 'Description=zookeeper-Cluster' >> $zks && echo 'After=network.target' >> $zks && echo '[Service]' >> $zks && echo 'Type=forking' >> $zks && echo 'ExecStart=$ZOOHOME/zookeeper-3.5.6-$PORT/bin/zkServer.sh start' >> $zks && echo 'ExecReload=$ZOOHOME/zookeeper-3.5.6-$PORT/bin/zkServer.sh restart' >> $zks && echo 'ExecStop=$ZOOHOME/zookeeper-3.5.6-$PORT/bin/zkServer.sh stop' >> $zks && echo 'PrivateTmp=true' >> $zks && echo '[Install]' >> $zks && echo 'WantedBy=multi-user.target' >> $zks "
			echo -e "\033[43;31m service $IPADDR:$PORT End \033[0m"
			echo -e "\033[43;31m systemctl $IPADDR Start \033[0m"
			sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "systemctl daemon-reload && reboot"
			echo -e "\033[43;31m systemctl $IPADDR End \033[0m"
		done
	fi
	exit 0
fi


echo "Usage: $0 [install|make|start|stop|restart|delete]"
echo "install     -- step1:yum安装zookeeper-3.5.6集群所需要的环境以及jdk"
echo "make        -- step2:编译zookeeper-3.5.6源码并初始化zookeeper-3.5.6集群实例和配置"
echo "start       -- step3:运行集群所有节点并构建成集群,注意要关闭防火墙或开放对应的端口"
echo "stop        -- step4:停止集群所有节点"
echo "restart     -- step4:重启集群所有节点"
echo "delete      -- step5:删除前请先stop,此操作会删除整个集群所有数据包括jdk环境,请谨慎操作!"


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zookeeper是一个分布式的一致性协调服务,常用于分布式系统中的协调管理。在搭建Zookeeper集群之前,需要先安装好Java环境,具体步骤如下: 1. 下载Zookeeper安装包,并解压到指定目录。 2. 在Zookeeper的conf目录下,新建一个名为zoo.cfg的文件,配置Zookeeper集群的相关参数,例如: ``` tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 server.1=192.168.1.101:2888:3888 server.2=192.168.1.102:2888:3888 server.3=192.168.1.103:2888:3888 ``` 其中,tickTime表示Zookeeper中的基准时间单位,initLimit和syncLimit表示Zookeeper集群中的Follower节点与Leader节点之间的通信超时时间,dataDir表示Zookeeper中数据存储的目录,clientPort表示Zookeeper的客户端连接端口,server.x表示Zookeeper集群中的各节点信息。 3. 在每个节点的dataDir目录下,新建一个名为myid的文件,并将当前节点的编号写入该文件中,例如: ``` 1 ``` 4. 启动Zookeeper集群,可以通过命令行执行以下命令: ``` bin/zkServer.sh start ``` 5. 检查Zookeeper集群的状态,可以通过命令行执行以下命令: ``` bin/zkServer.sh status ``` 如果集群状态正常,显示类似于“Mode: leader”的信息,表示当前节点为Leader节点。 6. 使用Zookeeper集群,可以通过Java API或命令行客户端进行操作,例如创建节点、删除节点、获取节点列表等。 以上就是Zookeeper集群搭建简单步骤,需要注意的是,Zookeeper集群的节点数应该为奇数,推荐使用3、5、7等节点数。同时,Zookeeper集群的配置需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值