不少人会问,Ignite有没有持久化存储,或者说是否是一个单纯的内存存储?html
答案是都有,Ignite的原生持久化能够打开,也能够关闭。这使得Ignite能够存储比可用内存量大得多的数据集,也就是说,少许的操做型数据集能够只存储于内存中,而内存装不下的更大的数据集能够存储在磁盘上,这样将内存做为一个缓存层,性能会更好。java
Ignite原生持久化是一个分布式的支持ACID和兼容SQL的磁盘存储,它能够与Ignite的固化内存架构透明地集成。Ignite的持久化是可选的,能够打开也能够关闭,若是关闭,Ignite就是一个纯内存的存储。node
打开原生持久化以后,Ignite会始终在磁盘上存储数据的超集,而后根据内存的容量在其中存储尽量多的数据。好比,一共有100条数据,而后内存容量只能存储20条,那么全部的100条都会存储于磁盘上,而后在内存中只缓存20条数据,这样性能会更好。git
此外,还要注意,和内存存储的场景同样,若是打开了持久化,每个节点只会持有全部数据的一个子集,只会包含该节点做为主/备节点所属分区的数据,而整个集群则包含完整的数据集。github
不一样于做为备份持久层的第三方数据库,Ignite的原生持久化有以下的关键特性:数据库
要启用原生持久化,须要给集群节点的配置传递一个DataStorageConfiguration
对象:apache
启用持久化以后,数据和索引将存储于全部对应节点的内存和磁盘上,下图显示了每一个节点中文件系统层面的Ignite持久化的结构。缓存
Ignite能够为具体的某个内存区开启持久化,从而也能够为某个缓存开启持久化,具体细节能够参见内存区配置相关章节的介绍。性能优化
节点中部署的每一个缓存都有一个惟一的目录,从上图能够看到,节点至少维护了两个缓存(Cache_A
和Cache_B
)。架构
对于该节点(无论是主节点仍是备节点)的每一个分区,持久化都会在文件系统中建立专用的文件,好比在上图所示的节点中,负责了分区1,10和564,而索引是每一个缓存一个文件。
若是Cache_A
和Cache_B
属于同一个缓存组,则会只有一个目录,两个缓存会共享分区文件,具体细节能够参见缓存组的相关文档。
最后,还有和预写日志有关的文件和目录,具体细节能够参见预写日志和检查点的相关文档。
要注意,若是使用Ignite的原生持久化,集群默认会处于非激活状态,没法进行任何CRUD操做,用户须要手工对集群进行激活,关于如何激活集群的更多信息,能够参见基线拓扑的相关内容。
上面描述的文件层次结构,默认位于${IGNITE_HOME}/work/db
共享目录下,要改变存储和WAL文件的默认位置,能够分别使用DataStorageConfiguration
的setStoragePath(...)
,setWalPath(...)
和setWalArchivePath(...)
方法。
若是在一台主机上启动了多个节点,那么每一个节点进程会在一个好比${IGNITE_HOME}/work/db/node{IDX}-{UUID}
这样的惟一子文件夹中有本身的持久化文件,这里的IDX
和UUID
由Ignite在节点启动时自动计算,这里有详细的计算方法。若是在持久化文件层次结构中已经有了若干node{IDX}-{UUID}
子目录,那么会按照先进先出的顺序在节点间进行分配。若是要为一个节点分配固定的子文件夹,即便节点重启也不会发生变化,能够在集群范围使用IgniteConfiguration.setConsistentId()
配置一个惟一值,这个惟一性ID在node{IDX}-{UUID}
字符串中会映射到UUID
。
Ignite能够在一台主机中运行彼此隔离的多个节点,这种状况下,每一个集群须要在不一样的目录结构中存储本身的持久化文件,使用DataStorageConfiguration
的setStoragePath(...)
、setWalPath(...)
和setWalArchivePath(...)
方法能够对这些路径进行修改。
Ignite的原生持久化是一个兼容ACID的分布式存储,每一个写入存储的更新都会先附加到WAL日志,该更新由一个惟一ID进行标识,这就是说,在故障或者从新启动后,集群始终能够恢复到最近成功提交的事务或者原子更新。
Ignite原生持久化能够将Ignite做为一个分布式的SQL数据库。
若是但愿在整个集群中执行SQL查询,那么不须要将全部的数据都保存在内存中,Ignite是能够同时在内存和磁盘上执行SQL查询的,也就是只要集群启动运行,就能够执行SQL查询了,虽然也能够选择在集群重启后将数据从持久化预加载到内存中,可是这不是必须的。
Ignite持久化的文档,提供的是一个高层视图,若是但愿了解更底层的技术细节,能够看下面的资料:
相关的性能优化建议,能够参见固化内存调优相关章节的文档。
若是要了解Ignite原生持久化在实践中是如何使用的,能够参见GitHub上的示例代码,它也会随着每一个Ignite发行版一块儿提供。