006—Zookeeper—架构详解-1

zookeeper logo及其作用简介

ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。ZooKeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。

《006—Zookeeper—架构详解-1》 zookeeper

分布式应用正在运行的一组系统称为集群,而在集群中运行的每台机器被称为节点。
分布式应用有两部分, Server(服务器) 和 Client(客户端) 应用程序。服务器应用程序实际上是分布式的,并具有通用接口,以便客户端可以连接到集群中的任何服务器并获得相同的结果。 客户端应用程序是与分布式应用进行交互的工具。

《006—Zookeeper—架构详解-1》 分布式

ZooKeeper提供的常见服务

  1. 命名服务 – 按名称标识集群中的节点。它类似于DNS,但仅对于节点。
  2. 配置管理 – 加入节点的最近的和最新的系统配置信息。
  3. 集群管理 – 实时地在集群和节点状态中加入/离开节点。
  4. 选举算法 – 选举一个节点作为协调目的的leader。
  5. 锁定和同步服务 – 在修改数据的同时锁定数据。此机制可帮助你在连接其他 分布式应用程序(如Apache HBase)时进行自动故障恢复。
  6. 高度可靠的数据注册表 – 即使在一个或几个节点关闭时也可以获得数据。
  7. ZooKeeper框架提供了一个完整的机制来克服所有的挑战。竞争条件和死锁使用故障安全同步方法进行处理。另一个主要缺点是数据的不一致性,ZooKeeper使用原子性解析。

zookeeper架构图

《006—Zookeeper—架构详解-1》 架构图

架构图说明

《006—Zookeeper—架构详解-1》 架构图说明

层次命名空间

内存表示的ZooKeeper文件系统的树结构。ZooKeeper节点称为 znode 。每个znode由一个名称标识,并用路径(/)序列分隔。
在图中,首先有一个由“/”分隔的znode。在根目录下,你有两个逻辑命名空间 config 和 workers 。
config 命名空间用于集中式配置管理,workers 命名空间用于命名。
在 config 命名空间下,每个znode最多可存储1MB的数据。这与UNIX文件系统相类似,除了父znode也可以存储数据。这种结构的主要目的是存储同步数据并描述znode的元数据。此结构称为 ZooKeeper数据模型。

《006—Zookeeper—架构详解-1》 结构

数据模型

ZooKeeper数据模型中的每个znode都维护着一个 stat 结构。一个stat仅提供一个znode的元数据。它由版本号,操作控制列表(ACL),时间戳和数据长度组成。

  1. 版本号 – 每个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增加。当多个zookeeper客户端尝试在同一znode上执行操作时,版本号的使用就很重要。

  2. 操作控制列表(ACL) – ACL基本上是访问znode的认证机制。它管理所有znode读取和写入操作。

  3. 时间戳 – 时间戳表示创建和修改znode所经过的时间。它通常以毫秒为单位。ZooKeeper从“事务ID”(zxid)标识znode的每个更改。Zxid 是唯一的,并且为每个事务保留时间,以便你可以轻松地确定从一个请求到另一个请求所经过的时间。

  4. 数据长度 – 存储在znode中的数据总量是数据长度。你最多可以存储1MB的数据。

Znode的类型

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

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

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

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

Sessions(会话)

会话对于ZooKeeper的操作非常重要。会话中的请求按FIFO顺序执行。一旦客户端连接到服务器,将建立会话并向客户端分配会话ID 。
客户端以特定的时间间隔发送心跳以保持会话有效。如果ZooKeeper集合在超过服务器开启时指定的期间(会话超时)都没有从客户端接收到心跳,则它会判定客户端死机。
会话超时通常以毫秒为单位。当会话由于任何原因结束时,在该会话期间创建的临时节点也会被删除。

Watches(监视)

监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。客户端可以在读取特定znode时设置Watches。Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。
Znode更改是与znode相关的数据的修改或znode的子项中的更改。只触发一次watches。如果客户端想要再次通知,则必须通过另一个读取操作来完成。当连接会话过期时,客户端将与服务器断开连接,相关的watches也将被删除

zookeeper工作流

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

《006—Zookeeper—架构详解-1》 工作流程

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

Zookeeper leader选举

所有节点创建具有相同路径 /app/leader_election/guid_ 的顺序、临时节点。
ZooKeeper集合将附加10位序列号到路径,创建的znode将是 /app/leader_election/guid_0000000001,/app/leader_election/guid_0000000002等。
对于给定的实例,在znode中创建最小数字的节点成为leader,而所有其他节点是follower。
每个follower节点监视下一个具有最小数字的znode。例如,创建znode/app/leader_election/guid_0000000008的节点将监视znode/app/leader_election/guid_0000000007,创建znode/app/leader_election/guid_0000000007的节点将监视znode/app/leader_election/guid_0000000006。
如果leader关闭,则其相应的znode/app/leader_electionN会被删除。
下一个在线follower节点将通过监视器获得关于leader移除的通知。
下一个在线follower节点将检查是否存在其他具有最小数字的znode。如果没有,那么它将承担leader的角色。否则,它找到的创建具有最小数字的znode的节点将作为leader。
类似地,所有其他follower节点选举创建具有最小数字的znode的节点作为leader。

    原文作者:lemonMT
    原文地址: https://www.jianshu.com/p/c6a8e1882d5b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞