一、前言

1、ZooKeeper简介

ZooKeeper是一个开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现。ZooKeeper为分布式应用提供一致性服务,提供的功能包括:分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)、分布式锁(Distributed Lock)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。

ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

2、ZooKeeper集群角色说明

ZooKeeper主要有领导者(Leader)、跟随者(Follower)和观察者(Observer)三种角色。

角色 说明
领导者(Leader) 为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。
跟随者(Follower) 为客户端提供读服务,如果是写服务则转发给Leader。在选举过程中参与投票。
观察者(Observer) 为客户端提供读服务器,如果是写服务则转发给Leader。不参与选举过程中的投票,也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色于zookeeper3.3系列新增的角色。

二、准备工作

1、集群节点规划

ZooKeeper在提供分布式锁等服务的时候需要过半数的节点可用。另外高可用的诉求来说节点的个数必须>1,所以ZooKeeper集群需要是>1的奇数节点。例如3、5、7等等。
本次我们规划三个节点,操作系统选用CnetOS 7

节点名 IP 说明
zk01 192.168.88.11 ZooKeeper节点
zk02 192.168.88.12 ZooKeeper节点
zk03 192.168.88.13 ZooKeeper节点
2、软件版本说明
说明
Linux Server CentOS 7
JDK 1.8.0_161
ZooKeeper 3.4.11

三、部署过程

1、部署JDK8

参考CentOS下部署Java7/Java8
https://ken.io/note/centos-java-setup

2、部署ZooKeeper

本次一共要部署三个ZooKeeper节点,所有文中没有指定机器的操作都表示每个节点都要执行该操作

  • 下载ZooKeeper最新Rlease版本

官方镜像选择:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

cd /home/download
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
  • 创建ZooKeeper相关目录
#创建应用目录
mkdir /usr/zookeeper

#创建数据目录
mkdir /zookeeper
mkdir /zookeeper/data
mkdir /zookeeper/logs
  • 解压到指定目录
tar -zvxf zookeeper-3.4.11.tar.gz -C /usr/zookeeper
  • 配置环境变量
#修改环境变量文件
vi /etc/profile

#增加以下内容
export ZOOKEEPER_HOME=/usr/zookeeper/zookeeper-3.4.11
export PATH=$ZOOKEEPER_HOME/bin:$PATH

#使环境变量生效
source /etc/profile

#查看配置结果
echo $ZOOKEEPER_HOME

既然已配置环境变量,为了方便访问ZooKeeper目录
后续通过$ZOOKEEPER_HOME代替/usr/zookeeper/zookeeper-3.4.11

  • 配置ZooKeeper
#进入ZooKeeper配置目录
cd $ZOOKEEPER_HOME/conf

#新建配置文件
vi zoo.cfg

#写入以下内容并保存

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/data
dataLogDir=/zookeeper/logs
clientPort=2181
server.1=192.168.88.11:2888:3888
server.2=192.168.88.12:2888:3888
server.3=192.168.88.13:2888:3888
  • 配置节点标识

zk01:

echo "1" > /zookeeper/data/myid

zk02:

echo "2" > /zookeeper/data/myid

zk03:

echo "3" > /zookeeper/data/myid
  • 防火墙配置
#开放端口
firewall-cmd --add-port=2181/tcp --permanent
firewall-cmd --add-port=2888/tcp --permanent
firewall-cmd --add-port=3888/tcp --permanent

#重新加载防火墙配置
firewall-cmd --reload
  • 启动ZooKeeper
#进入ZooKeeper bin目录
cd $ZOOKEEPER_HOME/bin

#启动
sh zkServer.sh start

出现以下字样表示启动成功:

ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Starting zookeeper … STARTED

四、集群查看&连接测试

  • 查看节点状态
sh $ZOOKEEPER_HOME/bin/zkServer.sh status

#状态信息
ZooKeeper JMX enabled by default
Using config: /usr/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
Mode: follower

#如果为领导者节点则Mode:leader
  • 客户端连接测试

这里随机选其中一个节点作为客户端连接其他节点即可

#指定Server进行连接
sh $ZOOKEEPER_HOME/bin/zkCli.sh -server 192.168.88.13:2181

#正常连接后会进入ZooKeeper命令行,显示如下:
[zk: 192.168.88.13:2181(CONNECTED) 0]

输入命令测试:

#查看ZooKeeper根
[zk: 192.168.88.13:2181(CONNECTED) 0] ls /
[zookeeper]

五、备注

  • ZooKeeper常用配置项说明
配置项 名称 ken.io 的说明
tickTime CS通信心跳间隔 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每间隔 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
initLimit LF初始通信时限 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
syncLimit LF同步通信时限 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
dataDir 数据文件目录 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里
dataLogDir 日志文件目录 Zookeeper保存日志文件的目录
clientPort 客户端连接端口 客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
server.N 服务器名称与地址 从N开始依次为:服务编号、服务地址、LF通信端口、选举端口;例如:server.1=192.168.88.11:2888:3888
  • 本文参考

https://www.jianshu.com/p/abbc1411ed9d
https://zookeeper.apache.org/doc/current/zookeeperStarted.html