zookeeper原理解析-数据存储

Zookeeper内存结构

Zookeeper是怎么存储数据的,什么机制保证集群中数据是一致性,在网络异常,当机以及停电等异常情况下恢复数据的,我们知道数据库给我们提供了这些功能,其实zookeeper也实现了类似数据库的功能。

1.      Zookeeper内存结构

Zookeeper数据在内存中的结构类似于linux的目录结构

DataTree代表这个目录结构, DataNode代表一个节点
         DataTree:
                   默认初始化三目录
                  1)""
          2) "/zookeeper"
         3) "/zookeeper/quota"
         DataNode
                   表示一个节点
                 1) 存储了父节点的引用
                 2) 节点的权限信息
                 3) 子节点路径集合

Snapshot

Snapshot是datatree在内存中某一时刻的影像,zookeeper有一定的机制会定时生成datatree的snapshot。FileSnap实现了SnapShot接口负责将数据写入文件中,下面我们来看看snap相关内容。

2.1 snapshot文件格式

   Snapshot是以二进制形式存在在文件的,我们用ue打开一个新的snapshot文件

Snapshot文件的中数据大体可以分为两部分header和body。

Header数据格式:

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

这里很奇怪 version和dbid都是常量,那还有什么意思,也许是保留字段为后续版本使用。

由头部字段可以计算出头部信息占用 4 + 4 + 8 =16bit的固定长度

5A 4B 53 4E 就是魔术ZKSN

00 00 00 02 就是dbid号2

FF FF FF FF FF FF FF FF就是十六进制的-1

public voidserialize(OutputArchive oa, String tag) throws IOException {
        scount = 0;
        serializeList(longKeyMap, oa);
        serializeNode(oa, newStringBuilder(""));
        if (root != null) {
            oa.writeString("/","path");
        }
    }

2.1)序列化longKeyMap是存储在datatree中的acl权限集合
           readInt("map") //acl的映射个数?
        while (map > 0) {
            readLong("long") //这个long值longKeyMap的key,作用?是这一组acl的key
         readInt("acls")
         while (acls) {
              readInt("perms")
           readString("scheme")
           readString("id")
           }
     }
2.2)存储datatree中数据节点
        readString("path")//第一个datanode ""
    while(!path.equals("/")) {   //  "/"代表路径结束
           readRecord(node, "node")包括:
           readBuffer("data")
           readLong("acl")
           deserialize(archive,"statpersisted") 状态存储包括:
                          readLong("czxid")  //createNode时事务号
                            readLong("mzxid")  //createNode时与Czxid同,setData时的事务号
                            readLong("ctime")  // 创建节点时间
                            readLong("mtime")  //createNode时与ctime相同,setData时间
                            readInt("version")  //createNode版本为0,setData的数据版本号
                            readInt("cversion") //createNode版本为0,增加/删除子节点时父节点+1
                            readInt("aversion") //createNode版本为0,setACL时节点的版本号
                            readLong("ephemeralOwner") // 临时节点表示sessionid,非临时节点这个值为0
                            readLong("pzxid")  //createNode时与Czxid同,增加/删除子节点时为子节点事务号
        readString("path") //读取下一个路径
  }
3)  文件尾部校验数据
00 00 00 01 2F  snapshot文件结尾5位数据用来校验snapshot文件是否有效
   00 00 00 01一个int的数值就是数字1,代表后面1一个字符数据
   2F 就是snapshot的结束符/

Body数据格式:

Snapshot文件中头部信息之后,紧接着就是body部分的信息,body数据大小是动态不是固定。

1) Map<Long, Integer> sessionWithTimeoutbody信息前面部分存储的是内存中活着的session以及session的超时时间

oa.writeInt(sessSnap.size(),"count");

for (Entry<Long, Integer> entry :sessSnap.entrySet()) {

oa.writeLong(entry.getKey().longValue(), "id");

oa.writeInt(entry.getValue().intValue(),"timeout");

}

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

2) 紧接着就是对datatree序列化到文件了

我们看下datatree的序列化方法


4)Snapshot序列化

5)Snapshot反序列化

时间: 09-22

zookeeper原理解析-数据存储的相关文章

2.zookeeper原理解析-数据存储之Snapshot

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu======================================= Snapshot是datatree在内存中某一时刻的影像,zookeeper有一定的机制会定时生成datatree的snapshot.FileSnap实现了SnapShot接口负责将数据写入文件中,下面我们来看看snap相关内容. 2.1 snapshot文件格式

3.zookeeper原理解析-数据存储之TxnLog事务日志

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu======================================= 事务日志文件用来记录事物操作,每一个事务操作如添加,删除节点等等,都会在事务日志中记录一条记录,用来在zookeeper异常情况下,通过txnlog和snapshot文件来恢复数据,下面我们来看下txnLog事务日志文件的格式 打开一个事务日志文件看看 一个日志文

解析数据存储MySQL

为了适应不同项目对不同感兴趣属性的解析存储,数据存储结构采用纵向的属性列表方式,即一个url页面多个属性存储多条记录方式,并且按照text,html,data,num几大典型类型分别对应存储. 创建UTF-8字符集的nutch数据库,并执行表初始化脚本,参考DDL: CREATE TABLE `crawl_data` ( `url` varchar(255) NOT NULL, `code` varchar(255) NOT NULL, `name` varchar(255) DEFAULT N

zookeeper原理解析-选举

1)QuorumPeerMain加载 Zookeeper集群启动的入口类是QuorumPeerMain来加载配置启动QuorumPeer线程.首先我们来看下QuorumPeer, 谷歌翻译quorum是法定人数,定额的意思, peer是对等的意思,那么QuorumPeer中quorum代表的意思就是每个zookeeper集群启动的时候集群中zookeeper服务数量就已经确定了,在每个zookeeper的配置文件中配置集群中的所有机器 server.1=127.0.0.1:2886:3886 s

Zookeeper原理分析之存储结构Snapshot

Zookeeper内存结构 Zookeeper数据在内存中的结构类似于linux的目录结构,DataTree代表这个目录结构, DataNode代表一个节点.DataTree默认初始化三个目录:"","/zookeeper","/zookeeper/quota" DataNode表示一个节点,存储了一下信息: 父节点的引用 节点的权限集合 子节点路径集合 Snapshot Snapshot是datatree在内存中某一时刻的快照,zookeepe

15.zookeeper原理解析-服务器端处理流程之交互图

===================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=============== Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zookeeper并发性能,zookeeper客户端与服务器端交互采用nio模型.下面我们主要来讲讲zookeeper的服务器端与客户端的交互.读者对nio不

13.zookeeper原理解析-服务器端处理流程之处理器详解

===================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=============== 各个processor的主要功能 1) PrepRequestProcessor 如名字这个处理器主要功能是对请求进行预处理, 将client向server请求二进制数据反序列化成sever中请求操作. PrepRequestProcessor做为leader的第一个处理器,它的请求数据来源主要来自: (1)    Leader做一个zk服务接收

zookeeper原理解析-服务器端处理流程

1)处理器链 这部分内容我们主要讲解zookeeper请求在zookeeper server端的处理流程,对于不同角色的zookeeper具有不同的处理流程, ZookeepeerServer的start方法中会调用setupRequestProcessors()来初始化处理器链,它被子类覆写实现. 1.      LeaderZooKeeperServer 看如上代码主要建立了如下的两个处理器流链 (1)    PrepRequestProcessor(线程) => ProposalReque

zookeeper原理解析-客户端与服务器端交互

Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zookeeper并发性能,zookeeper客户端与服务器端交互采用nio模型.下面我们主要来讲讲zookeeper的服务器端与客户端的交互.读者对nio不了解的话不妨抽点时间去了解下,对于一些nio框架如netty,mina再如一些web容器如tomcat,jetty底层都实现一套nio框架,对于实现ni