ZooKeeper :Shell脚本搭建单机版ZooKeeper

本文博主将使用​​Shell​​​脚本搭建单机版​​ZooKeeper​​​,上一篇博客介绍了使用​​Shell​​​脚本搭建​​Nacos​​集群:

  • ​​Spring Cloud Alibaba:搭建Nacos集群​​

方法其实是类似的,搭建集群版​​ZooKeeper​​以后再介绍,博主最近比较忙,要准备发小论文和申请自由探索。

​ZooKeeper​​​是分布式应用程序的高性能协调服务,分布式应用程序可以基于​​ZooKeeper​​实现诸如数据发布/订阅负载均衡命名服务分布式协调/通知集群管理Master选举分布式锁服务注册中心等功能。

​ZooKeeper​​常用的使用场景就是用于担任服务注册中心。服务提供者将自己的信息注册到​​ZooKeeper​​​,服务消费者在进行服务调用的时候先到​​ZooKeeper​​中查找服务,获取到服务提供者的信息之后,再去调用服务提供者的接口。

​ZooKeeper​​​的一些重要概念和实现原理留到以后再详细介绍,接下来博主将介绍使用​​Shell​​​脚本搭建单机版​​ZooKeeper​​​。首先需要创建虚拟机(博主创建的虚拟机配置是内存​​2G​​​、磁盘​​8G​​):

  • ​​VirtualBox安装CentOS7​​

设置静态​​IP​​​导致(为了防止​​IP​​地址动态分配导致的麻烦,下面这篇博客有进行介绍):

  • ​​Spring Cloud Alibaba:搭建Nacos集群​​

Shell脚本

搭建单机版​​ZooKeeper​​​的​​Shell​​脚本(脚本的注释写的比较详细):

#!/bin/bash

# author: itkaven
# input: zookeeper_version client_port

# 工具包存放路径
path="/usr/local"

# JDK解压后的目录名、压缩包名
jdk_work="jdk1.8.0_202"
jdk_file="jdk-8u202-linux-x64.tar.gz"

# Zookeeper版本号、解压后的目录名、压缩包名、数据存储路径、日志存储路径、客户端连接端口
zookeeper_version="$1"
zookeeper_work="apache-zookeeper-$zookeeper_version-bin"
zookeeper_file="$zookeeper_work.tar.gz"
data_dir="$path/$zookeeper_work/data"
log_dir="$path/$zookeeper_work/log"
client_port="$2"

install_jdk() {
if [ ! -e "$path/$jdk_work" ]; then
echo "没有安装JDK,准备安装JDK($jdk_work)!"
if [ ! -e "$path/$jdk_file" ]; then
echo "请上传JDK压缩包($jdk_file)!"
else
echo "JDK压缩包($jdk_file)已经上传!"
echo "开始解压!"
tar -zxvf "$path/$jdk_file" -C "$path"
echo "删除压缩包!"
rm -f "$path/$jdk_file"
echo "配置JDK环境变量!"
echo "export JAVA_HOME=$path/$jdk_work" >> /etc/profile
source /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile
source /etc/profile
fi
else
echo "已经安装JDK($jdk_work)!"
fi
}

download_zookeeper() {
if [ -e "$path/$zookeeper_work" ]; then
echo "Zookeeper压缩包已经存在!"
else
echo "Zookeeper压缩包不存在,等待下载!"
yum install -y wget
wget -P "$path" --no-check-certificate "https://downloads.apache.org/zookeeper/zookeeper-$zookeeper_version/$zookeeper_file"
echo "Zookeeper压缩包下载完成!"
echo "开始解压Zookeeper压缩包!"
tar -zxvf "$path/$zookeeper_file" -C "$path"
echo "删除Zookeeper压缩包!"
rm -f "$path/$zookeeper_file"
fi
}

config_and_run_zookeeper() {
# shellcheck disable=SC2164
cd "$path/$zookeeper_work/conf"
echo "copy配置文件(zoo_sample.cfg -> zoo.cfg)!"
cp "zoo_sample.cfg" "zoo.cfg"
echo "修改zoo.cfg配置文件(dataDir=$data_dir clientPort=$client_port dataLogDir=$log_dir)!"
sed -i "s#dataDir=.*#dataDir=$data_dir#g" "zoo.cfg"
sed -i "s#clientPort=.*#clientPort=$client_port#g" "zoo.cfg"
echo "dataLogDir=$log_dir" >> "zoo.cfg"
echo "创建文件夹($data_dir $log_dir)!"
mkdir "$data_dir" "$log_dir"
echo "为了方便,关闭防火墙!"
systemctl stop firewalld
echo "启动Zookeeper!"
# shellcheck disable=SC2164
cd "$path/$zookeeper_work/bin"
./zkServer.sh start
}

if [ $# -ne "2" ]; then
echo "请输入Zookeeper版本号和启动端口!"
else
install_jdk
download_zookeeper
config_and_run_zookeeper
fi

脚本的意图:

  • 安装​​JDK​​​,需要提前将​​JDK​​​压缩包放到虚拟机的​​/usr/local/​​​路径下,博主不喜欢使用​​yum​​​安装​​JDK​​​,但使用​​wget​​​命令下载​​JDK​​​压缩包得到的是缺损包,因为​​Oracle​​​官方有验证;所以博主采取了折中的方式,手动上传​​JDK​​压缩包,文件解压和配置环境变量就通过脚本完成。
  • 下载​​ZooKeeper​​​压缩包(从​​ZooKeeper​​官网),再进行解压。
  • 配置与运行​​ZooKeeper​​​,创建配置文件​​zoo.cfg​​​(通过​​copy​​​官方给的样例配置文件​​zoo_sample.cfg​​​),在配置文件​​zoo.cfg​​​中修改数据存储路径、日志存储路径以及客户端连接端口这三个配置。关闭防火墙(方便远程连接​​ZooKeeper​​​),以单机方式启动​​ZooKeeper​​。

将下载好的​​JDK​​​压缩包放到虚拟机的​​/usr/local/​​路径下:

ZooKeeper :Shell脚本搭建单机版ZooKeeper_zookeeper


如果​​JDK​​版本和博主不相同,需要修改脚本的这两个变量:

# JDK解压后的目录名、压缩包名
jdk_work="jdk1.8.0_202"
jdk_file="jdk-8u202-linux-x64.tar.gz"

先将该​​Shell​​脚本复制到虚拟机上:

vim zookeeper.sh

ZooKeeper :Shell脚本搭建单机版ZooKeeper_分布式_02


保存后再退出:

  • ​​怎么保存退出 vim 编辑​​

修改​​zookeeper.sh​​脚本的权限(不然没有运行权限):

chmod 700 zookeeper.sh

运行​​zookeeper.sh​​​脚本(​​ZooKeeper​​​版本为​​3.6.3​​​,客户端连接端口修改为​​9000​​):

./zookeeper.sh 3.6.3 9000

等待脚本执行完成。

ZooKeeper :Shell脚本搭建单机版ZooKeeper_压缩包_03


​ZooKeeper​​启动成功:

ZooKeeper :Shell脚本搭建单机版ZooKeeper_分布式_04


查看​​ZooKeeper​​服务的状态:

./zkServer.sh status

ZooKeeper :Shell脚本搭建单机版ZooKeeper_分布式_05

​zookeeper.sh​​​脚本执行完成后,配置文件​​zoo.cfg​​也成功被创建和修改了:

ZooKeeper :Shell脚本搭建单机版ZooKeeper_分布式_06

  • ​tickTime​​​:​​ZooKeeper​​​中最小的时间单位长度 (默认​​2000ms​​)。
  • ​initLimit​​​:​​follower​​​节点启动后与​​leader​​​节点完成数据同步的时间(指定为​​tickTime​​​的倍数,默认​​10​​​倍,即​​20s​​)。
  • ​syncLimit​​​:​​leader​​​节点和​​follower​​​节点进行心跳检测的最大延迟时间(指定为​​tickTime​​​的倍数,默认​​5​​​倍,即​​10s​​)。
  • ​dataDir​​​:表示​​ZooKeeper​​​存储快照文件的目录(默认为​​/tmp/zookeeper​​)。
  • ​dataLogDir​​​:表示​​ZooKeeper​​​事务日志的存储路径,默认指定在​​dataDir​​目录下 。
  • ​clientPort​​​:表示​​ZooKeeper​​​客户端和​​ZooKeeper​​​服务端建立连接的端口号(默认 ​​2181​​)。

​dataDir​​​和​​dataLogDir​​也被创建了:

ZooKeeper :Shell脚本搭建单机版ZooKeeper_云原生_07


​ZooKeeper​​提供的脚本程序:

ZooKeeper :Shell脚本搭建单机版ZooKeeper_客户端_08


​zkServer.sh​​​用于启动​​ZooKeeper​​​服务,​​zkCli.sh​​​以客户端的方式连接​​ZooKeeper​​​服务。使用​​zkCli.sh​​​连接​​ZooKeeper​​服务:

./zkCli.sh -timeout 5000 -server 127.0.0.1:9000
  • ​timeout​​​:表示​​ZooKeeper​​​客户端向​​ZooKeeper​​​服务端发送心跳的时间间隔,单位为毫秒。因为​​ZooKeeper​​​客户端与​​ZooKeeper​​​服务端的连接状态是通过心跳检测来维护的,如果在指定的时间间隔内,​​ZooKeeper​​​客户端没有向​​ZooKeeper​​​服务端发送心跳包,​​ZooKeeper​​​服务端则会断开与该​​ZooKeeper​​​客户端的连接。参数​​5000​​​,表示​​ZooKeeper​​​客户端向​​ZooKeeper​​​服务端发送心跳的间隔为​​5​​秒。
  • ​server​​​:指定​​ZooKeeper​​​服务端的​​IP​​​地址与客户端连接端口,​​ZooKeeper​​​默认的客户端连接端口为​​2181​​​,因为博主修改了​​ZooKeeper​​客户端连接端口配置,因此要指定为修改后的客户端连接端口。

​ZooKeeper​​​客户端成功连接​​ZooKeeper​​服务端:

ZooKeeper :Shell脚本搭建单机版ZooKeeper_分布式_09


查看​​ZooKeeper​​​给客户端提供了哪些命令(​​help​​​,其实服务端并没有提供​​help​​命令,当客户端执行的命令在服务端不存在时,服务端会返回提供的所有命令):

ZooKeeper :Shell脚本搭建单机版ZooKeeper_客户端_10


​ZooKeeper​​​提供给客户端的​​ls​​​命令(用于列出指定路径下的​​Znode​​​,这些​​ZooKeeper​​​的重要概念以后会详细介绍)和​​Linux​​​的​​ls​​命令(用于列出指定路径下的文件)类似。其他命令这里先不进行介绍,博主以后会详细介绍这些命令。

ZooKeeper :Shell脚本搭建单机版ZooKeeper_压缩包_11


使用​​Shell​​​脚本搭建单机版​​ZooKeeper​​就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。