【博学谷学习记录】超强总结,用心分享 | Zookeeper

【博学谷IT技术支持】

一、Zookeeper 基础知识

Zookeeper地址:https://zookeeper.apache.org/

介绍

Zookeeper是一个开源的分布式协调服务,用来给分布式应用提供一致性服务。Zookeeper本质是一个分布式的小文件存储系统。是Chubby一个开源的实现,是Hadoop和Hbase的重要组件。

特性

  • 一致性: 集群中每台服务都一份相同的副本,客户端访问任何一台数据都是一致的。
  • 可靠性: 如果消息被任意一台服务器接受,那么所有的服务器都会接受。
  • 顺序行: 全局有序和偏序两种,全局有序只是如果一台服务器消息a在消息b前发送,那么所有服务器上都是消息a在消息b前被发送;偏序是指如果消息b在消息a后被同一个发送者发送,消息a必然排在消息b前面。
  • 数据更新原子性: 一次数据更新要么成功,要么失败(半数以上节点成功就算成功)
  • 实时性:在一个时间范围内,Zookeeper会让客户端得到服务器更新消息信息或者服务器失效信息。

角色

Zookeeper有三种角色:分别是领导者(leader)、追随者(follower)、观察者(observer)
请添加图片描述

  • Leader: 领导者对客户端提供读写服务。也是事务请求的唯一调度者和处理者,保证集群事务处理的顺序性。对于create/setData/delete等有些操作的请求,统一有leader处理,leader需要决定编号和执行操作,这个过程称为一个事务。
  • llower: 为客户端提非事务(读操作)请求,转发事务请求给leader,参与leader的选举投票。
  • observer:为客户提供读服务,不参与leader选举机制,转发事务请求给leader。通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。

二、 Zookeeper搭建

Zookeeper一般由2n+1台服务组成,主要原因是为了保证leader的选举能得到多数的支持。

配置环境变量

下载安装包http://archive.apache.org/dist/zookeeper/, 将安装包上传到linux服务器上。最新的是3.8.0 2022年6月17号发布的,一般会用稍微老点的版本

  • 解压安装包
tar -zxvf zookeeper-3.6.0.tar.gz -C '指定好的目录
  • 配置环境变量

修改/etc/profile,添加环境变量

export ZOOKEEPER_HOME=zookeeper文件路径
export PATH=ZOOKEEPER_HOME/bin:$PATH

// 刷新配置文件
source /etc/profile
  • 配置zoo.cfg文件
// 创建数据存放目录
mkdir -p /zookeeper-3.6.0/zkdatas
- 配置zk下的配置文件

cd /zookeeper-3.6.0/conf/
// zoo_sample.cfg是模板文件,需要在拷贝一份
cp zoo_sample.cfg zoo.cfg

vim zoo.cfg
// zoo.cfg
dataDir=/zookeeper-3.6.0/zkdatas

// 文件目录添加集群的主节点和所有从节点
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
server.4=zk4:2888:3888
server.5=zk5:2888:3888
server.6=zk6:2888:3888
  • 配置myid

回到刚才的数据存放目录,在该目录下创建myid文件,myid的大小关乎该服务是否是Leader,

echo 1 > myid
  • 分发配置

当这台服务的配置好了之后,将安装包分发给其他所有机器

scp -r /zookeeper-3.6.0/ zk1:$PWD
scp -r /zookeeper-3.6.0/ zk2:$PWD
scp -r /zookeeper-3.6.0/ zk3:$PWD
scp -r /zookeeper-3.6.0/ zk4:$PWD
scp -r /zookeeper-3.6.0/ zk5:$PWD
scp -r /zookeeper-3.6.0/ zk6:$PWD

这时还要在每台机器上重新修改下myid,做到各不相同就好了

  • 启动zk

每台服务器都需要做的操作

zkServer.sh start
// 然后执行
zkCli.sh 

得到如下结果就是配置成功了

请添加图片描述

三、zk的数据

数据模型

zk的数据节点采用树形层次,树中的每个节点称为Znode

具有文件和目录两种特点,可以维护数据、元信息、ACL、时间戳等数据结构,也可以作为路径标识的一部分,也可以有子节点。用户可以增删改查。
原子性:读操作会获取与节点相关的所有数据,写操作会替换掉节点的所有数据。每个节点都有自己的访问控制列表,限定了特定用户对节点的操作。
数据限制:因为它主要是管理调度数据的,因此都是很小的数据,最大超过1M

节点类型

Znode有两种节点类型:分别为永久节点临时节点,节点创建后不可改变。同时节点有序列化特性,可以用来记录创建的先后顺序。

区别: 在与是否依赖于会话,永久节点会话结束依然存在,临时节点则会自动被删除。永久节点只能执行删除操作的时候才会被删除

PERSISTENT  永久节点
EPHEMERAL  临时节点
PERSISTENT_SEQUENTIAL:永久序列化节点
EPHEMERAL_SEQUENTIAL:临时序列化节点

四、 操作

  • 创建节点
// 创建永久节点
create /app1 null
// 序列化节点
create -s /app2 null

// 创建临时节点
create -e /app3 null
// 临时序列化节点
create -s -e /app4 null
  • 修改节点
get /节点名称
  • 删除节点
delete /app1 删除单节点
rmr /app1 递归删除节点

更多操作https://zookeeper.apache.org/doc/r3.8.0/zookeeperStarted.html

五、节点属性

请添加图片描述

属性说明

  • cZxid: 创建时的事务ID
  • ctime: 节点创建时间
  • mZxid: 节点最后一次更新时的事务ID
  • mtime: 节点最后一次更新的时间
  • pZxid: 子节点最后一次被修改是的事务ID
  • cversion: 子节点更新的次数
  • dataVersion: 节点数据的更改次数
  • aclVersion: 节点的控制访问列表的更改次数
  • ephemeralOwner: :如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id.
  • SessionID: 如果接地那是永久节点,则该属性为0
  • dataLength: 数据内容的长度
  • numChildren: 数据节点当前节点的子节点数

六、Watcher 监听机制

zk提供了分布式数据发布/订阅功能,能让多个订阅者同时监听到某一个主题对象,当这个对象自己状态变化是,会通知所有订阅者,使他们能做出相应的处理。

watcher实现由三部分组成:k服务端zk客户端zk客户端的ZKManager对象

请添加图片描述

客户端首先将Watcher注册到服务端,同时将watch对象保存到客户端的watch管理器中。当zk服务端监听到数据状态变化时,会主动通知客户端,然后客户端的watcher管理器会触发watcher事件来回调处理相应的逻辑。完成整体数据的订阅/发布流程。

特点

  • 一次性触发: 事件发生触发监听,一个watcher event就会被发送到设置监听的客户端,只会触发一次,再次发生不会触发
  • 事件封装:zk使用watcher Event对象封装服务端事件并传递。watcherEvent包含了每一个事件的三个基本属性:通知状态(keeperState)、事件类型(EventType)、节点路径(path)
  • 异步发送: watcher的通知事件从服务端发送到客户端是异步的
  • 先注册再触发: zk的watcher机制,必须客户端先到服务端注册监听,这样事件发送才会触发。

七、zk的选举机制

zk默认的算法是FastLeaderElection,采用投票大于半数则胜出的逻辑

节点状态

  • leader:领导者,master主节点
  • follower: 跟随者,从节点slave
  • observer: 观察者,不参与主节点选举,只提供读操作
  • looking: 临时状态,在集群选举master的过程中,所有follower都会去竞选master.
  • 服务器id: 编号越大在选择算法中的权重越大
  • 数据id: 服务器中存在最新的version,值越大说明数据越新,在选举算法中越新权重越大
  • 逻辑时钟:也叫投票次数,同一轮的投票过程中,逻辑时钟值是相同的,

三台选举

  • 第一台开始投票,投自己,发现服务器没有过半,则等待looking
  • 第二台开始投票,投自己,发现服务器过半了,开始比较服务器id,第二台编号大,则第二台为leader。
  • 第三台开始投票,投自己,发现老大已经有了,然后就变小弟了。

五台选举

  • 第一台投自己,未过半,等待
  • 第二台投自己,未过半,等待
  • 第三台投自己,过半,比较服务器id,第三台大,第三台leader
  • 第四台投自己,过半,有老大了,当小弟
  • 第五台投自己,过半,有老大了,当小弟
posted @ 2023-06-01 10:12  牛牛牛牛牛牛牛牛  阅读(21)  评论(0编辑  收藏  举报