ZooKeeper基本架构与基本概念

2019-03-31 10:32|来源: 网路


在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念。我们将在本章中讨论以下主题:
1、Architecture(架构)
2、Hierarchical namespace(层次命名空间)
3、Session(会话)
4、Watches(监视)

ZooKeeper的架构

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

ZooKeeper的架构


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

部分 描述
Client(客户端)

客户端,我们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每个客户端向服务器发送消息以使服务器知道客户端是活跃的。

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

Server(服务器) 服务器,我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。
Ensemble ZooKeeper服务器组。形成ensemble所需的最小节点数为3。
Leader 服务器节点,如果任何连接的节点失败,则执行自动恢复。Leader在服务启动时被选举。
Follower 跟随leader指令的服务器节点。

层次命名空间

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

  • 在图中,首先有一个由“/”分隔的znode。在根目录下,你有两个逻辑命名空间 config workers

  • config 命名空间用于集中式配置管理,workers 命名空间用于命名。

  • config 命名空间下,每个znode最多可存储1MB的数据。这与UNIX文件系统相类似,除了父znode也可以存储数据。这种结构的主要目的是存储同步数据并描述znode的元数据。此结构称为 ZooKeeper数据模型

分层命名空间

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

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

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

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

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

Znode的类型

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

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

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

  • 顺序节点 - 顺序节点可以是持久的或临时的。当一个新的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也将被删除。

相关问答

更多
  • 1.建立数据库database,建立数据表student。 字段: sid 学号 文本 sname 姓名 文本 ssex 性别 文本(2字节) saddress 地址 文本 stel 电话 文本 2.类代码 /****************************************************** 使用: 设置数据库路径、sql语句、最大返回行数,使用getHTMLTable()返回html表格形式的字符串 executeSQL(String,String)执行SQL语句返回一个对象,请 ...
  • 在做软件架构设计时,根据不同的抽象层次可分为三种不同层次的模式:架构模式(Architectural Pattern)、设计模式(Design Pattern)、代码模式(Coding Pattern)。 架构模式是一个系统的高层次策略,涉及到大尺度的组件以及整体性质和力学。架构模式的好坏可以影响到总体布局和框架性结构。 设计模式是中等尺度的结构策略。这些中等尺度的结构实现了一些大尺度组件的行为和它们之间的关系。模式的好坏不会影响到系统的总体布局和总体框架。设计模式定义出子系统或组件的微观结构。 代码模式( ...
  • zookeeper 中数据保存的方式是 树 状的。 这里的 node ,就是指 树上的一个节点 。 path 是指从 根节点( / ) 到 这个节点 的全路径 。
  • 网站架构,一般认为是根据客户需求分析的结果,准确定位网站目标群体,设定网站整体架构,规划、设计网站栏目及其内容,制定网站开发流程及顺序,以最大限度地进行高效资源分配与管理的设计。其内容有程序架构,呈现架构,和信息架构三种表现。而步骤主要分为硬架构和软架构两步程序。网络架构是现代网络学习和发展的一个必须的基础技术。 机房的选择 在选择机房的时候,根据网站用户的地域分布,可以选择网通或电信机房,但更多时候,可能双线机房才是合适的。越大的城市,机房价格越贵,从成本的角 度看可以在一些中小城市托管服务器,比如说北京 ...
  • 1.我需要了解的所有命名约定是什么? db表是复数,模型是单数,控制器是复数。 因此您拥有由users表支持的User模型,并可通过UsersController查看。 文件应该命名为类名的wide_cased版本。 所以FooBar类需要放在一个名为foo_bar.rb的文件中。 如果您使用模块命名空间,命名空间需要由文件夹来表示。 所以如果我们谈论Foo::Bar类,它应该在foo/bar.rb 。 2.控制器操作应如何构建和命名? 控制器操作应该是RESTful。 这意味着您应该将您的控制器视为公开资 ...
  • 栈,是一种先进后出的数据结构, 队列,是一种先进先出的数据结构, 栈,有一个指针,指向栈顶元素 队列,有两个指针,一个指向队尾,一个指向队首 栈,只能从顶进,从顶出 队列,从队尾进,从队首出 栈,像一个木桶,我们往里面放面包,我们只能从桶口处往里面放,然后再从桶口处往外取,这就形成了栈的先进后出的特性。 队列,像一个管子,我们从管子的屁股处往里面塞糖豆,肯定是最先塞进去的糖豆先从管子的头处掉出去,这就形成了队列的先进先出的特性。 这是我能达到的最精简的程度了,希望你能看懂。^_^
  • 是数学上的一类特殊函数的总称。一般贝塞尔函数是下列常微分方程(一般称为贝塞尔方程)的标准解函数: 这类方程的解是无法用初等函数系统地表示的。 贝塞尔函数的具体形式随上述方程中任意实数 变化而变化(相应地, 被称为其对应贝塞尔函数的阶数)。实际应用中最常见的情形为 是整数 ,对应解称为n阶贝塞尔函数。  尽管在上述微分方程中, 本身的正负号不改变方程的形式,但实际应用中仍习惯针对 和 定义两种不同的贝塞尔函数(这样做能带来好处,比如消除了函数在 点的不光滑性)。
  • 每当您想要控制应用程序中多个线程的执行时。 虽然这不仅意味着只有一个线程增加了计数器; 但让事件发起/停止或暂停。 请参阅WaitHandles - Auto / ManualResetEvent和Mutex - 编辑 - WaitHandle是“使用”来控制线程执行的机制。 它不是关于在线程中不能访问的句柄; 它关于在线程内使用它们。 这可能是一个很好的例子,但请忍受我; 想一想,一位女士给五个女孩给了五个不同的口音,并告诉他们,一旦发生什么something就会吹口哨。 这个过程是为每个女孩吹口哨,女士 ...
  • Qt是一个庞大的框架,具有用于处理GUI,网络,数据库和各种事物的库。 它有很好的文档记录,所以请看看如何在诺基亚网站上学习Qt 。 话虽如此,这里有一些基本概念: Qt是一个框架。 这意味着您可以围绕响应事件来组织代码。 最重要的是,你没有“主循环”。 你的main看起来像这样: QApplication app(argc, argv); MyMainWindow win; win.show(); return app.exec(); 信号和插槽。 Qt使用信号和插槽的概念以一种彻底解耦的方式连接程 ...
  • 你可以有3个模型类(每个实体一个) public class Lemon { } public class Sugar { } public class Water { } 并为它们创建一个DbContext: public class MyContext:DbContext { public DbSet LemonSet public DbSet SugarSet public DbSet WaterSet } 这样,您将使用EF ...