【Linux存储系列教程】zookeeper中间件
【Linux存储系列教程】zookeeper中间件
一、关于zookeeper
1.zookeeper是什么
zookeeper
作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,zookeeper
作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理。zookeeper
是一个仲裁者的角色
简单的说zookeeper = 文件系统 + 通知机制
2.zookeeper的作用
- 命名服务
- 配置管理
- 集群管理
- 负载均衡
- 分布式锁
3.zookeeper的角色
- leader
- 主角色
- 处理数据
- 维持与follower的心跳,接收处理follower的消息
- 主角色
- follower
- 备用
- observer
- 与follower的区别就是,它不参与leader的选举
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