ignite持久化的关键点以下:java
持久化涉及到的一个关键点就是WAL,所谓WAL就是预写日志,目的是为了保证在持久化机制下数据写入的性能,其原理图以下所示:node
在ignite中,对内存中数据的操做并不会当即同步到持久化文件(Partition File)中,而是先记录在预写日志(Write-Ahead Log)中,检查点线程(Checkpointing)将内存中的脏数据(dirty page)同步到持久化文件中,而且会将预写日志中的过时数据删除。web
dirty page:在wal文件中可是还没写入partition files中,当dirty page 比例占到内存数据的2/3的时候会触发checkpoint机制。apache
checkpoint : 将内存中的数据同步到partition files中,当checkpoint结束以后,wal会归档,开启一个新的wal文件。缓存
wal能够防止在极端状况下,好比断电,程序崩溃的状况下数据丢失,可是若是wal中的数据过多,那么在ignite启动的时候从wal读取数据势必会致使启动速度缓慢,由于从wal中读取数据的速度远比从partition files中读取数据的速度慢。缓存配置项中有个'writeThrottlingEnabled'
配置项能够改善这个状况,除此以外,还能够调整检查点的线程数以及同步频率来提高预写日志的效率,相关配置以下所示:ide
<property name="dataStorageConfiguration"> <bean class="org.apache.ignite.configuration.DataStorageConfiguration"> ...... <!-- Threads that generate dirty pages too fast during ongoing checkpoint will be throttled --> <property name="writeThrottlingEnabled" value="true"/> <!--Checkpointing frequency which is a minimal interval when the dirty pages will be written to the Persistent Store.--> <!-- 检查点频率 --> <property name="checkpointFrequency" value="180000"/> <!-- Number of threads for checkpointing.--> <!-- 检查点线程数 --> <property name="checkpointThreads" value="4"/> <!-- 在检查点同步完成后预写日志历史保留数量 <!-- Number of checkpoints to be kept in WAL after checkpoint is finished.--> <property name="walHistorySize" value="20"/> ...... </bean> </property>
WAL有几种模式能够选择,能够关闭WAL或者强同步模式,保证数据在苛刻条件下也不会丢失,设置方式以下:性能
<!-- 设置持久化预写日志模式. --> <property name="walMode"> <util:constant static-field="org.apache.ignite.configuration.WALMode.DEFAULT"/> </property>
ignite中对于存储有个内存区的概念,每一个cache默认使用的是Default_Region
,能够自定义内存区,而后在定义缓存的时候指定缓存区,这样能够作到个性化持久化,好比有些缓存的数据量比较小,那么就没有持久化的必要,而有些表数据量比较大,并且还在持续增加,须要开启持久化防止内存溢出,这时能够经过自定义内存区将二者缓存区分开来,实现定制化持久化。测试
<!-- Consistent globally unique node identifier which survives node restarts. --> <!-- 设置节点固定的一致性id,使得节点使用专用目录和数据分区 --> <property name="consistentId" value="ABC"/> <!-- 节点自定义存储配置 --> <property name="dataStorageConfiguration"> <bean class="org.apache.ignite.configuration.DataStorageConfiguration"> <!-- Redefining the default region's settings --> <property name="defaultDataRegionConfiguration"> <bean class="org.apache.ignite.configuration.DataRegionConfiguration"> <property name="name" value="Default_Region"/> <!-- 设置默认内存区最大内存为 1GB. --> <property name="maxSize" value="#{1L * 1024 * 1024 * 1024}"/> <!-- 默认内存区开启持久化. --> <property name="persistenceEnabled" value="true"/> </bean> </property> <property name="dataRegionConfigurations"> <list> <!-- 自定义内存区并开启持久化--> <bean class="org.apache.ignite.configuration.DataRegionConfiguration"> <!-- 内存区名. --> <property name="name" value="500MB_Region"/> <!-- 100 MB initial size. --> <property name="initialSize" value="#{100L * 1024 * 1024}"/> <!-- 500 MB maximum size. --> <property name="maxSize" value="#{500L * 1024 * 1024}"/> <!-- 开启持久化. --> <property name="persistenceEnabled" value="true"/> </bean> </list> </property> <!-- 设置持久化预写日志模式. --> <property name="walMode"> <util:constant static-field="org.apache.ignite.configuration.WALMode.DEFAULT"/> </property> <!-- 持久化文件存储路径. --> <!-- <property name="storagePath" value="D:\\Test\\db" /> --> <property name="storagePath" value="/data/local/db" /> <!-- 预写日志存储路径. --> <!-- <property name="walPath" value="D:\\Test\\db\\wal" /> --> <property name="walPath" value="/data/local/db/wal" /> <!-- 预写日志解压路径. --> <!-- <property name="walArchivePath" value="D:\\Test\\db\\wal\\archive" /> --> <property name="walArchivePath" value="/data/local/db/wal/archive" /> </bean> </property>
java配置:命令行
private static final String usrDir = System.getProperty("user.dir"); private static final String separator = File.separator; private static final String DB = "db"; private static final String WAL = "wal"; private static final String ARCHIVE = "archive"; /**设置一致性Id*/ igniteCfg.setConsistentId("ABC"); /**ignite持久化配置*/ DataStorageConfiguration dcfg = igniteCfg.getDataStorageConfiguration(); dcfg.getDefaultDataRegionConfiguration() .setMaxSize(4L * 1024 * 1024 * 1024) //设置默认区域的最大可用内存 .setPersistenceEnabled(true); //默认区域开启持久化 //设置持久化路径 dcfg.setStoragePath(String.format("%s%s%s", usrDir, separator, DB)); dcfg.setWalPath(String.format("%s%s%s%s%s", usrDir, separator, DB, separator, WAL)); dcfg.setWalArchivePath(String.format("%s%s%s%s%s%s%s", usrDir, separator, DB, separator, WAL, separator, ARCHIVE));
相关说明:线程
1.1 设置consistentId的缘由:
默认状态下,若是节点重启,那么ignite会随机生成一个全局惟一的consistentId, 而持久化的磁盘路径是用consistentId 区分的,若是重启以后那么没法再读取原来区间的持久化文件,可是指定consistentId就能够使用固定空间,使用以前的持久化文件。
若是一台主机启动了若干个节点,那么每一个节点进程都会在一个预约义的惟一子目录中,好比
${IGNITE_HOME}/work/db/node{IDX}-{UUID}
,有本身的持久化文件,这里IDX
和UUID
参数都是Ignite在节点启动时自动计算的(这里有详细描述)。若是在持久化层次结构中已经有了若干node{IDX}-{UUID}
子目录,那么他们是按照节点先入先出的顺序进行赋值的。若是但愿某节点即便重启也有专用目录和专用的数据分区,须要在集群范围配置惟一的IgniteConfiguration.setConsistentId
,这个惟一ID会在node{IDX}-{UUID}
字符串中映、射setStoragePath(...)到、setWalArchivePath(...)
ffUUID`。
1.2 自定义存储区域的使用方式:
默认配置下,缓存使用的是默认内存区(defaultDataRegionConfiguration),也能够自定义内存区,如上面配置文件中定义的"500MB_Region"。这样能够将须要持久化的数据和不须要持久化的数据分离出来,可是使用自定义的内存区的时候须要设置额外的属性:
<property name="cacheConfiguration"> <list> <bean class="org.apache.ignite.configuration.CacheConfiguration"> ... <property name="dataRegionName" value="500MB_Region"/> ... </bean> </list> </property>
// Creating a cache configuration. CacheConfiguration cacheCfg = new CacheConfiguration(); // Binding the cache to the earlier defined region. cacheCfg.setDataRegionName("500MB_Region");
1.3 启用持久化以后须要手工激活集群:
集群激活
注意若是开启了Ignite持久化,集群默认是未激活的,没法进行任何的CRUD操做。用户须要手工激活集群,后面会介绍如何进行操做。
集群激活方式:
a. 代码激活:
// Activating the cluster once all the cluster nodes are up and running. if(!ignite.active()) { ignite.active(true); //若是集群未启动则启动集群 }
b. web控制台:
c. 命令激活:
在命令行中,使用
$IGNITE_HOME/bin文件夹中的
control.sh|bat脚本,好比
.sh:
control.sh|bat
./control.sh --activate
.bat:
./control.bat --activate
1.4 ignite的destroyCache()方法一样会清除持久化文件.
destroyCache一样会清除持久化文件,可是持久化的缓存配置不会清除, 因此重启以后会出现容量为空的cache。若是要动态修改cache配置,必须先destroyCache,再作调整;
持久化占用的磁盘空间大小,以及持久化对于节点启动速度的提高:
数据量 | 磁盘占用 | 未持久化启动 | 持久化后启动 |
---|---|---|---|
350w(生产数据) | 分区文件5.6g, 预写日志7.0g | 2分钟 | 39s |
2400w(本地数据) | 分区文件6.76g,预写日志12.1g | .......(内存溢出) | 12s |