当前位置:   article > 正文

zookeeper基础教程_zk进入子节点

zk进入子节点

1、基本概念

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

ZooKeeper的架构

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

ZooKeeper的架构

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

部分描述
Client(客户端)

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

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

Server(服务器)服务器,我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。
EnsembleZooKeeper服务器组。形成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也将被删除。

2、Zookeeper 工作流

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

  • 如果客户端想要读取特定的znode,它将会向具有znode路径的节点发送读取请求,并且节点通过从其自己的数据库获取来返回所请求的znode。为此,在ZooKeeper集合中读取速度很快。

  • 如果客户端想要将数据存储在ZooKeeper集合中,则会将znode路径和数据发送到服务器。连接的服务器将该请求转发给leader,然后leader将向所有的follower重新发出写入请求。如果只有大部分节点成功响应,而写入请求成功,则成功返回代码将被发送到客户端。 否则,写入请求失败。绝大多数节点被称为 Quorum 

3、zkCli命令

  1. //连接命令,-r表示即使ZooKeeper服务器集群一般以上的服务器当掉,也给客户端体统读服务
  2. zkCli.sh -timeout 5000 -r -server localhost:2181
  3. //显示所有命令
  4. h
  5. //列出目录
  6. ls /
  7. //获取指定节点的状态信息
  8. //czxid 创建该节点的事物ID
  9. //ctime 创建该节点的时间
  10. //mZxid 更新该节点的事物ID
  11. //mtime 更新该节点的时间
  12. //pZxid 操作当前节点的子节点列表的事物ID(这种操作包含增加子节点,删除子节点)
  13. //cversion 当前节点的子节点版本号
  14. //dataVersion 当前节点的数据版本号
  15. //aclVersion 当前节点的acl权限版本号
  16. //ephemeralowner 当前节点的如果是临时节点,该属性是临时节点的事物ID
  17. //dataLength 当前节点的d的数据长度
  18. //numchildren 当前节点的子节点个数
  19. stat /
  20. // (ls2 /) = (ls /) + (stat /)
  21. //获取节点内容
  22. get /
  23. // ⼀次性监听节点
  24. get -w /test
  25. // 监听⽬录,创建和删除⼦节点会收到通知。⼦节点中新增节点不会收到通知
  26. ls -w /test
  27. // 监听⼦节点中⼦节点的变化,但内容的变化不会收到通知
  28. ls -R -w /test
  29. //创建节点create [-s] [-e] path data acl
  30. //-s 表示是顺序节点
  31. //-e 标识是临时节点
  32. //path 节点路径
  33. //data 节点数据
  34. //acl 节点权限
  35. //退出客户端
  36. quit
  37. //set path data [version] 修改当前节点的数据内容 如果指定版本,需要和当前节点的数据版本一致
  38. //delete path [version] 删除指定路径的节点 如果有子节点要先删除子节点
  39. //rmr path 删除当前路径节点及其所有子节点
  40. //listquota path 查看路径节点的配额信息,-1表示无限制
  41. //setquota -n|-b val path 设置节点配额(比如限制节点数据长度,限制节点中子节点个数)
  42. //-n 是限制子节点个数 -b是限制节点数据长度
  43. //超出配额后,ZooKeeper不会报错,而是在日志信息中记录
  44. //tail zookeeper.out
  45. //一旦设置,不能重新设置,必须先删除再设置
  46. setquota -n 9 /study
  47. setquota -b 16 /study
  48. //delquota [-n|-b] path 删除节点路径的配额信息
  49. //connect host:port 和 close在当前连接中连接其他的ZooKeeper服务器和关闭服务器
  50. //history 和 redo cmdno :查看客户端这次会话所执行的所有命令 和 执行指定历史命令

4、zookeeper ACL权限及quota配额(了解即可)

一个ZooKeeper的节点(znode)存储两部分内容:数据和状态,状态中包含ACL信息。创建一个znode会产生一个ACL列表,列表中每个ACL包括:

  • 验证模式(scheme)
  • 具体内容(Id)(当scheme=“digest”时,Id为用户名密码,例如“root:J0sTy9BCUKubtK1y8pkbL7qoxSw=”)
  • 权限(perms)

ZooKeeper提供了如下几种验证模式(scheme):

  • digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式
  • auth:不使用任何id,代表任何已确认用户。
  • ip:Client端由IP地址验证,譬如172.2.0.0/24
  • world:固定用户为anyone,为所有Client端开放权限
  • super:在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。

节点的权限(perms)主要有以下几种:

  • Create 允许对子节点Create操作
  • Read 允许对本节点GetChildren和GetData操作
  • Write 允许对本节点SetData操作
  • Delete 允许对子节点Delete操作
  • Admin 允许对本节点setAcl操作

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/688023
推荐阅读
相关标签
  

闽ICP备14008679号