ZooKeeper3.4.6二进制包的集群的搭建
zookeeper是和etcd,consul,nacos这样做一样的微服务注册以及微服务发现事情的可分布式集群部署的软件,通常Hadoop以及k8s都是使用Zookeeper作服务的管理工作,Hadoop和zookeeper一样都是基于Java语言开发的,因此契合度比较高哦(consul是go语言所开发,因此consul可能更适用于k8s)。
不用说,zookeeper也是可以做成分布式集群的,并且该集群相对于MySQL这样的集群来说安装部署更简单一些,但使用难度是更高的(没有什么事是简单的,要么安装部署简单,实际使用就难,要么,安装部署比较困难,实际使用就简单一些)。
zookeeper集群搭建的环境准备:
环境介绍:
前面也说了zookeeper是Java所编写的程序,因此,Java的环境jdk是必不可少的,当然,测试实验可以使用openjdk,如果是生产环境,请老老实实的安装主流jdk,具体的安装jdk不多做介绍,请自行百度。
zookeeper二进制安装包的获取:zookeeper是Apache基金会的一个项目,因此获取途径相对就很多了,各大国内源码站都有的。或者官网http://archive.apache.org/dist/zookeeper/。本次案例使用的版本为3.4.6二进制安装版(zookeeper-3.4.6.tar.gz)。
计划使用三台机器,在每一个机器上安装一个zookeeper,三个zk组成一个集群(特别说明,集群通常都是奇数数目,奇数是为了方便高可用和选举leader)。
三台机器(虚拟机,centos7版本,内存,cpu无要求)都安装jdk1.8,IP地址分别为192.168.0.17,192.168.0.18,192.168.19.
集群尤其是分布式集群需要时间同步的,请自行搭建时间服务器或者别的方法解决时间同步问题(如何搭建可看博客https://blog.csdn.net/alwaysbefine/article/details/109055169)。
特别注意,解压后的文件夹放置在了 /usr/local/src/zookeeper-3.4.6
zk集群搭建前对zk的目录说明(假设解压在了/usr/local/src/zookeeper-3.4.6/目录下):
/usr/local/src/zookeeper-3.4.6/src/packages/rpm/init.d 这个目录内就一个zookeeper名字的文件,这个是启动脚本文件,该文件需要修改。启动脚本的好处是使得zk安装更加规范,便于管理。
/usr/local/src/zookeeper-3.4.6/bin 这个目录内需要注意两个文件,一个是zkEnv.sh 一个是zkServer.sh , 这两个脚本一个是配合上面所说的启动脚本设置环境变量,以及启动停止jar包的引用,zkServer.sh 文件是启动zk服务的脚本,在本例中,最终都是让zookeeper这个文件管理这两个文件。
zookeeper的主配置文件为/usr/local/src/zookeeper-3.4.6/conf/zoo_sample.cfg
使用自带的zookeeper这个脚本启动单节点服务:
一,添加用户,用户名为zookeeper,为了安全限制该用户的可执行权限以及不建立用户文件夹,命令为: useradd zsk -M -s /sbin/nologin
二,cp -a /usr/local/src/zookeeper-3.4.6/src/packages/rpm/init.d/zookeeper /etc/init.d/zk
给这个文件可执行权限 chmod +x /etc/iniit.d/zk
#将自启动脚本文件修改名称为zk,方便后续执行命令,命令简化一下
三,配置环境变量供后续脚本使用:vim /etc/profile 在该文件末尾添加如下内容后,保存退出,执行命令 source /etc/profile:
ZOOBINDIR=/usr/local/src/zookeeper-3.4.6/bin
PATH=.$PATH:$ZOOBINDIR
export PATH ZOOBINDIR
四,修改zookeeper的主配置文件,主配置文件的位置为/usr/local/src/zookeeper-3.4.6/conf/zoo_sample.cfg
cp -a /usr/local/src/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/src/zookeeper-3.4.6/conf/zoo.cfg
编辑该文件:vim /usr/local/src/zookeeper-3.4.6/conf/zoo.cfg #该文件内容比较少,主要是data也就是数据存放目录需要修改,默认是在tmp文件夹下,不是太好。以及集群的节点ID的定义。节点启动关闭所需要的pid文件也是在这个目录哦,很重要的。
dataDir=/usr/local/zk/
server.1=192.168.0.17:2888:3888
server.2=192.168.0.18:2888:3888
server.3=192.168.0.19:2888:3888
总共也就这么四行内容,2888和3888分别代表服务和选举时候的通信端口,(说明一下,在配置文件中也写了客户端连接的端口是2181.当然,为了安全可以更改的哦)datadir需要新建并赋予用户zookeeper权限。
mkdir /usr/local/zk/ && chown -Rf zookeeper. /usr/local/zk/
三个节点配置文件内容一样,没有变化,data存放的文件夹也一样建立,相同的zookeeper用户。
五,指定集群节点ID,以使节点能够通过ID推举出leader。在17 18 19 分别写入 1 2 3 到myid 这个文件。
echo "1" > /usr/local/zk/myid
echo "2" > /usr/local/zk/myid
echo "3" > /usr/local/zk/myid
六。返回到第二步,修改 /etc/init.d/zk 这个文件,这个脚本使用了两个方法,分别是启动daemon和停止daemon方法,restart是调用这两个方法,以复用代码。
daemon --user zookeeper zkServer.sh start 这一行修改为$ZOOBINDIR/zkServer.sh stop
daemon --user zookeeper zkServer.sh stop这一行修改为$ZOOBINDIR/zkServer.sh start
脚本全部内容为:
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ZooKeeper
#
# chkconfig: 2345 89 9
# description: zookeeper
source /etc/rc.d/init.d/functions
source /usr/libexec/zkEnv.sh
RETVAL=0
PIDFILE="${ZOOPIDFILE}"
desc="ZooKeeper daemon"
start() {
echo -n $"Starting $desc (zookeeper): "
$ZOOBINDIR/zkServer.sh start
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /usr/local/zk/zookeeper_server.pid
return $RETVAL
}
stop() {
echo -n $"Stopping $desc (zookeeper): "
$ZOOBINDIR/zkServer.sh stop
RETVAL=$?
sleep 5
echo
[ $RETVAL -eq 0 ] && rm -f /usr/local/zk/zookeeper_server.pid $PIDFILE
}
restart() {
stop
start
}
checkstatus(){
status -p $PIDFILE ${JAVA_HOME}/bin/java
RETVAL=$?
}
condrestart(){
[ -e /var/lock/subsys/zookeeper ] && restart || :
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
checkstatus
;;
restart)
restart
;;
condrestart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart}"
exit 1
esac
exit $RETVAL
七,修改/usr/local/src/zookeeper-3.4.6/bin/zkEvn.sh
ZOOBINDIR="${ZOOBINDIR:-/usr/local/src/zookeeper-3.4.6/bin}" #变量的值修改为"${ZOOBINDIR:-/usr/local/src/zookeeper-3.4.6/bin}"
cp -a /usr/local/src/zookeeper-3.4.6/bin/zkEvn.sh /usr/libexec/ #复制到libexec目录下
保存后,即可使用命令 service zk start 启动/停止节点了,在三个节点分别启动节点,不分先后顺序,即可自动选举出leader并自动组建成集群了。
总结:
需要修改的文件是五个文件:
/usr/local/src/zookeeper-3.4.6/conf/zoo.cfg#zk的主配置文件
/usr/libexec/zkEnv.sh#更详细的zk运行环境
/usr/local/zk/myid#节点ID保存文件
/etc/init.d/zk#自带的zk启动脚本
/etc/profile #添加环境变量
它们之间是有一定的需要一一对应的关系的。理顺它们之间的关系并且外部环境Java的jdk,防火墙和selinux是对集群有决定性的影响。厘清这些关系就可以顺利的搭建zk集群了。