Zookeeper(二)数据模型
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列表、节点状态之外,还记录了父节点的引用和子节点列表两个属性,其也提供了对子节点列表进行操作的接口。
public class DataNode implements Record {
//节点数据
byte data[];
//节点的acl的映射;dataTree上另存map
Long acl;
//节点持久化在磁盘的状态
public StatPersisted stat;
//该节点的子节点集合
private Set<String> children = null;
}
DataTree
public class DataTree {
//节点集合:k-路径,v-节点
private final ConcurrentHashMap<String, DataNode> nodes =
new ConcurrentHashMap<String, DataNode>();
//数据监控:内部维护监控集合
private IWatchManager dataWatches;
//子节点监控
private IWatchManager childWatches;
//一个会话中短命的节点????
private final Map<Long, HashSet<String>> ephemerals =
new ConcurrentHashMap<Long, HashSet<String>>();
}
ZKDatabase
zookeeper的内存数据库,管理zookeeper的所有会话,dataTree存储和事务日志,它会定时向磁盘dump快照数据,同时在zk启动时,会通过磁盘的事务日志和快照文件恢复成一个完整的数据库
public class ZKDatabase {
protected DataTree dataTree;
protected ConcurrentHashMap<Long, Integer> sessionsWithTimeouts;
//快照日志:一个database一个snaplog
protected FileTxnSnapLog snapLog;
protected LinkedList<Proposal> committedLog = new LinkedList<Proposal>();
protected ReentrantReadWriteLock logLock = new ReentrantReadWriteLock();
}
基本操作
- 创建节点:声明节点存储路径,节点存储模式(持久化/临时)
- 获取节点
- 获取子节点
- 更改节点并触发watcher监控:会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑
public class ZKTest{
//声明zk客户端
private ZooKeeper zookeeper;
//数据存储根路径
private final String dir;
//数据访问权限列表
private List<ACL> acl = ZooDefs.Ids.OPEN_ACL_UNSAFE;
//节点存储模式:默认持久
private CreateMode createMode = CreateMode.PERSISTENT_SEQUENTIAL;
public ZKTest(ZooKeeper zookeeper, String dir, List<ACL> acl){
this.dir = dir;
if(acl != null){
this.acl = acl;
}
this.zookeeper = zookeeper;
}
// 1.创建节点
public boolean addNode(byte[] data){
try{
zookeeper.create(dir+"/"+prefix, data, acl, createMode);
return true;
}catch(KeeperException.NoNodeException e){
zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT);
}
}
// 2.获取节点
public byte[] getData(){
return zookeeper.getData(dir, false, null);
}
// 3.获取路径下的子节点
public List<String> getChildren(){
return childNames = zookeeper.getChildren(dir, watcher);
}
}
public class Zookeeper{
//根据给定的路径path,访问权限acl,存储模式createMode等创建节点
public String create(final String path, byte data[], List<ACL> acl,
CreateMode createMode)
throws KeeperException, InterruptedException{
final String clientPath = path;
//校验路径 且是否允许节点已存在 如果已存在路径名称+1 否就覆盖
PathUtils.validatePath(clientPath, createMode.isSequential());
//根据createMode辨别如何创建节点
EphemeralType.validateTTL(createMode, -1);
//校验acl列表是否为空
validateACL(acl);
//将chroot前置到clientPath
final String serverPath = prependChroot(clientPath);
//声明请求头 为请求服务端创建节点做准备
RequestHeader h = new RequestHeader();
h.setType(createMode.isContainer() ? ZooDefs.OpCode.createContainer : ZooDefs.OpCode.create);
CreateRequest request = new CreateRequest();
CreateResponse response = new CreateResponse();
request.setData(data);
request.setFlags(createMode.toFlag());
request.setPath(serverPath);
request.setAcl(acl);
//调用客户端ClientCnxn提交请求:TODO
ReplyHeader r = cnxn.submitRequest(h, request, response, null);
if (r.getErr() != 0) {
throw KeeperException.create(KeeperException.Code.get(r.getErr()),
clientPath);
}
if (cnxn.chrootPath == null) {
return response.getPath();
} else {
return response.getPath().substring(cnxn.chrootPath.length());
}
}
// 2.获取节点
public byte[] getData(String path, boolean watch, Stat stat)
throws KeeperException, InterruptedException {
//watch true:将watcher留在节点上(没有报错的情况下)
return getData(path, watch ? watchManager.defaultWatcher : null, stat);
}
public byte[] getData(final String path, Watcher watcher, Stat stat)
throws KeeperException, InterruptedException
{
final String clientPath = path;
PathUtils.validatePath(clientPath);
// the watch contains the un-chroot path
WatchRegistration wcb = null;
if (watcher != null) {
wcb = new DataWatchRegistration(watcher, clientPath);
}
final String serverPath = prependChroot(clientPath);
RequestHeader h = new RequestHeader();
//设置请求类型
h.setType(ZooDefs.OpCode.getData);
GetDataRequest request = new GetDataRequest();
request.setPath(serverPath);
request.setWatch(watcher != null);
GetDataResponse response = new GetDataResponse();
ReplyHeader r = cnxn.submitRequest(h, request, response, wcb);
if (r.getErr() != 0) {
throw KeeperException.create(KeeperException.Code.get(r.getErr()),
clientPath);
}
//将服务端返回的状态信息赋值到stat上 ????有什么用
if (stat != null) {
DataTree.copyStat(response.getStat(), stat);
}
return response.getData();
}
//将watcher注册到某节点路径上
public abstract class WatchRegistration {
private Watcher watcher;
private String clientPath;
}
// 3.获取路径下的子节点 和getData大致相同
....
}
Zookeeper(二)数据模型的更多相关文章
- ZooKeeper:数据模型
ZooKeeper数据模型 ZNode ZNode 分类 Stat Watcher Watcher工作原理 Watcher事件说明 Watcher注册 事件发布 示例 ZooKeeper 数据模型 整 ...
- Zookeeper基本数据模型
一.Zookeeper基本数据模型 是一个树形结构,类似于前端开发中的tree.js组件 zk的数据模型也可以理解为linux/unix的文件目录 /usr/local/... 每一个节点称之为zn ...
- 1.9 分布式协调服务-Zookeeper(二)
zoo.cfg配置文件分析 tickTime=2000 zookeeper中最小的时间单位长度 (ms) initLimit=10 follower节点启动后与leader节点完成数据同步的时间 ...
- 第3章 ZooKeeper基本数据模型
第3章 ZooKeeper基本数据模型 3-1 zk数据模型介绍 3-2 zk客户端连接关闭服务端,查看znode ./zkCli.sh Ctrl + C 退出 =================== ...
- ZooKeeper的数据模型
ZooKeeper的数据模型 ZooKeeper提供的命名空间与标准的文件系统的命名空间非常类似:名称是由斜杠(/)分隔的一系列路径元素:ZooKeeper命名空间中的每个节点都由路径标识,如下图: ...
- Zookeeper(二) zookeeper集群搭建 与使用
一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03 1. ...
- ZooKeeper服务-数据模型
ZooKeeper是一个具有高可用性的高性能协调服务. 数据模型 ZooKeeper维护着一个树形层次结构,树中的节点被称为znode.Znode可以用于存储数据,并且有一个与之相关联的ACL(Acc ...
- 第3章 ZooKeeper基本数据模型 3-1 zk数据模型介绍
基本数据模型是zookeeper的重点. 它是参照Linux/Unix的目录结构. 子节点就相当于是父目录下的一个子目录,在zookeeper里面它是称之为节点,父节点和子节点,然后每一个节点就会有一 ...
- Hadoop 部署之 ZooKeeper (二)
目录 一.Zookeeper功能简介 二.ZooKeeper基本概念 1.集群角色 三.ZooKeeper 的安装 1.下载安装(在datanode节点安装) 2.配置ZooKeeper环境变量 3. ...
随机推荐
- 外贸开发,用java调用速卖通api第一步,token的获取。
第一步 定义速卖通api的常量 public String client_id; public String client_key; public String site; 第二步 获取登 ...
- python爬虫简介
一.什么是网络爬虫? 网络爬虫,是一种按照一定规则,自动的抓取万维网信息的程序或者脚本. 二.python网络爬虫, 需要用到的第三方包 requests和BeautifulSoup4 pip ins ...
- 分布式的几件小事(三)dubbo的通信协议与序列化
1.dubbo的通信协议 ①dubbo协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 特点 : dubbo缺 ...
- linux复习6
ubuntu------------- apt //advanced package tool,高级包工具. apt-get install centos------------- yum //yel ...
- web-CSS居中大全
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- JVM--对象访问和OutOfMemoryError异常
对象访问: 使用句柄访问方式: 使用直接指针访问方式: OutOfMemoryError异常: 设置堆的最小最大容量:-Xms20m -Xmx20m 设置一样推不可自动扩展. 设置出现内存溢出 ...
- SQL 优化SQL查询
摘至于:http://www.cnblogs.com/ATree/archive/2011/02/13/sql_optimize_1.html 1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据 ...
- pgsql sql字段拼接
1. 一条记录数据字段拼接 语法:concat_ws('拼接符号',字段名,more fields) 例子:concat_ws(':',username,sex)2. 多条记录字段拼接 语法:con ...
- shell 删除文本中的重复行
三种常见方法:第一,用sort+uniq,注意,单纯uniq是不行的. shell> sort -k2n file | uniq > a.out 这里我做了个简单的测试,当file中的重复 ...
- 青风nrf52832跑zephyr——点亮LED
zephyr版本:1.10 硬件:采用青风nrf52832开发板 开发环境:虚拟机Ubuntu16.04编译+Windows7 64bit烧录 使用的是 zephyr-zephyr-v1.10.0 ...