ZooKeeper 学习笔记

一、简介

zooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调存储服务。zooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。

zookeeper官网:https://zookeeper.apache.org/

二、应用场景

(1)维护配置信息
(2)分布式锁服务
(3)集群管理
(4)生成分布式唯一ID

三、ZK架构

看看下面的图表。它描述了ZooKeeper的“客户端-服务器架构”。

ZooKeeper的架构

ZooKeeper架构的一部分的每个组件在下表中进行了说明。

部分 描述
Client(客户端) 客户端,我们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每个客户端向服务器发送消息以使服务器知道客户端是活跃的。类似地,当客户端连接时,服务器发送确认码。如果连接的服务器没有响应,客户端会自动将消息重定向到另一个服务器。
Server(服务器) 服务器,我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。
Ensemble ZooKeeper服务器组。形成ensemble所需的最小节点数为3。
Leader 服务器节点,如果任何连接的节点失败,则执行自动恢复。Leader在服务启动时被选举。
Follower 跟随leader指令的服务器节点。

四、数据模型和层次命名空间

zookeeper的数据节点可以视为树状结构(或者文件系统),树中的各节点被称为znode(即zookeeper node),一个znode可以有多个子节点。zookeeper节点在结构上表现为树状;使用路径path来定位某个znode。znode兼具文件和目录(文件路径而非文件夹)两种特点,既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。

image-20210110205356642

一个znode大体上分为3各部分:

  • data:与该Znode关联的数据,即znode data(节点path, 节点data)的关系就像是java map中(key,value)的关系

  • childre:该Znode下的子节点

  • stat:该Znode节点的状态信息,用来描述当前节点的创建、修改记录、版本、权限等、包括cZxid、ctime等

    cZxid 数据节点创建时的事务 ID
    ctime 数据节点创建时的时间
    mZxid 数据节点最后一次更新时的事务 ID
    mtime 数据节点最后一次更新时的时间
    pZxid 数据节点的子节点最后一次被修改时的事务 ID
    cversion 子节点的更改次数
    dataVersion 节点数据的更改次数
    aclVersion 节点的 ACL 的更改次数
    ephemeralOwner 如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为 0
    dataLength 数据内容的长度
    numChildren 数据节点当前的子节点个数

Znode的类型

Znode被分为持久(persistent)节点,顺序(sequential)节点和临时(ephemeral)节点。

  • 持久节点 - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。

  • 临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。

  • 顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。

五、ZK工作流

一旦ZooKeeper集合启动,它将等待客户端连接。客户端将连接到ZooKeeper集合中的一个节点。它可以是领导或跟随者节点。一旦客户端被连接,节点将向特定客户端分配会话ID并向该客户端发送确认。如果客户端没有收到确认,它将尝试连接ZooKeeper集合中的另一个节点。 一旦连接到节点,客户端将以有规律的间隔向节点发送心跳,以确保连接不会丢失。

Zookeeper - 工作流

组件 描述
写入(write) 写入过程由leader节点处理。leader将写入请求转发到所有znode,并等待znode的回复。如果一半的znode回复,则写入过程完成。
读取(read) 客户端向具有znode路径的节点发送读取请求,并且节点通过从其自己的数据库获取来返回所请求的znode。读取由特定连接的znode在内部执行,因此不需要与集群进行交互。
复制数据库(replicated database) 它用于在zookeeper中存储数据。每个znode都有自己的数据库,每个znode在一致性的帮助下每次都有相同的数据。
领导者(Leader) Leader是负责处理写入请求的Znode。
跟随者(Follower) follower从客户端接收写入请求,并将它们转发到leader znode。
请求处理器(request processor) 只存在于leader节点。它管理来自follower节点的写入请求。
原子广播(atomic broadcasts) 负责广播从leader节点到follower节点的变化。

安装

1
2
3
$ docker run --name myZookeeper --restart always -e JVMFLAGS="-Xmx1024m" -p 2181:2181 zookeeper
$ docker exec -it myZookeeper /bin/bash
$ /apache-zookeeper-3.6.2-bin/bin/zkCli.sh


----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%