前言

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


一、zookeeper概述

在这里插入图片描述

1. zookeeper特点

在这里插入图片描述

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

2. zookeeper数据结构

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

3. 应用场景

📚提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、zookeeper安装说明(就要用最新版)

https://dlcdn.apache.org/zookeeper/zookeeper-3.9.0/apache-zookeeper-3.9.0-bin.tar.gz

1. 本地安装

# 下载3.9.0版本
cd /opt/software/;wget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.0/apache-zookeeper-3.9.0-bin.tar.gz
# 解压缩
tar -zxvf apache-zookeeper-3.9.0-bin.tar.gz -C /opt/module/
# 改名
mv apache-zookeeper-3.9.0-bin zookeeper-3.9.0
cd zookeeper-3.9.0/conf/
mv zoo_sample.cfg zoo.cfg

在这里插入图片描述

# 修改数据存放路径
mkdir /opt/module/zookeeper-3.9.0/data
# 进入配置文件修改dataDir
vim /opt/module/zookeeper-3.9.0/conf/zoo.cfg
dataDir=/opt/module/zookeeper-3.9.0/data
# 分发
xsync zookeeper-3.9.0

在这里插入图片描述

启动失败!查看日志发现:Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain,则退到zookeeper文件下,执行编译mvn package -Dmaven.test.skip=true

# zookeeper服务端,启动!
bin/zkServer.sh start
bin/zkServer.sh status
# 启动客户端进入zookeeper界面
bin/zkCli.sh

在这里插入图片描述在这里插入图片描述

  • 配置参数zoo.cfg解读

1️⃣tickTime=2000:通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒。配置服务器与客户端或服务器与服务器之间的通信心跳时间。
2️⃣initLimit = 10:LF初始通信时限。表示Leader和Follower初始连接时能容忍的时间,10代表10个tickTime,超过该时间则认为通信失败。
3️⃣syncLimit = 5:LF同步通信时限。Leader和Follower之间通信时间如果超过syncLimit * tickTime,Leader认为Follwer挂掉,从服务器列表中删除Follwer。
4️⃣dataDir:保存Zookeeper中的数据。注意:默认的tmp目录,容易被Linux系统定期删除,所以一般不用默认的tmp目录。
5️⃣clientPort = 2181:客户端连接端口,通常不做修改。

2. 集群安装

做好集群规划,即需要在集群哪些节点上部署zookeeper。目前只有三个节点hadoop102、103、104,三个节点都部署上zookeeper,因为zookeeper至少需要三台服务器

📚依次在hadoop101,hadoop102和hadoop103三个节点上部署Zookeeper,在/opt/module/zookeeper-3.9.0/data 目录下创建一个 myid 的文件,在文件中添加与服务器相对应的编号,分发后在hadoop103中的myid文件中编号改为3,hadoop104中myid文件中编号改为4,以此类推。

# hadoop102上myid写入2 
2

# 分发修改
xsync data
ssh hadoop103 
echo "3" > myid
ssh hadoop104 
echo "4" > /opt/module/zookeeper-3.9.0/data/myid

📚在conf/下的配置文件zoo.cfg中添加以下配置:并分发到各个zookeeper节点上

##############cluster###############
server.4=hadoop104:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888

xsync zoo.cfg

server.A=B:C:D解读
👉在每个服务器中都启动zookeeper,会通过选举机制来产生follower跟leader
1️⃣A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 data 目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比 较从而判断到底是哪个 server
2️⃣B 是这个服务器的地址
3️⃣C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口
4️⃣D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口

在这里插入图片描述

3. 选举机制

假设有5台,一台一台用bin/zkServer.sh start来启动

在这里插入图片描述

在这里插入图片描述

4. 集群启动停止脚本

📚在vim /root/bin/zk.sh写入

#!/bin/bash
case $1 in
"start"){
    for i in hadoop102 hadoop103 hadoop104
    do
 		echo ---------- zookeeper $i 启动 ------------
		ssh $i "/opt/module/zookeeper-3.9.0/bin/zkServer.sh start"
	done
};;
"stop"){
	for i in hadoop102 hadoop103 hadoop104
	do
	echo ---------- zookeeper $i 停止 ------------ 
	ssh $i "/opt/module/zookeeper-3.9.0/bin/zkServer.sh stop"
	done
};;
"status"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo ---------- zookeeper $i 状态 ------------ 
		ssh $i "/opt/module/zookeeper-3.9.0/bin/zkServer.sh status"
	done
};;
esac

最后chmod 777 zk.sh在这里插入图片描述

5. 客户端命令行操作

# 指定服务器开启客户端
bin/zkCli.sh -server hadoop102:2181
# 查看当前znode中所包含的内容
ls /
# 查看当前节点详细数据
ls -s /

  • 参数解读

1️⃣czxid:创建节点的事务 zxid,每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
2️⃣ctime:znode 被创建的毫秒数(从 1970 年开始)
3️⃣mzxid:znode 最后更新的事务 zxid
4️⃣mtime:znode 最后修改的毫秒数(从 1970 年开始)
5️⃣pZxid:znode 最后更新的子节点 zxid
6️⃣cversion:znode 子节点变化号,znode 子节点修改次数
7️⃣dataversion:znode 数据变化号,znode数据修改次数
8️⃣aclVersion:znode 访问控制列表的变化号
9️⃣ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0。
🔟dataLength:znode 的数据长度
numChildren:znode 子节点数量


总结

冲鸭

Logo

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

更多推荐