文档章节

Apache Ignite原生持久化概述

李玉珏
 李玉珏
发布于 02/11 13:31
字数 1864
阅读 522
收藏 1

很多人会问,Ignite有没有持久化存储,或者说是不是一个单纯的内存存储?

答案是都有,Ignite的原生持久化可以打开,也可以关闭。这使得Ignite可以存储比可用内存量大得多的数据集,也就是说,少量的操作型数据集可以只存储于内存中,而内存装不下的更大的数据集可以存储在磁盘上,这样将内存作为一个缓存层,性能会更好。

Ignite原生持久化

Ignite原生持久化是一个分布式的支持ACID和兼容SQL的磁盘存储,它可以与Ignite的固化内存架构透明地集成。Ignite的持久化是可选的,可以打开也可以关闭,如果关闭,Ignite就是一个纯内存的存储。

打开原生持久化之后,Ignite会始终在磁盘上存储数据的超集,然后根据内存的容量在其中存储尽可能多的数据。比如,一共有100条数据,然后内存容量只能存储20条,那么所有的100条都会存储于磁盘上,然后在内存中只缓存20条数据,这样性能会更好。

此外,还要注意,和内存存储的场景一样,如果打开了持久化,每一个节点只会持有所有数据的一个子集,只会包含该节点作为主/备节点所属分区的数据,而整个集群则包含完整的数据集。

不同于作为备份持久层的第三方数据库,Ignite的原生持久化有如下的关键特性:

  • SQL查询可以跨越内存和磁盘的完整数据集,这意味着Ignite可以作为以内存为中心的分布式SQL数据库;
  • 不需要将所有的数据和索引放在内存中,Ignite持久化可以在磁盘上存储数据的超集,然后只将最常用的子集保存在内存中;
  • 即时集群重启。如果整个集群下线,那么不需要从Ignite持久化中通过数据预加载对内存进行预热,只要所有节点组成集群,那么整个集群就会变为可用状态;
  • 数据和索引以类似的格式存储于内存和磁盘上,这样有助于在内存和磁盘之间移动数据时昂贵的转换开销;
  • 通过接入第三方的解决方案,可以创建完整的或者增量的集群快照功能。

用法

要启用原生持久化,需要给集群节点的配置传递一个DataStorageConfiguration对象:

启用持久化之后,数据和索引将存储于所有对应节点的内存和磁盘上,下图显示了每个节点中文件系统层面的Ignite持久化的结构。

内存区和缓存级的持久化

Ignite可以为具体的某个内存区开启持久化,从而也可以为某个缓存开启持久化,具体细节可以参见内存区配置相关章节的介绍。

文件系统中的原生持久化结构

节点中部署的每个缓存都有一个唯一的目录,从上图可以看到,节点至少维护了两个缓存(Cache_ACache_B)。

对于该节点(不管是主节点还是备节点)的每个分区,持久化都会在文件系统中创建专用的文件,比如在上图所示的节点中,负责了分区1,10和564,而索引是每个缓存一个文件。

缓存组和分区文件

如果Cache_ACache_B属于同一个缓存组,则会只有一个目录,两个缓存会共享分区文件,具体细节可以参见缓存组的相关文档。

最后,还有和预写日志有关的文件和目录,具体细节可以参见预写日志检查点的相关文档。

集群激活

要注意,如果使用Ignite的原生持久化,集群默认会处于非激活状态,无法进行任何CRUD操作,用户需要手工对集群进行激活,关于如何激活集群的更多信息,可以参见基线拓扑的相关内容。

上面描述的文件层次结构,默认位于${IGNITE_HOME}/work/db共享目录下,要改变存储和WAL文件的默认位置,可以分别使用DataStorageConfigurationsetStoragePath(...)setWalPath(...)setWalArchivePath(...)方法。

如果在一台主机上启动了多个节点,那么每个节点进程会在一个比如${IGNITE_HOME}/work/db/node{IDX}-{UUID}这样的唯一子文件夹中有自己的持久化文件,这里的IDXUUID由Ignite在节点启动时自动计算,这里有详细的计算方法。如果在持久化文件层次结构中已经有了若干node{IDX}-{UUID}子目录,那么会按照先进先出的顺序在节点间进行分配。如果要为一个节点分配固定的子文件夹,即使节点重启也不会发生变化,可以在集群范围使用IgniteConfiguration.setConsistentId()配置一个唯一值,这个唯一性ID在node{IDX}-{UUID}字符串中会映射到UUID

单主机中隔离集群的节点

Ignite可以在一台主机中运行彼此隔离的多个节点,这种情况下,每个集群需要在不同的目录结构中存储自己的持久化文件,使用DataStorageConfigurationsetStoragePath(...)setWalPath(...)setWalArchivePath(...)方法可以对这些路径进行修改。

事务保证

Ignite的原生持久化是一个兼容ACID的分布式存储,每个写入存储的更新都会先附加到WAL日志,该更新由一个唯一ID进行标识,这就是说,在故障或者重新启动后,集群始终可以恢复到最近成功提交的事务或者原子更新。

SQL支持

Ignite原生持久化可以将Ignite作为一个分布式的SQL数据库。

如果希望在整个集群中执行SQL查询,那么不需要将所有的数据都保存在内存中,Ignite是可以同时在内存和磁盘上执行SQL查询的,也就是只要集群启动运行,就可以执行SQL查询了,虽然也可以选择在集群重启后将数据从持久化预加载到内存中,但是这不是必须的。

Ignite持久化的内部设计

Ignite持久化的文档,提供的是一个高层视图,如果希望了解更底层的技术细节,可以看下面的资料:

性能提示

相关的性能优化建议,可以参见固化内存调优相关章节的文档。

示例

如果要了解Ignite原生持久化在实践中是如何使用的,可以参见GitHub上的示例代码,它也会随着每个Ignite发行版一起提供。

© 著作权归作者所有

李玉珏

李玉珏

粉丝 387
博文 79
码字总数 149758
作品 0
沈阳
架构师
私信 提问
Apache Ignite剖析

1.概述   Apache Ignite和Apache Arrow很类似,属于大数据范畴中的内存分布式管理系统。在《Apache Arrow 内存数据》中介绍了Arrow的相关内容,它统一了大数据领域各个生态系统的数据格式,...

smartloli
2018/03/11
0
0
内存数据组织 - Apache Ignite

1.Ignite是什么? Apache Ignite是一个以内存为中心的分布式数据库、缓存和处理平台,支持事务、分析以及流式负载,可以在PB级数据上享有内存级的性能。 1.1.Ignite定位 Ignite是不是内存数据...

匿名
2015/01/10
29K
8
Apache Ignite 2.7.6 发布,分布式数据库、缓存和处理平台

Apache Ignite 2.7.6 发布了,Ignite 是一个以内存为中心的分布式HTAP数据库、缓存和处理平台,支持事务、分析以及流式负载,可以在PB级数据上享有内存级的性能。 这是一个小版本更新,主要解...

李玉珏
09/20
1K
2
全面对比,深度解析 Ignite 与 Spark

经常有人拿 Ignite 和 Spark 进行比较,然后搞不清两者的区别和联系。Ignite 和 Spark,如果笼统归类,都可以归于内存计算平台,然而两者功能上虽然有交集,并且 Ignite 也会对 Spark 进行支...

编辑部的故事
2018/09/13
3.6K
6
Apache Ignite事务架构:第三方持久化的事务处理

本文是Ignite事务架构系列的最后一篇文章,在之前的文章中,讨论了与键值API的事务处理有关的一系列主题。 第一篇文章中,主要介绍了二阶段提交协议及其工作方式; 第二篇文章中,介绍了锁模...

李玉珏
2018/04/16
932
1

没有更多内容

加载失败,请刷新页面

加载更多

DDD(十)--仓储

1、引言 DDD中的Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。——《领域驱动设计-软件核心复杂性应对之道》 仓储是DDD中产生的概念,也就是说,如果应...

MrYuZixian
9分钟前
5
0
Jenkins的多种迁移方法

说明 Jenkins有时需要进行迁移,主目录会发生改变,本文主要讲解如何更改主目录。由于jenkins安装方式的不同,主目录也不一样。 本测试环境:Centos7.6 X64。注意:在更改主目录之前,请一定...

Elson
10分钟前
5
0
好程序员web前端教程分享前端javascript练习题三

好程序员web前端教程分享前端javascript练习题三,cookie 一周内免登录 样式代码: <form action=""> 姓名:<input type="text" id="usename"/><br /> 密码:<input type="text" i="mima"/>......

好程序员官网
29分钟前
5
0
Table 信息转成pojo属性

import com.google.common.base.CaseFormat;import java.sql.*;/** * @author: liyhu * @date: 2019/11/22 */public class TableToPojo { static String url="jdbc:mys......

暗中观察
59分钟前
8
0
Access数据库-C#操作类

//Access数据库-C# 操作类 代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.OleDb;using System.Data;namespace XXX{......

芳缘
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部