Zookeeper原理分析之存储结构Snapshot

摘要:
Zookeeper内存结构Zookeeper数据在内存中的结构类似于linux的目录结构,DataTree代表这个目录结构,DataNode代表一个节点。FileSnap实现了SnapShot接口负责将数据写入文件中。snapshot文件格式Snapshot是以二进制形式存在在文件的,Snapshot文件的中数据大体可以分为两部分header和body。

Zookeeper内存结构

Zookeeper数据在内存中的结构类似于linux的目录结构,DataTree代表这个目录结构, DataNode代表一个节点。DataTree默认初始化三个目录:"","/zookeeper","/zookeeper/quota"

DataNode表示一个节点,存储了一下信息:

  • 父节点的引用
  • 节点的权限集合
  • 子节点路径集合

Snapshot

Snapshot是datatree在内存中某一时刻的快照,zookeeper有一定的机制会定时生成datatree的snapshot。FileSnap实现了SnapShot接口负责将数据写入文件中。

snapshot文件格式

Snapshot是以二进制形式存在在文件的,Snapshot文件的中数据大体可以分为两部分header和body。

Header数据格式:

public class FileHeader implements Record {
  private int magic;//魔数   常量ZKSN  代表zookeeper snapshot文件
  private int version;//版本 常量2
  private long dbid;//常量 -1
}

由头部字段可以计算出头部信息占用 4 + 4 + 8 =16bit的固定长度,5A 4B 53 4E 就是魔术ZKSN,00 00 00 02 就是dbid号2,FF FF FF FF FF FF FF FF就是十六进制的-1

body数据格式

Snapshot文件中头部信息之后,紧接着就是body部分的信息,body数据大小是动态的,其存储分为两部分:

  • Map<Long, Integer> sessionWithTimeoutbody信息前面部分存储的是内存中活着的session以及session的超时时间
	public static void serializeSnapshot(DataTree dt,OutputArchive oa,
            Map<Long, Integer> sessions) throws IOException {
        HashMap<Long, Integer> sessSnap = new HashMap<Long, Integer>(sessions);
        oa.writeInt(sessSnap.size(), "count");
        for (Entry<Long, Integer> entry : sessSnap.entrySet()) {
            oa.writeLong(entry.getKey().longValue(), "id");
            oa.writeInt(entry.getValue().intValue(), "timeout");
        }
        dt.serialize(oa, "tree");
    }

由上面序列到文件代码可以看出先写入一个int类型字段用来存储sessionWithTimeout的个数,然后在遍历集合以一个long一个int的形式写入,表示sessionid和过期时间

  • 把datatree序列化到文件中
    public void serialize(OutputArchive oa, String tag) throws IOException {
        scount = 0;
        serializeList(longKeyMap, oa);
        serializeNode(oa, new StringBuilder(""));
        // / marks end of stream
        // we need to check if clear had been called in between the snapshot.
        if (root != null) {
            oa.writeString("/", "path");
        }
    }

上述代码中的longKeyMap是存储在datatree中的acl权限集合,序列化方式如下:

    private synchronized void serializeList(Map<Long, List<ACL>> longKeyMap,
            OutputArchive oa) throws IOException {
        oa.writeInt(longKeyMap.size(), "map");
        Set<Map.Entry<Long, List<ACL>>> set = longKeyMap.entrySet();
        for (Map.Entry<Long, List<ACL>> val : set) {
            oa.writeLong(val.getKey(), "long");
            List<ACL> aclList = val.getValue();
            oa.startVector(aclList, "acls");
            for (ACL acl : aclList) {
                acl.serialize(oa, "acl");
            }
            oa.endVector(aclList, "acls");
        }
    }

serializeNode表示序列化DataTree中的node节点

    void serializeNode(OutputArchive oa, StringBuilder path) throws IOException {
        String pathString = path.toString();
        DataNode node = getNode(pathString);
        if (node == null) {
            return;
        }
        String children[] = null;
        synchronized (node) {
            scount++;
            oa.writeString(pathString, "path");
            oa.writeRecord(node, "node");
            Set<String> childs = node.getChildren();
            if (childs != null) {
                children = childs.toArray(new String[childs.size()]);
            }
        }
        path.append('/');
        int off = path.length();
        if (children != null) {
            for (String child : children) {
                // since this is single buffer being resused
                // we need
                // to truncate the previous bytes of string.
                path.delete(off, Integer.MAX_VALUE);
                path.append(child);
                serializeNode(oa, path);
            }
        }
    }

文件尾部校验数据

00 00 00 01 2F snapshot文件结尾5位数据用来校验snapshot文件是否有效

00 00 00 01一个int的数值就是数字1,代表后面1一个字符数据

2F 就是snapshot的结束符/

免责声明:文章转载自《Zookeeper原理分析之存储结构Snapshot》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jenkins安装及使用怎么处理U盘无法正常弹出的情况?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深度分析:高并发系统架构设计原理,史上最全系列!

架构设计是一系列相关的抽象模式,是人们对一个结构内的元素及元素间关系的一种主观映射的产物。 一、计算机网络基础 A. OSI模型 OSIOpen System Interconnection,简称OSI模型或七层模型。开放系统互连参考模型,是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统...

kafka入门

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行“随机读写”的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一、入门 1、简介 Kafka is a distributed,partitioned,rep...

ZooKeeper学习笔记

 概述 ZooKeeper官网 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。上面的解释有点抽象,简单来说zookeeper=文件系统+监听通知机制。 1. 文件系统 Zoo...

ZooKeeper(3)-内部原理

一. 节点类型 二. Stat结构体1)czxid-创建节点的事务zxid 每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。 事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。 2)ctime - znode被创建的...

ZooKeeper学习及其C++ client

目录 概念 ZAB协议(ZooKeeper Atomic Broadcast)简介 ZooKeeper使用场景 服务发现 分布式锁 分布式leader选举 ZooKeeper client API (原生API) ZooKeeper client API (高级API) cpp zookeeper client项目 参考 概念 ZooKeep...

大数据的那些面试题及答案(一) ---阿善有用

文章目录 1. Flume系列: 2. zookeeper系列 3.spark系列 4.Mysql系列 5.其他大数据面试题 1. Flume系列: 1.Channel Selectors有几种类型,它们的区别是什么?答:有两种。Replicating Channel Selector(默认的)和Multiplexing Channel Sele...