赞
踩
在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念。我们将在本章中讨论以下主题:
1、Architecture(架构)
2、Hierarchical namespace(层次命名空间)
3、Session(会话)
4、Watches(监视)
看看下面的图表。它描述了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被分为持久(persistent)节点,顺序(sequential)节点和临时(ephemeral)节点。
持久节点 - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。
会话对于ZooKeeper的操作非常重要。会话中的请求按FIFO顺序执行。一旦客户端连接到服务器,将建立会话并向客户端分配会话ID 。
客户端以特定的时间间隔发送心跳以保持会话有效。如果ZooKeeper集合在超过服务器开启时指定的期间(会话超时)都没有从客户端接收到心跳,则它会判定客户端死机。
会话超时通常以毫秒为单位。当会话由于任何原因结束时,在该会话期间创建的临时节点也会被删除。
监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。客户端可以在读取特定znode时设置Watches。Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。
Znode更改是与znode相关的数据的修改或znode的子项中的更改。只触发一次watches。如果客户端想要再次通知,则必须通过另一个读取操作来完成。当连接会话过期时,客户端将与服务器断开连接,相关的watches也将被删除。
一旦ZooKeeper集合启动,它将等待客户端连接。客户端将连接到ZooKeeper集合中的一个节点。它可以是leader或follower节点。一旦客户端被连接,节点将向特定客户端分配会话ID并向该客户端发送确认。如果客户端没有收到确认,它将尝试连接ZooKeeper集合中的另一个节点。 一旦连接到节点,客户端将以有规律的间隔向节点发送心跳,以确保连接不会丢失。
如果客户端想要读取特定的znode,它将会向具有znode路径的节点发送读取请求,并且节点通过从其自己的数据库获取来返回所请求的znode。为此,在ZooKeeper集合中读取速度很快。
如果客户端想要将数据存储在ZooKeeper集合中,则会将znode路径和数据发送到服务器。连接的服务器将该请求转发给leader,然后leader将向所有的follower重新发出写入请求。如果只有大部分节点成功响应,而写入请求成功,则成功返回代码将被发送到客户端。 否则,写入请求失败。绝大多数节点被称为 Quorum
- //连接命令,-r表示即使ZooKeeper服务器集群一般以上的服务器当掉,也给客户端体统读服务
- zkCli.sh -timeout 5000 -r -server localhost:2181
-
- //显示所有命令
- h
-
- //列出目录
- ls /
-
- //获取指定节点的状态信息
- //czxid 创建该节点的事物ID
- //ctime 创建该节点的时间
- //mZxid 更新该节点的事物ID
- //mtime 更新该节点的时间
- //pZxid 操作当前节点的子节点列表的事物ID(这种操作包含增加子节点,删除子节点)
- //cversion 当前节点的子节点版本号
- //dataVersion 当前节点的数据版本号
- //aclVersion 当前节点的acl权限版本号
- //ephemeralowner 当前节点的如果是临时节点,该属性是临时节点的事物ID
- //dataLength 当前节点的d的数据长度
- //numchildren 当前节点的子节点个数
- stat /
-
- // (ls2 /) = (ls /) + (stat /)
-
- //获取节点内容
- get /
-
- // ⼀次性监听节点
- get -w /test
- // 监听⽬录,创建和删除⼦节点会收到通知。⼦节点中新增节点不会收到通知
- ls -w /test
- // 监听⼦节点中⼦节点的变化,但内容的变化不会收到通知
- ls -R -w /test
-
- //创建节点create [-s] [-e] path data acl
- //-s 表示是顺序节点
- //-e 标识是临时节点
- //path 节点路径
- //data 节点数据
- //acl 节点权限
-
- //退出客户端
- quit
-
- //set path data [version] 修改当前节点的数据内容 如果指定版本,需要和当前节点的数据版本一致
-
- //delete path [version] 删除指定路径的节点 如果有子节点要先删除子节点
-
- //rmr path 删除当前路径节点及其所有子节点
-
- //listquota path 查看路径节点的配额信息,-1表示无限制
-
- //setquota -n|-b val path 设置节点配额(比如限制节点数据长度,限制节点中子节点个数)
- //-n 是限制子节点个数 -b是限制节点数据长度
- //超出配额后,ZooKeeper不会报错,而是在日志信息中记录
- //tail zookeeper.out
- //一旦设置,不能重新设置,必须先删除再设置
- setquota -n 9 /study
- setquota -b 16 /study
-
- //delquota [-n|-b] path 删除节点路径的配额信息
-
- //connect host:port 和 close在当前连接中连接其他的ZooKeeper服务器和关闭服务器
-
- //history 和 redo cmdno :查看客户端这次会话所执行的所有命令 和 执行指定历史命令
一个ZooKeeper的节点(znode)存储两部分内容:数据和状态,状态中包含ACL信息。创建一个znode会产生一个ACL列表,列表中每个ACL包括:
ZooKeeper提供了如下几种验证模式(scheme):
注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。
节点的权限(perms)主要有以下几种:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。