【Linux存储系列教程】zookeeper中间件

一、关于zookeeper

1.zookeeper是什么

zookeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,zookeeper作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理。
zookeeper是一个仲裁者的角色
简单的说zookeeper = 文件系统 + 通知机制

zookeeper01

2.zookeeper的作用

  1. 命名服务
  2. 配置管理
  3. 集群管理
  4. 负载均衡
  5. 分布式锁

3.zookeeper的角色

  • leader
    • 主角色
      • 处理数据
      • 维持与follower的心跳,接收处理follower的消息
  • follower
    • 备用
  • observer
    • 与follower的区别就是,它不参与leader的选举

zookeeper02

4.zookeeper的选举机制

  • 目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:

服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
服务器5启动,后面的逻辑同服务器4成为小弟。

5.znode类型

  • ZooKeeper的视图数据结构,很像Unix文件系统,也是树状的,这样可以确定每个路径都是唯一的。zookeeper的节点统一叫做znode

根据节点的生命周期,znode可以分为4种类型,分别是==持久节点==PERSISTENT、==持久顺序节点==PERSISTENT_SEQUENTIAL、==临时节点==EPHEMERAL、==临时顺序节点==EPHEMERAL_SEQUENTIAL

  • 持久节点PERSISTENT
    • 这类节点被创建后,就会一直存在于Zk服务器上。直到手动删除
  • 持久顺序节点PERSISTENT_SEQUENTIAL
    • 它的基本特性同持久节点,不同在于增加了顺序性。父节点会维护一个自增整性数字,用于子节点的创建的先后顺序。
  • 临时节点EPHEMERAL
    • 临时节点的生命周期与客户端的会话绑定,一旦客户端会话失效(非TCP连接断开),那么这个节点就会被自动清理掉。zk规定临时节点只能作为叶子节点。
  • 临时顺序节点EPHEMERAL_SEQUENTIAL
    • 基本特性同临时节点,添加了顺序的特性。

二、zookeeper集群部署

1.环境介绍

三台虚拟机
IP:192.168.183.10 主机名:zk1.linux.com
IP:192.168.183.11 主机名:zk2.linux.com
IP:192.168.183.12 主机名:zk3.linux.com
jdk版本:jdk-8u191
zookeeper版本:3.7.1
Centos版本:7.9

2.准备阶段

A.所有主机关闭防火墙和SElinux、配置时间同步

过程省略

3.修改主机名和配置域名解析

[root@zk1 ~]# hostnamectl set-hostname zk1
[root@zk2 ~]# hostnamectl set-hostname zk2
[root@zk3 ~]# hostnamectl set-hostname zk3
[root@zk1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.140.10 zk1.linux.com zk1
192.168.140.11 zk2.linux.com zk2
192.168.140.12 zk3.linux.com zk3

hosts文件拷贝给其他机器

[root@zk1 ~]# for i in 11 12
> do
> scp -r /etc/hosts root@192.168.140.$i:/etc/
> done

3.安装jdk环境

A.下载jdk

如果没有wget命令,请安装yum install -y wget

[root@zk1 ~]# wget https://mirrors.huaweicloud.com/java/jdk/8u191-b12/jdk-8u191-linux-x64.tar.gz

B.安装jdk

[root@zk1 ~]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local
[root@zk1 ~]# ls /usr/local/
bin/          games/        jdk1.8.0_191/ lib64/        sbin/         src/
etc/          include/      lib/          libexec/      share/

C.把jdk拷贝给其他机器

[root@zk1 ~]# for i in 2 3
> do
> scp -r /usr/local/jdk1.8.0_191 root@zk$i:/usr/local/
> done

D.配置jdk环境

[root@zk1 ~]# vim /etc/profile
#配置文件并不完整,仅展示添加的地方
export JAVA_HOME=/usr/local/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin	#配置文件末尾添加2行内容

E。让配置文件生效

[root@zk1 ~]# source /etc/profile
[root@zk1 ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

F.把配置文件拷贝给另外2台机器

[root@zk1 ~]# for i in 2 3
> do
> scp -r /etc/profile root@zk$i:/etc/
> done

G.刷新配置文件,并查看jdk环境

请自行到另外2台机器操作

[root@zk2 ~]# source /etc/profile
[root@zk2 ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@zk3 ~]# source /etc/profile
[root@zk3 ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

4.三台服务器配置zookeeper

A.下载zookeeper

[root@zk1 ~]# wget --no-check-certificate https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz

B.解压zookeeper并改名

[root@zk1 ~]# tar xf apache-zookeeper-3.7.1-bin.tar.gz -C /usr/local/
[root@zk1 ~]# ls /usr/local/
apache-zookeeper-3.7.1-bin/ include/                    libexec/
bin/                        jdk1.8.0_191/               sbin/
etc/                        lib/                        share/
games/                      lib64/                      src/

[root@zk1 ~]# mv /usr/local/apache-zookeeper-3.7.1-bin/ /usr/local/zookeeper37
[root@zk1 ~]# ls /usr/local/
bin  games    jdk1.8.0_191  lib64    sbin   src
etc  include  lib           libexec  share  zookeeper37

C.拷贝文件给另外2台服务器

[root@zk1 ~]# for i in 2 3
> do
> scp -r /usr/local/zookeeper37/ root@zk$i:/usr/local/
> done

D.修改zookeeper配置文件

[root@zk1 ~]# cp /usr/local/zookeeper37/conf/zoo_sample.cfg /usr/local/zookeeper37/conf/zoo.cfg
[root@zk1 ~]# cd /usr/local/zookeeper37/conf/
创建用到的数据目录和日志目录
[root@zk1 conf]# mkdir /usr/local/zookeeper37/zkdata
[root@zk1 conf]# mkdir /usr/local/zookeeper37/zklogs
修改配置文件
[root@zk1 conf]# vim /usr/local/zookeeper37/conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper37/zkdata		#修改默认的tmp目录
dataLogDir=/usr/local/zookeeper37/zklogs	#用于存放日志
clientPort=2181
server.1=192.168.140.10:2888:3888	#新增以下内容
server.2=192.168.140.11:2888:3888
server.3=192.168.140.12:2888:3888

E.在数据目录下创建myid文件

此处的数字1对应着配置文件中的server

[root@zk1 conf]# echo 1 > /usr/local/zookeeper37/zkdata/myid

F.拷贝配置文件给其他服务器

[root@zk1 conf]# for i in 11 12
> do
> rsync -ra /usr/local/zookeeper37/ root@192.168.140.$i:/usr/local/zookeeper37/
> done

G.修改另外2台服务器的myid文件

此处的myid文件中的数字,对应着配置文件中的数字

[root@zk2 ~]# echo 2 > /usr/local/zookeeper37/zkdata/myid
[root@zk3 ~]# echo 3 > /usr/local/zookeeper37/zkdata/myid

H.依次启动zookeeper

[root@zk1 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Starting zookeeper ... FAILED TO START

[root@zk1 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.	#第一次启动报错是正常的

[root@zk1 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@zk2 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Starting zookeeper ... FAILED TO START

[root@zk2 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@zk3 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Starting zookeeper ... FAILED TO START

[root@zk3 ~]# bash /usr/local/zookeeper37/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper37/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader