我们在工作中经常会用到zookeeper,多用来做数据发布与订阅(配置中心)、负载均衡、命名服务(Naming Service)、分布式通知/协调、集群管理与Master选举、分布式锁、分布式队列等。维基百科上是这样介绍zookeeper的
Apache ZooKeeper是Apache软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。
ZooKeeper的架构通过冗余服务实现高可用性。因此,如果第一次无应答,客户端就可以询问另一台ZooKeeper主机。ZooKeeper节点将它们的数据存储于一个分层的命名空间,非常类似于一个文件系统或一个前缀树结构。客户端可以在节点读写,从而以这种方式拥有一个共享的配置服务。更新是全序的。
接下来我们就从0开始搭建一个最简单的zookeeper集群吧。
首先我们先准备三台服务器(CentOS8),并给设置主机名为node1、node2、node3方便操作,更清晰。(为什么是三台,因为zookeeper节点数要是奇数个,今天搭建最简单的所以最少得三台机器)
准备好三台服务器后我们第一步先修改主机名以及让三台机器相互能ping通主机名
vim /etc/hosts
这是node1的配置,node2和node3同理改掉节点名就好
127.0.0.1 localhost node1 localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.244.128 node1
192.168.244.129 node2
192.168.244.130 node3
配置成功我们尝试ping其他节点是否互通,互通证明配置成功
接下来运行zookeeper我们还必须要安装Java环境,所以在配置集群之前还需要安装上jdk,jdk的安装,我们采用比较简单的方式,直接通过yum来安装
yum install java-1.8.0-openjdk* -y
三台机器通过上述指令安装即可,通过java
或者java -version
来验证是否安装成功
现在去下载我们要搭建集群的zookeeper包,有一点要注意的是,我们下载3.5以后的版本得下载bin包,不然可能会启动找不到主类的问题
zookeeper下载地址
好了,到这里我们搭建zookeeper集群的先决条件已经基本满足了,我们来看看我们的环境
三台服务器(CentOS8)
JDK版本(1.8.0_252)
zookeeper(3.4.14)
开干开干,zookeeper集群其实很简单,下面我们正式开始
先解压zookeeper包到服务器上
tar -zxvf zookeeper-3.4.14 -C /usr/local/zk
我们进入conf目录下,会有个zoo_sample.cfg文件,我们先给它重命名为zoo.cfg
mv zoo_sample.cfg zoo.cfg
然后vim zoo.cfg
编辑内容
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
重点要注意两点
(1)dataDir:data目录,我们搭建集群的时候需要在设置的此目录下创建名叫myid的文件,内容写上此zookeeper的节点编号,例如节点1就写入1
echo 1 > /tmp/zookeeper/myid
(2)server.1、server.2、server.3就代表我们的三个节点,就通过myid去确定是哪个节点
三个节点的配置文件内容是一样的,唯一区别就是dataDir配置的路径下的myid文件中节点编号不一样
此时我们集群配置就算完成了,接下来我们就可以启动三台zookeeper查看效果了
cd /usr/local/zk/zookeeper/zookeeper-3.4.14/bin
./zkServer.sh start
常用的指令有
./zkServer.sh start
启动zookeeper
./zkServer.sh restart
重启zookeeper
./zkServer.sh stopp
停止zookeeper
./zkServer.sh status
查看zookeeper状态
cat zookeeper.out
通过zookeeper.out文件查看日志
我们启动成功之后可以查看zookeeper的状态,会发现有一个节点是leader,其余两个是follower,而且重启leader之后会发现它变成了follower,而其余两个中会选出一个新的leader。
常见的启动失败的问题,查看zookeeper.out文件排查
(1)防火墙的问题,没有关闭防火墙可能会报拒绝连接等情况
(2)dataDir路径写的有问题
(3)端口被占用了,可以通过lsof -i:2181
来排查,杀死进程重启等