Zookeeper(五)持久化快照

用途

快照文件是指定时间间隔对zookeeper服务器上的节点数据的序列化后备份到磁盘中,快照文件不一定是最新的

如果zk集群挂了,可能会用到它来复原

基本术语

  • DataTree:zookeeper中数据存储结构

http://www.cnblogs.com/leesf456/p/6179118.html

问题(别人的问题,我暂时没想到)

  • 什么时候生成快照,快照什么时候被删除,会不会被删除
  • 如果zk集群挂了是从哪里恢复,FileSnap还是FileTxn,FileSnap都不一定是最新的,zxid怎么保证
  • 什么时候进行快照记录

实现

SnapShot
public interface SnapShot {
//从最新且有效的快照中反序列化一个dataTree
long deserialize(DataTree dt, Map<Long, Integer> sessions) throws IOException;
//持久化dataTree和会话到一个持久化存储中
void serialize(DataTree dt, Map<Long, Integer> sessions, File name, boolean fsync)
throws IOException;
//查询最近的快照文件
File findMostRecentSnapshot() throws IOException;
//立刻释放快照文件中的资源
void close() throws IOException;
}
FileSnap
public class FileSnap implements SnapShot {
public long deserialize(DataTree dt, Map<Long, Integer> sessions)
throws IOException {
// we run through 100 snapshots (not all of them)
// if we cannot get it running within 100 snapshots
// we should give up
//100个有效且最新的快照文件
List<File> snapList = findNValidSnapshots(100);
if (snapList.size() == 0) {
return -1L;
}
File snap = null;
boolean foundValid = false;
//找到一个有效的快照 就break
for (int i = 0, snapListSize = snapList.size(); i < snapListSize; i++) {
snap = snapList.get(i);
LOG.info("Reading snapshot " + snap);
try (InputStream snapIS = new BufferedInputStream(new FileInputStream(snap));
CheckedInputStream crcIn = new CheckedInputStream(snapIS, new Adler32())) {
InputArchive ia = BinaryInputArchive.getArchive(crcIn);
deserialize(dt, sessions, ia);
long checkSum = crcIn.getChecksum().getValue();
long val = ia.readLong("val");
if (val != checkSum) {
throw new IOException("CRC corruption in snapshot : " + snap);
}
foundValid = true;
break;
} catch (IOException e) {
LOG.warn("problem reading snap file " + snap, e);
}
}
if (!foundValid) {
throw new IOException("Not able to find valid snapshots in " + snapDir);
}
//获取该有效快照的zxid
dt.lastProcessedZxid = Util.getZxidFromName(snap.getName(), SNAPSHOT_FILE_PREFIX);
return dt.lastProcessedZxid;
} }

Zookeeper(五)持久化快照的更多相关文章

  1. Zookeeper(四))持久化日志文件

    Zookeeper(四))持久化日志文件 持久化用途 存储两种文件 snapshot:内存快照 log:事务日志,类似MySQL的binlog,存储数据节点的操作日志 问题 序列化的本质其实就是将原数 ...

  2. ZooKeeper日志与快照文件简单分析

    有用过Zookeeper的都知道zoo.cfg配置文件中有dataDir配置项用于存储数据,不过可能有些人不太清楚这个目录具体存储的是那些数据,默认情况下这个目录是用于存储Log(事务日志)与Snap ...

  3. zookeeper(3) 持久化

    zookeeper为了防止,系统宕机或重启导致的数据丢失,会对数据进行定时持久化.有两种持久化方式: 1.为每次事务操作记录到日志文件,这样就可以通过执行这些日志文件来恢复数据. 2.为了加快ZooK ...

  4. 详解 ZooKeeper 数据持久化

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  5. <Redis> 入门五 持久化RBD/AOF

    RDB RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘(默认是 dump.rdb). 默认持久化机制,就是将内存中的数据以快照的方式写入二进制文件dump.rbd中. 触发快照的条件 ...

  6. 【Zookeeper】源码分析之持久化--FileTxnLog

    一.前言 前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析. 二.持久化总体框架 持久化的类主要在包org.apache.zook ...

  7. 【Zookeeper】源码分析之持久化(一)之FileTxnLog

    一.前言 前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析. 二.持久化总体框架 持久化的类主要在包org.apache.zook ...

  8. 五. Redis持久化

    Redis是一个支持可持久化的内存数据库,也就是说Redis可以将数据保存到硬盘当中. 目前Redis支持两种持久化方式: 1. snapshotting 快照方式(默认方式). 2. append- ...

  9. 170320、使用快照和AOF将Redis数据持久化到硬盘中

    前言 我们知道Redis是一款内存服务器,就算我们对自己的服务器足够的信任,不会出现任何软件或者硬件的故障,但也会有可能出现突然断电等情况,造成Redis服务器中的数据失效.因此,我们需要向传统的关系 ...

随机推荐

  1. 初试spark java WordCount

    初始环境:OS X 10.10.5 准备:boot2docker 进入boot2docker后安装 docker-spark  地址: https://github.com/sequenceiq/do ...

  2. python之jupyter安装与使用

    Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown.用途包括:数据清理和转换,数值模拟,统计建模,机器学 ...

  3. windows环境变量和相关命令操作

    1.很多程序在windows上运行都需要设置环境变量. 2.具体步骤 复制路径 打开系统设置 高级系统设置 环境变量 设置path 重启cmd 3.可以把路径设置成变量,这样就不用随时 改path而是 ...

  4. web攻击日志分析之新手指南

    0x00 前言 现实中可能会经常出现web日志当中出现一些被攻击的迹象,比如针对你的一个站点的URL进行SQL注入测试等等,这时候需要你从日志当中分析到底是个什么情况,如果非常严重的话,可能需要调查取 ...

  5. mvc 母版页中登录注册和问候的处理

    方式一:    在母版页直接调用方法返回,用户的session["userName"]也在母版页判断 2. 创建一个局部视图,在局部试图中将代码和数据调用写好引用单母版页 3. 自 ...

  6. C# 类的继承和访问

    学习笔记------类的继承和访问: class MyBaseClass { public void PrintSun(){ Console.WriteLine("base111111111 ...

  7. 清北学堂dp图论营游记day3

    .状态压缩dp: 对于这个我们引入二进制状态压缩,因为任何一个数都可以二进制表示,而其二进制表示上每一位都可以表示当前位置是否有元素,这就构成了状态压缩. 对于这个题,上下行&一下就行. 状压 ...

  8. Linux修改mysql配置文件

    1.首先需要知道mysql数据库安装在什么位置 2.查找配置文件位置 然后在根据这个目录,查看配置文件在哪里了(路径后面加上 --verbose --help|grep -A 1 'Default o ...

  9. 更换Red Hat Enterprise Linux 7 64位的yum为centos的版本

    查看redhat原有的yum包有哪些: [root@localhost ~]# rpm -qa|grep yum yum-utils-1.1.31-24.el7.noarch yum-langpack ...

  10. /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependency

    原因:python库中urllib3 (1.22) or chardet (2.2.1) 的版本不兼容 解决如下: [ [root@aaaaaaaaaaaaaaaaaaaa~]# pip uninst ...