上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

Zookeeper 复习知识点(更新中)

guduadmin24小时前

Zookeeper

Zookeeper 是开源的,是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接收观察者的注册,一旦这些数据发生变化,Zookeeper 负责通知已经注册的观察者。Zookeeper 相当于文件系统 + 通知机制。

第 1 章 Zookeeper 简介

1.1 Zookeeper 特点
  1. 集群架构:Zookeeper 通常由一组机器组成,一个 Leader 和多个 Follower 的集群结构。只要集群中存在过半的节点正常工作,整个集群就能够对外提供服务。为了保证高容错性,建议安装奇数台服务器
  2. 简单API:ZooKeeper 的 API 设计简洁且易于使用,其设计灵感来源于文件系统 API
  3. 顺序一致性和原子性:从同一客户端发起的事务请求,最终将严格按顺序被应用到 ZooKeeper 中。所有事务请求的处理结果在整个集群中的所有机器上是一致的
  4. 监听机制:Zookeeper 支持强大的监听机制,能够快速捕捉到数据的变化
1.2 Zookeeper 数据结构

Zookeeper 数据模型类似 Unix 文件系统(树状),每个节点称为 ZNode,每个 ZNode 默认可以存储 1MB 数据(对于记录状态性质的数据来说,足够使用)。

Zookeeper 复习知识点(更新中),第1张

ZNode 节点类型有 4 种:

  1. PERSISTENT 持久节点:在节点创建后就一直存在,直到有删除操作来主动删除该节点。该节点不会因为创建该节点的客户端会话失效而消失
  2. PERSISTENT_SEQUENTIAL 持久顺序编号节点:基本特性和持久节点是一致的。额外的特性是,在 Zookeeper 中,每个父节点会为它的第一级子节点维护一份时序,记录每个子节点创建的先后顺序。基于这个特性,那么在创建子节点过程中,Zookeeper 会自动为给定节点名加上一个数字后缀,作为新的节点名。在创建节点的时候只需要传入节点 “/test_”,这样之后,Zookeeper 自动会给 “/test_” 后面补充数字
  3. EPHEMERAL 临时节点:和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。 这里还要注意一件事,就是当你客户端会话失效后,所产生的节点也不是一下子就消失了,也要过一段时间,大概是 10 秒以内
  4. EPHEMERAL_SEQUENTIAL 临时顺序编号节点:此节点是属于临时节点,不过带有顺序编号,客户端会话结束节点就消失
1.3 Zookeeper 应用场景
1.3.1 统一命名服务 / 统一配置管理 / 统一集群管理

Zookeeper 复习知识点(更新中),第2张

Zookeeper 复习知识点(更新中),第3张

Zookeeper 复习知识点(更新中),第4张

1.3.2 服务器动态上下线

Zookeeper 复习知识点(更新中),第5张

1.3.3 分布式锁(⭐)

Zookeeper 复习知识点(更新中),第6张

第 2 章 Zookeeper 集群

Zookeeper 稳定 3.5.7 版本下载:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/

2.1 部署 Zookeeper 集群

在 hostname 为 hadoop101、hadoop102、hadoop103 的三个节点上部署 Zookeeper 集群。

2.1.1 安装解压

在 hadoop101 上解压压缩包:

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin/ zookeeper
cd zookeeper/
# 创建 Zookeeper 数据目录
mkdir zkData
2.1.2 配置服务器编号

在 /zookeeper/zkData 目录下创建一个名为 myid 的文件,内容输入文件编号 1。

2.1.3 修改配置文件
cd zookeeper/conf
mv zoo_sample.cfg zoo.cfg

打开 zoo.cfg,进行以下修改添加:

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/home/sy/zookeeper/zkData
dataLogDir=/var/log/zookeeper/dataLog
reconfigEnabled=true
standaloneEnabled=false
clientPort=2181
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
2.1.4 同步配置到其它节点

将 hadoop101 中已经配置好的 zookeeper 目录拷贝到 hadoop102 和 hadoop103 上,注意 hadoop102 和 hadoop103 需要分别修改 myid 的内容为 2、3。

2.1.5 启动集群

在三台服务器的 zookeeper 目录下分别输入命令:

bin/zkServer.sh start
bin/zkServer.sh status
2.2 Zookeeper 集群配置文件
# Zookeeper 服务端和客户端心跳时间,单位毫秒
tickTime=2000
# Leader 和 Follower 初始连接时能容忍的最多心跳数(tickTime 数量)
initLimit=5
# Leader 和 Follower 之间通信时间如果超过 syncLimit * tickTime,Leader 会认为该 Follwer 挂掉,从服务列表中删除
syncLimit=2
# 保存 Zookeeper 数据的目录
dataDir=/home/sy/zookeeper/zkData
# 保存 Zookeeper 事务日志的目录,与上面分开存储提高系统性能
dataLogDir=/var/log/zookeeper/dataLog
# 集群启动后是否可以修改现有配置
reconfigEnabled=true
# Zookeeper 是否以独立模式运行,集群模式下设为 false
standaloneEnabled=false
# 客户端连接端口
clientPort=2181
# 集群内有几个节点以下就写几行配置
# A 表示服务器的编号,与该服务器 myid 文件中的编号必须相同
# B 表示服务器的 hostname 或 ip
# C 表示服务器中 Follower 和 Leader 交换信息的端口
# D 表示重新选举时服务器相互通信的端口。
server.A=B:C:D
...
2.3 Zookeeper 集群选举机制(⭐)

以三台服务器为例。

2.3.1 第一次启动
  1. 第一台服务器 101 启动时,发起一次选举,投给自己一票,但是选票未超过集群服务器总数的一半,101 服务器保持 LOOKING 状态(正在选举状态)
  2. 第二台服务器 102 启动时,再发起一次选举,101 和 102 分别投给自己一票,两个服务器之间交换选举信息。此时 101 发现 102 的 myid 比自己大,所以更改投票为 102。此时 102 的票数超过集群服务器总数的一半,成为 Leader。101 成为 Follower。一旦集群中产生了 Leader,就不会继续选举,所以 103 最后加入集群自动成为 Follower
2.3.2 Leader 宕机后的选举
  1. 服务器运行期间主观认为无法与 Leader 保持连接,如果 Leader 确实宕机,就会开启 Leader 选举
  2. Leader 任期代号(EPOCH)大的直接当选;EPOCH 相同,事务 id(ZXID)大的当选;ZXID 相同,服务器 id(SID)大的当选

第 3 章 Zookeeper 节点命令

首先需要进入 Zookeeper 安装包的 bin 目录下,输入以下命令进入客户端:

./zkClient.sh
3.1 查看节点

查看节点命令:

# 查看根节点下的所有子节点
ls /
# 查看某个子节点的值,path 可以有多级,每级用 / 隔开(与 Linux 文件系统访问路径一致,有 Tab 提示)
ls /
# 监听节点的子节点(执行一次命令表示监听一次,要想再次监听,就要再执行一次命令)
ls -w /
# 查看某个子节点的值和其它详细信息
ls2 /
# 有以下详细信息:
# cZxid 节点的事务id
# ctime 节点创建时间的ID
# mZxid 最后一次被修改的事务ID
# mtime 最后一次修改时间
# pZxid 最后一次修改该节点的子节点的事务 id
# cversion 子节点的版本号
# dataVersion 当前数据的版本号,默认 0,每被修改一次会累加1
# aclVersion 权限更迭版本
# ephemeralOwner 临时节点的客户端会话 id
#   a)节点为持久化节点时:ephemeralOwner 值为0
#   b)节点为临时节点时:ephemeralOwner 值表示该节点所属客户端会话 id
# dataLength 存储数据的长度
# numChildren 子节点个数
3.3 创建节点
  1. 持久节点
create / ""
  1. 持久顺序节点
create -s / ""
  1. 临时节点
create -e / ""
  1. 临时顺序节点
create -e -s / ""
3.4 获取节点数据
# 获取节点数据
get /
# 监听节点数据的变化(执行一次命令表示监听一次,要想再次监听,就要再执行一次命令)
get -w /
3.5 修改节点数据
set / "new value"
3.6 删除节点

删除没有子节点的节点:

delete /

删除带有子节点的节点:

deleteall /

网友评论

搜索
最新文章
热门文章
热门标签