Zookeeper入门

概述

Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。

工作机制
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
Zookeeper=文件系统+通知机制

特点

1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一定时间范围内,Client能读到最新数据。

数据结构

ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识
在这里插入图片描述

应用场景

提供的服务包括:统一命名服务统一配置管理统一集群管理服务器节点动态上下线软负载均衡等。

选举机制

关键参数

SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的,每投完一次票这个数据就会增加。

选举规则

集群首次启动时
SID小的会投票给SID大的,获得票数过半数者胜出。(服务器 id 大的胜出)
一旦产生leader,新节点加入时默认为follower,不会重选leader。

集群中不存在leader(存在leader时不会触发选举)
①EPOCH大的直接胜出
②EPOCH相同,事务id大的胜出
③事务id相同,服务器id大的胜出

Zookeeper集群安装

集群规划

主机名称IPSIDmyid
s1192.168.0.6311
s2192.168.0.6422
s2192.168.0.6533

JDK安装

到官网下载JDK: https://www.oracle.com/java/technologies/downloads/
将下载好的rpm包上传到各节点,并在各节点进行以下操作:

yum remove -y java*                                               #卸载自带openJDK
rpm -ivh jdk-18_linux-x64_bin.rpm                                 #安装JDK

Zookeeper安装、配置

安装

下载安装包

到官网下载安装包: https://zookeeper.apache.org/releases.html
本次安装基于centos7.6 jdk-18 zookeeper3.5.7,下载好安装包后上传apache-zookeeper-3.5.7-bin.tar.gz到各节点。

解压安装包
tar xf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/
mv /usr/local/apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7

配置

配置服务器编号

在各节点进行如下操作,myid根据规划进行配置(不能有多余空格)。

mkdir /usr/local/zookeeper-3.5.7/zkData                           #创建目录
vim /usr/local/zookeeper-3.5.7/zkData/myid                        #创建并写入myid
配置zoo.cfg文件

在各节点进行如下操作:

mv /usr/local/zookeeper-3.5.7/conf/zoo_sample.cfg /usr/local/zookeeper-3.5.7/conf/zoo.cfg

修改数据存储路径

vim /usr/local/zookeeper-3.5.7/conf/zoo.cfg

在这里插入图片描述
配置集群信息,在zoo.cfg配置文件最下方增加如下信息:
在这里插入图片描述
配置格式为:

server.<myid>=<节点ip/主机名>.<主备交换信息的端口号>.<选举leader时的通信端口号>
配置参数解读
tickTime = 2000        #通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit = 10         #Leader和Follower初始连接时能容忍的最多心跳数
syncLimit = 5          #Leader和Follower之间通信时间如果超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
dataDir                #保存Zookeeper中的数据
clientPort = 2181      #客户端连接端口,通常不做修改

启动集群并查看状态

启动服务端查看状态
/usr/local/zookeeper-3.5.7/bin/zkServer.sh start                #启动集群
/usr/local/zookeeper-3.5.7/bin/zkServer.sh status               #查看集群状态
启动客户端查看状态
/usr/local/zookeeper-3.5.7/bin/zkCli.sh -server s2:2181         #启动客户端,指向leader
help                                                            #显示所有操作命令
ls /                                                            #查看当前znode中所包含的内容 
quit                                                            #退出

集群启动、停止脚本参考:

#!/bin/bash
ZK_PATH="/usr/local/zookeeper-3.5.7"
ZK_LIST=(s1 s2 s3)

case $1 in
"start"){
for i in ${ZK_LIST[*]}
do
  echo ---------- zookeeper $i 启动 ------------
  ssh $i $ZK_PATH/bin/zkServer.sh start
done
};;

"stop"){
for i in ${ZK_LIST[*]}
do
  echo ---------- zookeeper $i 关闭 ------------
  ssh $i $ZK_PATH/bin/zkServer.sh stop
done
};;

"status"){
for i in ${ZK_LIST[*]}
do
  echo ---------- zookeeper $i 状态 ------------
  ssh $i $ZK_PATH/bin/zkServer.sh status
done
};;

esac

客户端常用命令操作

命令行语法

命令基本语法功能描述
help显示所有操作命令
ls 查看当前 znode 的子节点 [可监听]
-w 监听子节点变化
-s 附加次级信息
create普通创建
-s 含有序列
-e 临时(重启或者超时消失)
get 获得节点的值 [可监听]
-w 监听节点内容变化
-s 附加次级信息
set设置节点的具体值
stat查看节点状态
delete删除节点
deleteall递归删除节点

znode节点数据信息

查看当前znode中所包含的内容

[zk: s2:2181(CONNECTED) 0] ls /
[zookeeper]

查看当前节点详细数据

[zk: s2:2181(CONNECTED) 5] ls -s /
[zookeeper]cZxid = 0x0                        #创建节点的事务 zxid
ctime = Thu Jan 01 08:00:00 CST 1970          #znode 被创建的毫秒数(从 1970 年开始)
mZxid = 0x0                                   #znode 最后更新的事务 zxid
mtime = Thu Jan 01 08:00:00 CST 1970          #znode 最后修改的毫秒数(从 1970 年开始)
pZxid = 0x0                                   #znode 最后更新的子节点 zxid
cversion = -1                                 #znode 子节点变化号,znode 子节点修改次数
dataVersion = 0                               #znode 数据变化号
aclVersion = 0                                #znode 访问控制列表的变化号
ephemeralOwner = 0x0                          #如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0。
dataLength = 0                                #znode 的数据长度
numChildren = 1                               #znode 子节点数量

节点类型

持久(Persistent):客户端和服务器端断开连接后,创建的节点不删除。
短暂(Ephemeral):客户端和服务器端断开连接后,创建的节点自己删除。
在这里插入图片描述

监听器原理

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。

监听原理详解

1)首先要有一个main()线程
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。
3)通过connect线程将注册的监听事件发送给Zookeeper。
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
6)listener线程内部调用了process()方法。
在这里插入图片描述

监听对象

1)监听节点数据的变化

get -w <path>

2)监听子节点增减的变化

ls -w <path>

注册一次,只能监听一次。想再次监听,需要再次注册。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐