官方网站,https://zookeeper.apache.org/

1、下载

  • 在首页中点击 Download
  • 单机部署zookeeper脚本 zookeeper单机集群_单机部署zookeeper脚本

  • 选择下载的版本,这里我使用了最新版本,在生产环境中建议使用稳定版
  • 单机部署zookeeper脚本 zookeeper单机集群_单机部署zookeeper脚本_02

  • 下载

单机部署zookeeper脚本 zookeeper单机集群_服务器_03

2、安装

  • 将安装包拷贝到linux系统中

单机部署zookeeper脚本 zookeeper单机集群_zookeeper_04

  • 在安装 zookeeper 时,请确保系统中已经安装了 jdk 环境,jdk 环境的安装请参考其它文章。
  • 解压到指定目录
tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz -C /usr/zookeeper/
  • 解压后目录结构如下

单机部署zookeeper脚本 zookeeper单机集群_zookeeper_05

2.1 单机
配置
  • 将conf 这个路径下的 zoo_sample.cfg 修改为 zoo.cfg,zk启动默认加载 zoo.cfg 文件。
mv conf/zoo_sample.cfg zoo.cfg
  • 打开 zoo.cfg 文件,修改 dataDir 路径
// 编辑 zoo.cfg 文件
vim zoo.cfg
// 修改内容如下
dataDir=/usr/zookeeper/apache-zookeeper-3.6.2-bin/zkData
  • 在 /usr/zookeeper/apache-zookeeper-3.6.2-bin/ 目录下创建 zkData 文件夹
mkdir zkData
启动
  • 启动
bin/zkServer.sh start
  • 查看进程是否启动
jps
  • 查看状态
bin/zkServer.sh status
  • 运行结果

单机部署zookeeper脚本 zookeeper单机集群_java_06

  • 启动客户端
bin/zkCli.sh
  • 退出客户端
quit
  • 停止
bin/zkServer.sh stop
  • 配置zk环境变量
vim /etc/profile

// 配置zk环境变量
export JAVA_HOME=/home/jisen/app/jdk/jdk1.8.0_261
export ZOOKEEPER_HOME=/usr/zookeeper/apache-zookeeper-3.6.2-bin
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin

// 保存后重新加载环境变量
source /etc/profile
参数配置解读

Zookeeper中的配置文件zoo.cfg中参数含义解读如下:

  • tickTime=2000
    通信心跳数,Zookeeper 服务器与客户端心跳时间,单位毫秒。Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。 它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
  • initLimit=10
    LF 初始通信时限
    集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
  • syncLimit=5
    LF 同步通信时限
    集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
  • dataDir
    数据文件目录 + 数据持久化路径。
    主要用于保存 Zookeeper 中的数据。
  • clientPort=2181
    客户端连接端口
  • maxClientCnxns=60
    客户端最大的连接数,默认未启动
2.2 集群
  • 在单机配置 zoo.cfg基础上在文件末尾加上集群信息
# 配置集群信息 
# server.myid=服务器地址:port1:port2
# myid: 对应配置文件中 dataDir 目录下 myid 文件里的值,表示服务器编号
# port1: 服务器 Follower 与集群中的 Leader 服务器交换信息的端口
# port2: 若集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器间相互通信的端口。
# 避免不必要的出错,将本机节点用 0.0.0.0 IP代替主机名
server.1=centos103:2888:3888
server.2=centos104:2888:3888
server.3=centos105:2888:3888
  • 在配置的 dataDir 目录下创建 myid
echo 1 > /usr/zookeeper/apache-zookeeper-3.6.2-bin/zkData/myid
  • 将配置文件分发给集群
scp -r /usr/zookeeper/ root@centos105:/usr/zookeeper/
scp /etc/profile root@centos105:/etc/profile
source /etc/profile
  • 修改各个服务器上的myid,使其对应配置文件中的myid
  • 这里为了测试方便我关闭了防火墙
// 查看防火墙状态
firewall-cmd --state
// 停止防火墙
systemctl stop firewalld.service
// 禁止防火墙开机启动
systemctl disable firewalld.service
  • 前台启动zk
zkServer.sh start-foreground
  • 集群启动报异常
2021-02-21 14:44:53,529 [myid:2] - WARN  [QuorumConnectionThread-[myid=2]-1:QuorumCnxManager@400] - Cannot open channel to 1 at election address centos103/192.168.0.103:3888
java.net.ConnectException: 拒绝连接 (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
        at java.net.Socket.connect(Socket.java:606)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:383)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:457)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
  • 解决方法,在配置文件 zoo.cfg 中将本机节点用 0.0.0.0 IP代替主机名
  • 运行结果

单机部署zookeeper脚本 zookeeper单机集群_java_07