Zookeeper数据模型ZNode

问题

  • ZK的数据模型ZNodes是什么样的:

    树形结构,每个叶子节点都存储着数据,且可挂载子节点;

    路径作为叶子节点名称,数据作为叶子节点内的数据;

  • Znode可以存储什么类型的数据

特性

  • watcher数据变更通知:客户端在节点上设置监控,当节点发生变化时,会触发监控,zk向客户端发送通知

  • 数据访问:对存储在命名空间的节点以原子方式读取和写入,每个节点都有一个访问控制列表ACL

    ACL(sechema​ ​:id :​permision):

    权限模式schema(IP,Digest,World,Super),

    授权对象ID,

    权限permission(CREATE,DELETE,READ,WRITE,ADMIN)

  • 节点类型:

    持久节点PERSISTENT,

    持久顺序节点PERSISTENT_SEQUENTIAL:按照创建先后顺序添加数字后缀

    临时节点EPEMERAL:其生命周期与客户端会话绑定,客户端失效,节点被清除,且不能作为父节点

    临时顺序节点EPEMERAL_SEQUENTIAL

  • 版本:保证分布式数据原子性操作

    每个节点都维护三种版本:

    version数据内容版本号

    cversion子节点版本号

    aversionACL变更版本号

描述

  • 路径:以斜线分割
  • 存储空间:分层的命名空间,每个节点包含与之关联的数据及子节点
  • stat:每个znode维护一个stat结构,内包含数据更改的版本号(具体用于更新操作,类似悲观锁),acl更改,时间戳

ZKDatabase:类似数据库

DataTree:数据库内的结构-节点树

ConcurrentHashMap<String, DataNode> nodes:节点树上的节点集合

DataNode

DataNode是数据存储的最小单元,其内部除了保存了结点的数据内容、ACL列表、节点状态之外,还记录了父节点的引用和子节点列表两个属性,其也提供了对子节点列表进行操作的接口。

  1. public class DataNode implements Record {
  2. //节点数据
  3. byte data[];
  4. //节点的acl的映射;dataTree上另存map
  5. Long acl;
  6. //节点持久化在磁盘的状态
  7. public StatPersisted stat;
  8. //该节点的子节点集合
  9. private Set<String> children = null;
  10. }
DataTree
  1. public class DataTree {
  2. //节点集合:k-路径,v-节点
  3. private final ConcurrentHashMap<String, DataNode> nodes =
  4. new ConcurrentHashMap<String, DataNode>();
  5. //数据监控:内部维护监控集合
  6. private IWatchManager dataWatches;
  7. //子节点监控
  8. private IWatchManager childWatches;
  9. //一个会话中短命的节点????
  10. private final Map<Long, HashSet<String>> ephemerals =
  11. new ConcurrentHashMap<Long, HashSet<String>>();
  12. }
ZKDatabase

zookeeper的内存数据库,管理zookeeper的所有会话,dataTree存储和事务日志,它会定时向磁盘dump快照数据,同时在zk启动时,会通过磁盘的事务日志和快照文件恢复成一个完整的数据库

  1. public class ZKDatabase {
  2. protected DataTree dataTree;
  3. protected ConcurrentHashMap<Long, Integer> sessionsWithTimeouts;
  4. //快照日志:一个database一个snaplog
  5. protected FileTxnSnapLog snapLog;
  6. protected LinkedList<Proposal> committedLog = new LinkedList<Proposal>();
  7. protected ReentrantReadWriteLock logLock = new ReentrantReadWriteLock();
  8. }

基本操作

  1. 创建节点:声明节点存储路径,节点存储模式(持久化/临时)
  2. 获取节点
  3. 获取子节点
  4. 更改节点并触发watcher监控:会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑
  1. public class ZKTest{
  2. //声明zk客户端
  3. private ZooKeeper zookeeper;
  4. //数据存储根路径
  5. private final String dir;
  6. //数据访问权限列表
  7. private List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE;
  8. //节点存储模式:默认持久
  9. private CreateMode createMode = CreateMode.PERSISTENT_SEQUENTIAL;
  10. public ZKTest(ZooKeeper zookeeper, String dir, List<ACL> acl){
  11. this.dir = dir;
  12. if(acl != null){
  13. this.acl = acl;
  14. }
  15. this.zookeeper = zookeeper;
  16. }
  17. // 1.创建节点
  18. public boolean addNode(byte[] data){
  19. try{
  20. zookeeper.create(dir+"/"+prefix, data, acl, createMode);
  21. return true;
  22. }catch(KeeperException.NoNodeException e){
  23. zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT);
  24. }
  25. }
  26. // 2.获取节点
  27. public byte[] getData(){
  28. return zookeeper.getData(dir, false, null);
  29. }
  30. // 3.获取路径下的子节点
  31. public List<String> getChildren(){
  32. return childNames = zookeeper.getChildren(dir, watcher);
  33. }
  34. }
  1. public class Zookeeper{
  2. //根据给定的路径path,访问权限acl,存储模式createMode等创建节点
  3. public String create(final String path, byte data[], List<ACL> acl,
  4. CreateMode createMode)
  5. throws KeeperException, InterruptedException{
  6. final String clientPath = path;
  7. //校验路径 且是否允许节点已存在 如果已存在路径名称+1 否就覆盖
  8. PathUtils.validatePath(clientPath, createMode.isSequential());
  9. //根据createMode辨别如何创建节点
  10. EphemeralType.validateTTL(createMode, -1);
  11. //校验acl列表是否为空
  12. validateACL(acl);
  13. //将chroot前置到clientPath
  14. final String serverPath = prependChroot(clientPath);
  15. //声明请求头 为请求服务端创建节点做准备
  16. RequestHeader h = new RequestHeader();
  17. h.setType(createMode.isContainer() ? ZooDefs.OpCode.createContainer : ZooDefs.OpCode.create);
  18. CreateRequest request = new CreateRequest();
  19. CreateResponse response = new CreateResponse();
  20. request.setData(data);
  21. request.setFlags(createMode.toFlag());
  22. request.setPath(serverPath);
  23. request.setAcl(acl);
  24. //调用客户端ClientCnxn提交请求:TODO
  25. ReplyHeader r = cnxn.submitRequest(h, request, response, null);
  26. if (r.getErr() != 0) {
  27. throw KeeperException.create(KeeperException.Code.get(r.getErr()),
  28. clientPath);
  29. }
  30. if (cnxn.chrootPath == null) {
  31. return response.getPath();
  32. } else {
  33. return response.getPath().substring(cnxn.chrootPath.length());
  34. }
  35. }
  36. // 2.获取节点
  37. public byte[] getData(String path, boolean watch, Stat stat)
  38. throws KeeperException, InterruptedException {
  39. //watch true:将watcher留在节点上(没有报错的情况下)
  40. return getData(path, watch ? watchManager.defaultWatcher : null, stat);
  41. }
  42. public byte[] getData(final String path, Watcher watcher, Stat stat)
  43. throws KeeperException, InterruptedException
  44. {
  45. final String clientPath = path;
  46. PathUtils.validatePath(clientPath);
  47. // the watch contains the un-chroot path
  48. WatchRegistration wcb = null;
  49. if (watcher != null) {
  50. wcb = new DataWatchRegistration(watcher, clientPath);
  51. }
  52. final String serverPath = prependChroot(clientPath);
  53. RequestHeader h = new RequestHeader();
  54. //设置请求类型
  55. h.setType(ZooDefs.OpCode.getData);
  56. GetDataRequest request = new GetDataRequest();
  57. request.setPath(serverPath);
  58. request.setWatch(watcher != null);
  59. GetDataResponse response = new GetDataResponse();
  60. ReplyHeader r = cnxn.submitRequest(h, request, response, wcb);
  61. if (r.getErr() != 0) {
  62. throw KeeperException.create(KeeperException.Code.get(r.getErr()),
  63. clientPath);
  64. }
  65. //将服务端返回的状态信息赋值到stat上 ????有什么用
  66. if (stat != null) {
  67. DataTree.copyStat(response.getStat(), stat);
  68. }
  69. return response.getData();
  70. }
  71. //将watcher注册到某节点路径上
  72. public abstract class WatchRegistration {
  73. private Watcher watcher;
  74. private String clientPath;
  75. }
  76. // 3.获取路径下的子节点 和getData大致相同
  77. ....
  78. }

Zookeeper(二)数据模型的更多相关文章

  1. ZooKeeper:数据模型

    ZooKeeper数据模型 ZNode ZNode 分类 Stat Watcher Watcher工作原理 Watcher事件说明 Watcher注册 事件发布 示例 ZooKeeper 数据模型 整 ...

  2. Zookeeper基本数据模型

    一.Zookeeper基本数据模型 是一个树形结构,类似于前端开发中的tree.js组件 zk的数据模型也可以理解为linux/unix的文件目录  /usr/local/... 每一个节点称之为zn ...

  3. 1.9 分布式协调服务-Zookeeper(二)

    zoo.cfg配置文件分析 tickTime=2000  zookeeper中最小的时间单位长度 (ms) initLimit=10  follower节点启动后与leader节点完成数据同步的时间 ...

  4. 第3章 ZooKeeper基本数据模型

    第3章 ZooKeeper基本数据模型 3-1 zk数据模型介绍 3-2 zk客户端连接关闭服务端,查看znode ./zkCli.sh Ctrl + C 退出 =================== ...

  5. ZooKeeper的数据模型

    ZooKeeper的数据模型 ZooKeeper提供的命名空间与标准的文件系统的命名空间非常类似:名称是由斜杠(/)分隔的一系列路径元素:ZooKeeper命名空间中的每个节点都由路径标识,如下图: ...

  6. Zookeeper(二) zookeeper集群搭建 与使用

    一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03    1. ...

  7. ZooKeeper服务-数据模型

    ZooKeeper是一个具有高可用性的高性能协调服务. 数据模型 ZooKeeper维护着一个树形层次结构,树中的节点被称为znode.Znode可以用于存储数据,并且有一个与之相关联的ACL(Acc ...

  8. 第3章 ZooKeeper基本数据模型 3-1 zk数据模型介绍

    基本数据模型是zookeeper的重点. 它是参照Linux/Unix的目录结构. 子节点就相当于是父目录下的一个子目录,在zookeeper里面它是称之为节点,父节点和子节点,然后每一个节点就会有一 ...

  9. Hadoop 部署之 ZooKeeper (二)

    目录 一.Zookeeper功能简介 二.ZooKeeper基本概念 1.集群角色 三.ZooKeeper 的安装 1.下载安装(在datanode节点安装) 2.配置ZooKeeper环境变量 3. ...

随机推荐

  1. monggoDB添加到windows服务

    ----------------mongoDB安装------------------------------- 1.下载mongoDB安装包安装完毕后,配置环境变量 D:\Program Files ...

  2. sql--left join,right join, inner join

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  3. Intel Coleto Creek SSL chipset

    Intel Coleto Creek SSL chipset name type interface speed model SR-IOV driver Intel SSL chipset Colet ...

  4. 21、Nginx 常见问题

    1.多个server_name容易产生冲突,会按照如下顺序匹配 1.首先选择所有的字符串完全匹配的server_name.(完全匹配) 2.选择通配符在前面的server_name,如*.bgx.co ...

  5. 微信公众号开发者中心配置 Token验证失败 终极解决方案

    请您检查这几项: 1. 在您的URL(服务器地址)页面里,直接Get获取echostr参数打印到页面上. 在火狐浏览器里Firebug里面看到echostr前面多了几个乱码. 把您开发者设置的URL页 ...

  6. (转)shell中括号的特殊用法 linux if多条件判断

    一.   bash [  ] 单双括号 基本要素: Ø  [ ] 两个符号左右都要有空格分隔 Ø  内部操作符与操作变量之间要有空格:如  [  “a”  =  “b”  ] Ø  字符串比较中,&g ...

  7. 2019 年百度之星·程序设计大赛 - 初赛一 C. HDU 6670 Mindis 离散化+dijkstra

    题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6670 Mindis Time Limit: 4000/2000 MS (Java/Others) M ...

  8. document.compatMode,quirks mode and standards mode

    Document.compatMode Indicates whether the document is rendered in Quirks mode or Standards mode. Syn ...

  9. JS 转化为String的三种方法

    // 1. toString() var num = 8; var numString = num.toString(); console.log(numString); var result = t ...

  10. HDU - 6396 Swordsman (单调性+贪心)

    题意:有n个怪物和k种属性,当且仅当你的每种属性都大于等于怪物的属性才可以击杀它,且击杀怪物可以提升你一定的属性值.求可击杀怪物的最大数量以最终的属性值. 这不就是银行家算法里的安全性检验么? 本题的 ...