Apache Ignite原生持久化概述

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

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

Ignite原生持久化

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

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

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

不一样于做为备份持久层的第三方数据库,Ignite的原生持久化有以下的关键特性:数据库

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

用法

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

启用持久化以后,数据和索引将存储于全部对应节点的内存和磁盘上,下图显示了每一个节点中文件系统层面的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发行版一块儿提供。

相关文章
相关标签/搜索