zookeeper集群的安装以及遇到的问题

2020-01-31  本文已影响0人  惜鸟

一、介绍

zookeeper集群的安装网上有很多很好的文章,我也是参考那些文章来做的,这里写这篇文章的目的一方面是为了自己学习记忆和以后查找方便,另一方面希望帮助其他有需要的同学共同学习。因为其他的文章只写了安装过程,并没有给出下载地址,在安装过程中需要自己去找,所以我这里主要是给出了安装zookeeper的下载地址,由于网络的限制,推荐使用的是清华开源镜像下载,网速非常快。

二、安装前准备

1. 下载jdk

tar -zxvf jdk-8u191-linux-x64.tar.gz -C /opt
# 编辑profile文件
vi /etc/profile
# 在profile文件末尾添加JAVA_HOME路径
export JAVA_HOME=/opt/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
# 1、查看版本,出现版本号说明java安装成功
java -version
#2、 直接通过jps验证
jps

2. 下载zookeeper(为了提高下载速度推荐使用清华开源镜像下载)

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -zxvf zookeeper-3.4.14.tar.gz -C /opt
# 进入zookeeper配置文件目录
 cd /opt/zookeeper-3.4.14/conf
# 将zoo_sample.cfg文件复制一份命名为zoo.cfg
cp zoo_sample.cfg  zoo.cfg
# 修改zoo.cfg
vi zoo.cfg
# The number of milliseconds of each tick
# 每一次心跳间隔时间,时间单位是毫秒
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 初始的同步阶段可以接受的心跳次数,这里可以接受的时间间隔为:10*2000 =20秒
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# 在发送请求和获取确认之间可以传递的心跳数,这里时间间隔为:5*2000=10秒
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 快照存储的目录,不要使用/tmp存储,/tmp在这里只是作为例子的缘故。
dataDir=/tmp/zookeeper
# the port at which the clients will connect
# 客户端将连接的端口
clientPort=2181
# zookeeper集群的配置
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888

server.A=B:C:D其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

三、zookeeper集群配置

除了修改zoo.cfg 配置文件,集群模式下还要配置一个文件myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,zookeeper 启动时会读取这个文件拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.120.11 node01
192.168.120.12 node02
192.168.120.13 node03
# 拷贝/etc/hosts文件
scp /etc/hosts node02:/etc/hosts
scp /etc/hosts node03:/etc/hosts
# 拷贝/etc/profile
scp /etc/profile node02:/etc/profile
scp /etc/profile node03:/etc/profile
# 拷贝/opt/zookeeper,因为是拷贝文件夹所以需要添加`-r`
scp -r /opt/zookeeper-3.4.14 node02:/opt
scp -r /opt/zookeeper-3.4.14 node03:/opt
# 进入zookeeper的bin目录
cd /opt/zookeeper-3.4.14/bin
# 启动zookeeper
./zkServer.sh start
# 查看zookeeper状态
./zkServer.sh status

四、遇到的问题

ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
# 重新启动,会在当前目录生成zookeeper.out文件
./zkServer.sh restart
# 查看zookeeper.out文件
cat zookeeper.out

可以看到如下报错

WARN  [WorkerSender[myid=1]:QuorumCnxManager@584] - Cannot open channel to 3 at election address /192.168.120.13:3888
java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.zookeeper.server.quorum.Learner.connectToLeader(Learner.java:229)
    at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:72)
    at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:981)
# 查看防火墙的状态
systemctl status firewalld.service
# 关闭防火墙
systemctl stop firewalld.service
# 禁止开机启动防火墙
systemctl disable firewalld.service
防火墙状态

其他zookeeper问题

  1. 一台 zk 节点重启后始终无法加入到集群中, 无法对外提供服务
  2. zk的log和snapshot占用大量空间
  3. 某台客户端上有的进程可以连接到zk, 有的无法连接
  4. 一台zk服务器无法对外提供服务,报错"Have smaller server identifier, so dropping
    the connection."
  5. zk客户端偶尔无法成功连接到zk server
解决方法查看这篇文章Zookeeper运维问题集锦
上一篇 下一篇

猜你喜欢

热点阅读