Zookeeper数据存储总结
Zookeeper快照文件和事物操作文件以文件的形式存储在硬盘上,以快照文件为主,日志文件为辅。因为当对内存数据进行变更的时候,会保证将事务操作记入log日志,而snapshot只是内存某一个时刻影像,为了性能takeSnapshot生成snapshot并不是实时的,而是由后台线程根据一定规则处理的。详细可参考上一篇文章。
快照文件和事物操作文件在磁盘上如下所示:
-rw-rw-r-- 1 ysl ysl 67108880 10月 23 17:43 log.1
-rw-rw-r-- 1 ysl ysl 67108880 11月 7 16:45 log.9b6
-rw-rw-r-- 1 ysl ysl 67108880 1月 15 17:22 log.c99a
-rw-rw-r-- 1 ysl ysl 67108880 1月 16 09:10 log.ca33
-rw-rw-r-- 1 ysl ysl 67108880 1月 17 11:09 log.ca45
-rw-rw-r-- 1 ysl ysl 67108880 1月 18 12:00 log.ca4c
-rw-rw-r-- 1 ysl ysl 67108880 1月 24 17:59 log.ca52
-rw-rw-r-- 1 ysl ysl 67108880 11月 8 16:34 log.ca8
-rw-rw-r-- 1 ysl ysl 67108880 11月 9 17:32 log.d16
-rw-rw-r-- 1 ysl ysl 67108880 1月 30 15:44 log.d172
-rw-rw-r-- 1 ysl ysl 67108880 2月 1 11:52 log.d18d
-rw-rw-r-- 1 ysl ysl 67108880 2月 2 10:10 log.d1aa
-rw-rw-r-- 1 ysl ysl 67108880 11月 10 16:20 log.d88
-rw-rw-r-- 1 ysl ysl 296 10月 23 12:20 snapshot.0
-rw-rw-r-- 1 ysl ysl 6746 11月 13 09:14 snapshot.104d
-rw-rw-r-- 1 ysl ysl 6746 11月 14 11:00 snapshot.1461
-rw-rw-r-- 1 ysl ysl 5059 10月 24 12:11 snapshot.14f
-rw-rw-r-- 1 ysl ysl 5349 10月 25 10:04 snapshot.20a
-rw-rw-r-- 1 ysl ysl 5277 10月 25 10:21 snapshot.210
-rw-rw-r-- 1 ysl ysl 5277 10月 27 14:10 snapshot.21c
-rw-rw-r-- 1 ysl ysl 5349 10月 30 09:17 snapshot.30d
-rw-rw-r-- 1 ysl ysl 5277 10月 30 11:21 snapshot.313
以上文件名是以log.或者snapshot.加上一串long的16进制数字组成,这个long值就是zxid服务器端事务id。Snapshot文件名生成逻辑在 FileTxnSnapLog.save方法中,如下:
public void save(DataTree dataTree,
ConcurrentHashMap<Long, Integer> sessionsWithTimeouts)
throws IOException {
long lastZxid = dataTree.lastProcessedZxid;
File snapshotFile = new File(snapDir, Util.makeSnapshotName(lastZxid));
........
}
Util.makeSnapshotName用于生成文件名称
public static String makeSnapshotName(long zxid) {
//返回文件名称
return "snapshot." + Long.toHexString(zxid);
}
日志Log文件生成,在FileTxnLog.apend方法中,如果被执行了rollLog方法,那么文件输入流会被清空,这里会创建一个新的文件
if (logStream==null) {
if(LOG.isInfoEnabled()){
LOG.info("Creating new log file: log." +
Long.toHexString(hdr.getZxid()));
}
logFileWrite = new File(logDir, ("log." +
Long.toHexString(hdr.getZxid())));
fos = new FileOutputStream(logFileWrite);
logStream=new BufferedOutputStream(fos);
.........
}
当客户端请求一个事物操作时,leader的PrepRequestProcessor处理器会对请求进行预处理包括生成zxid设置到请求中去,zxid的生成是通过调用ZookeeperServer.getNextZxid生成:
long getNextZxid() {
return hzxid.incrementAndGet();
}
它是hzxid一个自增的long值,有没有奇怪这个变量取名叫做hzixd多了一个h, h我的理解是high的缩写代表64位long的高32位。Zxid的分为两部分高32位用来存储每次选举的时代epoch,低32位用来存储事务请求的自增序列。所谓选举时代就是一个数值,标记代表一次选举,跟年份一样是自增的。每次服务器启动或者zookeeper异常导致重新选举都会在原来epoch值加一代表一个新的时代,工具类ZxidUtils用来操作前32或者后32位。比如现在epoch=4代表经历了4次选举,如果重新选举后epoch值为5,通过工具类的zxid=hzxid=ZxidUtils.makeZxid(5,0)= 21474836480,此时低32重新开始值为0, 如果这时来了新的请求值为zxid=21474836481=21474836480+ 1 = ZxidUtils.makeZxid(5, 1)。
public class ZxidUtils {
static public long getEpochFromZxid(long zxid) {
return zxid >> 32L;
}
static public long getCounterFromZxid(long zxid) {
return zxid & 0xffffffffL;
}
static public long makeZxid(long epoch, long counter) {
return (epoch << 32L) | (counter & 0xffffffffL);
}
static public String zxidToString(long zxid) {
return Long.toHexString(zxid);
}
}
Zookeeper数据存储总结的更多相关文章
- zookeeper 数据存储特点
zookeeper 和elasticseaarch 数据存储特点: 1.zookeeper; [Zookeeper提供的一致性是弱一致性,首先数据的复制有如下规则:zookeeper确保对znode树 ...
- 【分布式】Zookeeper数据与存储
一.前言 前面分析了Zookeeper对请求的处理,本篇博文接着分析Zookeeper中如何对底层数据进行存储,数据存储被分为内存数据存储于磁盘数据存储. 二.数据与存储 2.1 内存数据 Zooke ...
- Zookeeper数据与存储
一.前言 前面分析了Zookeeper对请求的处理,本篇博文接着分析Zookeeper中如何对底层数据进行存储,数据存储被分为内存数据存储于磁盘数据存储. 二.数据与存储 2.1 内存数据 Zooke ...
- zookeeper原理解析-数据存储
Zookeeper内存结构 Zookeeper是怎么存储数据的,什么机制保证集群中数据是一致性,在网络异常,当机以及停电等异常情况下恢复数据的,我们知道数据库给我们提供了这些功能,其实zookeepe ...
- Zookeeper系列六:服务器角色、序列化与通信协议、数据存储、zookeeper总结
一.服务器角色 1. Leader 1)事务请求的唯一调度者和处理者.保证事务处理的顺序性 事务请求:导致数据一致性的请求(数据发生改变).如删除一个节点.创建一个节点.设置节点数据,设置节点权限就是 ...
- 探索etcd,Zookeeper和Consul一致键值数据存储的性能
这篇博文是探索三个分布式.一致性键值数据存储软件性能的系列文章中的第一篇:etcd.Zookeeper和Consul,由etcd团队所写,可以让我们全面地了解如何评估三个分布式一致存储软件的性能.翻译 ...
- 1.zookeeper原理解析-数据存储之Zookeeper内存结构
Zookeeper是怎么存储数据的,什么机制保证集群中数据是一致性,在网络异常,当机以及停电等异常情况下恢复数据的,我们知道数据库给我们提供了这些功能,其实zookeeper也实现了类似数据库的功能. ...
- 环境搭建 Hadoop+Hive(orcfile格式)+Presto实现大数据存储查询一
一.前言 Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关 ...
- 网易大数据之数据存储:HDFS
一.HDFS基础架构 1.HDFS特点:水平扩展.高容错性.廉价硬件.开源生态系统 2.Hadoop生态圈 1).分布式存储系统(HDFS),2).资源管理框架(YARN),3).批处理框架(MapR ...
随机推荐
- 16进制string转成int
http://blog.csdn.net/wl1524520/article/details/25706521
- arm家族小检阅
- 20155235 2016-2017-2 《Java程序设计》第7周学习总结
20155235 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 认识Lambda语法 Lambda语法概览 Lambda表达式与函数 ...
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...
- mysql 查询表 的所有字段名称
select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your_table_name' and table_sc ...
- 22. Valuing Water 珍惜水资源
. Valuing Water 珍惜水资源 ① Humanity uses a little less than half the water available worldwide.Yet occu ...
- Django入门与实践-第15章:用户注销(完结)
# myproject/settings.py LOGOUT_REDIRECT_URL = 'home' http://127.0.0.1:8000/logout/ # myproject/urls. ...
- js基础学习笔记(五)
多种选择(Switch语句) 当有很多种选项的时候,switch比if else使用更方便. 语法: switch(表达式) { case值1: 执行代码块 1 break; case值2: 执行代码 ...
- 20155223 2016-2017-2 《Java程序设计》第9周学习总结
20155223 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC--Java数据库连接是用于执行SQL的解决方案,开发人员无需接触底层数据 ...
- hdu 4268 贪心+set lower_bound用法
http://acm.hdu.edu.cn/showproblem.php?pid=4268 A想用手里的牌尽量多地覆盖掉B手中的牌.. 牌有h和w 问A手中的牌最多能覆盖B多少张牌 iterator ...