5.zookeeper原理解析-数据存储之ZKDatabase

作者:W.S.T 发布时间:March 9, 2016 分类:Zookeeper No Comments



ZKDatabase在内存中维护了zookeeper的sessions, datatree和commit logs集合。 当zookeeper server启动的时候会将txnlogs和snapshots从磁盘读取到内存中

6.1)loadDatabase: 跟数据库的启动类似zookeeper服务启动结合txnlogs和snapshot, snapshot是内存数据的某个点一份影像,takeSnapshot操作还是很耗时,为了性能根据某算法(在同步处理器SyncRequestProcessor中据一定算法得出一个count,记录大于count就要takeSnapshot,算法是: 100000/2 + random.nextInt(100000/2),这个十万是一个默认值可配置)计算出一个点来异步做一次takeSnapShot操作,这个跟数据库实现原理上很类似, 但是这样在非正常关机情况下,最新有效的那个snapshot并不是内存中最新的数据,所以需要利用txnLogs来把没有生成snapshot的操作在内存重新执行一边来恢复到非正常关闭服务那一刻内存情况。

阅读剩余部分...

4.zookeeper原理解析-数据存储之FileTxnLog& FileTxnSnapLog工具

作者:W.S.T 发布时间:March 9, 2016 分类:Zookeeper No Comments



FileTxnLog类用来操作事务记录文件下面我们来看看这个类主要实现方法


4.1)append方法: 用来向文件尾部添加一条记录

   4.1.1)判断当前输入流logStream是否已清空(在同步处理器SyncRequestProcessor中据一定算法得出一个count,记录大于count就要rollLog,开启一个新的文件,算法是: 100000/2 + random.nextInt(100000/2), 这个十万是一个默认值可配置),清空开启一个新的文件写入

   4.1.2)padFile()判断是否要扩充文件容量预分配buffer,当buffer容量小于等于4k的时候预分配,每次扩充预分配64k容量

   4.1.3)数据序列化,写入输入流缓存

 

阅读剩余部分...

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

作者:W.S.T 发布时间:March 9, 2016 分类:Zookeeper No Comments



事务日志文件用来记录事物操作,每一个事务操作如添加,删除节点等等,都会在事务日志中记录一条记录,用来在zookeeper异常情况下,通过txnlog和snapshot文件来恢复数据,下面我们来看下txnLog事务日志文件的格式

打开一个事务日志文件看看


一个日志文件LogFile: FileHeader TxnList ZeroPad三部分组成

1)   日志文件头FileHeader: {

magic   4bytes (ZKLG) //常量代表

version 4bytes        //常量2

dbid     8bytes        //这个没啥用,就是默认值0

}

阅读剩余部分...

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

作者:W.S.T 发布时间:March 9, 2016 分类:Zookeeper No Comments

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

2.1 snapshot文件格式

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

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

阅读剩余部分...

1.zookeeper原理解析-数据存储之Zookeeper内存结构

作者:W.S.T 发布时间:March 9, 2016 分类:Zookeeper No Comments

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

1.      Zookeeper内存结构

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

DataTree代表这个目录结构, DataNode代表一个节点

   

阅读剩余部分...