开发学院

您的位置:首页>教程>正文

教程正文

Zookeeper 基本原则

  在深入研究Zookeeper的工作之前,让我们先来看看Zookeeper的基本概念。本章我们将讨论以下主题:

  • 体系结构

  • 分层命名空间

  • 会话

  • 监视

ZooKeeper的体系结构

  下图描绘了ZooKeeper的“客户机-服务器体系结构”。

architecture_of_zookeeper.jpg

  下面解释了作为ZooKeeper体系结构一部分的每个组件。

  客户端:客户端是我们分布式应用集群中的节点之一,从服务器访问信息。在特定的时间间隔内,每个客户机向服务器发送一条消息,让服务器知道客户机还处于活动状态。

  类似地,当客户端连接时,服务器发送确认。如果连接的服务器没有响应,客户端会自动将消息重定向到另一台服务器。

  服务器:服务器(ServerServer)是ZooKeeper集合中的一个节点,为客户提供所有服务。向客户端发出确认,通知服务器仍在运行。

  形成ZooKeeper服务器的集成组所需的最小节点数是3。

  Leader:服务器的节点,如果任何连接的节点出现故障,该节点将执行自动恢复。Leader是在服务启动时选出的。

  Follower:遵循Leader指令的服务器节点。

分层命名空间

  下图描述了ZooKeeper文件系统的树结构。ZooKeeper节点被称为znode。每个znode都由一个名称标识,并由一系列路径(/)分隔。

  在图中,首先您有一个用“/”分隔的根znode。在root下,有两个逻辑命名空间配置和工作器。

  配置命名空间用于集中式配置管理,工作人员命名空间用于命名。

  在配置命名空间下,每个znode最多可以存储1MB的数据。这类似于UNIX文件系统,只是父znode也可以存储数据。这种结构的主

hierarchical_namespace.jpg

  ZooKeeper数据模型中的每个znode都维护一个stat结构。stat只提供znode的元数据。它由版本号、访问控制列表、时间戳和数据长度组成。

  版本号:每个znode都有一个版本号,这意味着每次与znode相关联的数据发生变化时,其相应的版本号也会增加。当多个ZooKeeper客户端试图在同一znode上执行操作时,版本号的使用非常重要。

  访问控制列表(ACL):ACL基本上是一种访问znode的认证机制。它控制所有znode读写操作。

  时间戳:时间戳表示从znode创建和修改开始经过的时间。它通常以毫秒表示。ZooKeeper从“交易标识”中识别对znodes的每一个更改。Zxid是唯一的,它为每个事务维护时间,因此您可以很容易地识别从一个请求到另一个请求所经过的时间。

  数据长度:存储在一个znode中的数据总量是数据长度。您最多可以存储1MB的数据。

Znode的类型

  Znodes分为持久性、顺序性和短暂性。

  持久性znode:持久性znode即使在创建特定znode的客户端断开连接后仍然有效。默认情况下,除非另有说明,否则所有znodes都是持久的。

  短暂性znode:短暂性znode在客户端激活之前一直处于活动状态。当客户端与ZooKeeper集成断开连接时,短暂性znodes会自动删除。因此,只有短暂的znodes不允许再有孩子。如果一个短暂性znode被删除,那么下一个合适的节点将填充它的位置。短暂性znode在领导人选举中起着重要的作用。

  顺序znode:顺序znode可以是持久的,也可以是短暂的。当一个新的znode被创建为一个连续的znode时,ZooKeeper通过在原始名称上附加一个10位的序列号来设置znode的路径。例如,如果将路径为/myapp的znode创建为顺序znode,ZooKeeper会将路径更改为/myapp00000000001,并将下一个序列号设置为000000002。如果同时创建两个连续的znode,那么ZooKeeper永远不会为每个znode使用相同的数字。顺序znodes在锁定和同步中起着重要作用。

会话

  会话对于Zookeeper的操作非常重要。会话中的请求按先进先出的顺序执行。一旦客户端连接到服务器,将建立会话,并为客户端分配会话id。

  客户端以特定的时间间隔发送心跳,以保持会话有效。如果ZooKeeper集成在服务启动时指定的时间段(会话超时)内没有从客户端接收到心跳,它将决定客户端死亡。

  会话超时通常以毫秒表示。当会话因任何原因结束时,在该会话期间创建的短暂znodes也会被删除。

监视

  监视是一种简单的机制,客户可以通过它来获得ZooKeeper团队的变化通知。客户端可以在读取特定znode时设置手表。监视程序会向注册的客户端发送一个通知,通知任何znode(客户端在其上注册)的更改。

  Znode更改是对与znode相关联的数据的修改或znode子代中的更改。手表只触发一次。如果客户端希望再次收到通知,则必须通过另一个读取操作来完成。当连接会话到期时,客户端将与服务器断开连接,相关联的监视也将被删除。