点燃持久性|点燃文档

点燃2023年峰会-按需观看-立即注册!

编辑

点燃持久性

概述

Ignite Persistence或Native Persistence是一组旨在提供持久存储的功能。启用后,Ignite始终将所有数据存储在磁盘上,并将尽可能多的数据加载到RAM中进行处理。例如,如果有100个条目,而RAM只能存储20个条目,那么所有100个条目都存储在磁盘上,只有20个条目缓存在RAM中以获得更好的性能。

注释
有关本机持久性的更多信息,请观看建筑深潜点火储存发动机的内部构件上。

当本机持久性关闭且不使用外部存储时,Ignite的行为就像纯内存存储一样。

启用持久性后,每个服务器节点都会持久化数据的子集,该子集只包括分配给该节点的分区(包括备份分区如果启用了备份)。

Native Persistence功能基于以下功能:

  • 在磁盘上存储数据分区

  • 写头日志记录

  • 检查点

  • 更改数据捕获

  • 操作系统交换的使用

启用持久性后,Ignite将每个分区存储在磁盘上的单独文件中。分区文件的数据格式与保存在内存中的数据格式相同。如果启用分区备份,它们也会保存在磁盘上。除了数据分区之外,Ignite还存储索引和元数据。

持久存储结构

您可以在中更改数据文件的默认位置配置.

启用持久存储

本机持久性是根据配置的数据区域.要启用持久存储,请将已启用持久性属性到真的在数据区域配置中。您可以同时拥有内存中的数据区域和具有持久性的数据区域。

以下示例显示如何为默认数据区域启用持久存储。

<豆类 类=“org.apache.ignite.conformation.IgniteConfiguration”>
    <属性 姓名=“dataStorageConfiguration”>
        <豆类 类=“org.apache.ignite.conformation.DataStorageConfiguration”>
            <属性 姓名=“默认数据区域配置”>
                <豆类 类=“org.apache.ignite.conformation.DataRegionConfiguration”>
                    <属性 姓名=“persistenceEnabled” 价值=“正确”/>
                </bean>
            </属性>
        </bean>
    </属性>
</bean>
点火配置 cfg(立方英尺/加仑) = 新的 点火配置();

//数据存储配置
数据存储配置 存储Cfg = 新的 数据存储配置();

存储Cfg.获取默认数据区域配置().已启用setPersistenceEnabled(真的);


cfg(立方英尺/加仑).setDataStorageConfiguration(设置数据存储配置)(存储Cfg);

点燃 点燃 = 点火.开始(cfg(立方英尺/加仑));
无功功率,无功功率 cfg(立方英尺/加仑) = 新的 点火配置
{
    数据存储配置 = 新的 数据存储配置
    {
        默认数据区域配置 = 新的 数据区域配置
        {
            姓名 = “默认区域”,
            持久性已启用 = 真的
        }
    }
};

点火.起点(cfg(立方英尺/加仑));
此API目前不适用于C++。您可以使用XML配置。

配置永久存储目录

启用持久性后,节点将用户数据、索引和WAL文件存储在{点火_WORK_DIR}/db目录。此目录称为存储目录。您可以通过设置存储路径的属性数据存储配置对象,如下所示。

每个节点在存储目录下维护以下子目录,用于存储缓存数据、WAL文件和WAL存档文件:

子目录名称 描述

{WORK_DIR}/db/{nodeId}

此目录包含缓存数据和索引。

{WORK_DIR}/db/wal/{nodeId}

此目录包含WAL文件。

{WORK_DIR}/db/wal/archive/{nodeId}

此目录包含WAL存档文件。

节点ID这里是一致的节点ID(如果在节点配置中定义)或自动生成的节点id。用于确保节点目录的唯一性。如果多个节点共享同一工作目录,则它们使用不同的子目录。

如果工作目录包含多个节点的持久性文件(有多个具有不同节点ID的{nodeId}子目录),则该节点将拾取未使用的第一个子目录。要确保节点始终使用特定的子目录,因此即使在重新启动后也要使用特定的数据分区,请设置点火配置.setConsistentId到节点配置中的集群范围唯一值。

您可以按如下方式更改存储目录:

<豆类 类=“org.apache.ignite.conformation.IgniteConfiguration”>
    <属性 姓名=“dataStorageConfiguration”>
        <豆类 类=“org.apache.ignite.conformation.DataStorageConfiguration”>
            <属性 姓名=“默认数据区域配置”>
                <豆类 类=“org.apache.ignite.conformation.DataRegionConfiguration”>
                    <属性 姓名=“persistenceEnabled” 价值=“正确”/>
                </bean>
            </属性>
            <属性 姓名=“存储路径” 价值=“/opt/存储”/>
        </bean>
    </属性>
</bean>
点火配置 cfg(立方英尺/加仑) = 新的 点火配置();

//数据存储配置
数据存储配置 存储Cfg = 新的 数据存储配置();

存储Cfg.获取默认数据区域配置().已启用setPersistenceEnabled(真的);

存储Cfg.设置存储路径(“/opt/存储”);

cfg(立方英尺/加仑).setDataStorageConfiguration(设置数据存储配置)(存储Cfg);

点燃 点燃 = 点火.开始(cfg(立方英尺/加仑));
无功功率,无功功率 cfg(立方英尺/加仑) = 新的 点火配置
{
    数据存储配置 = 新的 数据存储配置
    {
        存储路径 = “/ssd/存储”,

        默认数据区域配置 = 新的 数据区域配置
        {
            姓名 = “默认区域”,
            持久性已启用 = 真的
        }
    }
};

点火.起点(cfg(立方英尺/加仑));
此API目前不适用于C++。您可以使用XML配置。

您还可以更改WAL和WAL存档路径以指向存储目录之外的目录。有关详细信息,请参阅下一节。

写入磁头日志

预写日志是节点上发生的所有数据修改操作(包括删除)的日志。当在RAM中更新页面时,更新不会直接写入分区文件,而是附加到WAL的尾部。

预写日志的目的是为单个节点或整个集群宕机的情况提供恢复机制。在崩溃或重启的情况下,通过依赖WAL的内容,集群始终可以恢复到最新成功提交的事务。

WAL由几个文件(称为活动段)和一个存档文件组成。活动段按顺序填写,并按周期顺序覆盖。一旦第1段已满,其内容将复制到WAL存档(请参阅WAL存档第节)。复制第一段时,第二段被视为活动WAL文件,并接受来自应用程序端的所有更新。默认情况下,有10个活动段。

WAL模式

有三种WAL模式。每种模式对性能的影响不同,并提供不同的一致性保证。

模式 描述 一致性保证

FSYNC公司

每次原子写入或事务提交时,都保证将更改持久化到磁盘。

在任何操作系统或进程崩溃或电源故障后,数据更新都不会丢失。

日志_仅

默认模式。

对于每次原子写入或事务提交,都保证将更改刷新到操作系统缓冲区缓存或内存映射文件。

默认情况下使用内存映射文件方法,可以通过设置点火_警告_地图系统属性到.

数据更新在进程崩溃后仍然有效。

背景

点火_警告_地图属性已启用(默认),此模式的行为与日志_仅模式。

如果禁用内存映射文件方法,则更改将保留在节点的内部缓冲区中,并定期刷新到磁盘。冲洗频率通过walFlush频率参数。

点火_警告_地图属性,则该模式提供与日志_仅模式。

否则,在进程崩溃或其他中断的情况下,最近的数据更新可能会丢失。

WAL已禁用。只有在正常关闭节点时,更改才会持久化。使用点火.cluster().state(ClusterState.INACTIVE)停用集群并关闭节点。

可能会发生数据丢失。

如果节点在更新操作期间突然终止,则存储在磁盘上的数据很可能会不同步或损坏。

WAL存档

WAL存档用于存储崩溃后恢复节点可能需要的WAL段。存档中保存的段数应确保所有段的总大小不超过WAL存档的指定大小。

默认情况下,WAL存档的最大大小(它在磁盘上占用的总空间)定义为检查点缓冲区。您可以在中更改该值配置.

小心
将WAL存档大小设置为低于默认值的值可能会影响性能,应在生产中使用之前进行测试。

更改WAL段大小

默认的WAL段大小(64MB)在高负载情况下可能效率低下,因为它会导致WAL在段之间切换过于频繁,并且切换/旋转是一种昂贵的操作。较大的WAL段可以帮助提高高负载下的性能,但代价是增加WAL文件和WAL存档的总大小。

您可以在数据存储配置中更改WAL段文件的大小。该值必须介于512KB和2GB之间。

<豆类 类=“org.apache.ignite.conformation.IgniteConfiguration” 标识=“点火.cfg”>

    <属性 姓名=“dataStorageConfiguration”>
        <豆类 类=“org.apache.ignite.conformation.DataStorageConfiguration”>

            <!-- 将wal段的大小设置为128MB-->
            <属性 姓名=“walSegmentSize” 价值="#{128 * 1024 * 1024}"/>

            <属性 姓名=“默认数据区域配置”>
                <豆类 类=“org.apache.ignite.conformation.DataRegionConfiguration”>
                    <属性 名称=“persistenceEnabled” 价值=“正确”/>
                </bean>
            </属性>

        </bean>
    </属性>
</bean>
点火配置 cfg(立方英尺/加仑) = 新的 点火配置();
数据存储配置 存储Cfg = 新的 数据存储配置();
存储器配置.获取默认数据区域配置().已启用setPersistenceEnabled(真的);

存储Cfg.设置WalSegmentSize(128 * 1024 * 1024);

cfg(立方英尺/加仑).setDataStorageConfiguration(设置数据存储配置)(存储Cfg);

点燃 点燃 = 点火.开始(cfg(立方英尺/加仑));
此API目前不适用于C#/。净利润。您可以使用XML配置。
此API目前不适用于C++。您可以使用XML配置。

禁用WAL

警告
禁用或启用WAL只能在稳定拓扑上进行:所有基线节点都应该存在,在此操作期间,任何节点都不应加入或离开集群。否则,缓存可能会卡在不一致的状态。如果发生这种情况,建议销毁受影响的缓存。

在某些情况下,禁用WAL以获得更好的性能是合理的。例如,在初始数据加载期间禁用WAL,并在预加载完成后启用WAL很有用。

点火配置 cfg(立方英尺/加仑) = 新的 点火配置();
数据存储配置 存储Cfg = 新的 数据存储配置();
存储Cfg.获取默认数据区域配置().已启用setPersistenceEnabled(真的);

cfg(立方英尺/加仑).setDataStorageConfiguration(设置数据存储配置)(存储Cfg);

点燃 点燃 = 点火.开始(cfg(立方英尺/加仑));

点燃.集群().状态(ClusterState(群集状态).激活);

字符串 缓存名称 = “myCache”

点燃.获取或创建缓存(缓存名称);

点燃.集群().禁用Wal(缓存名称);

//负荷数据
点燃.集群().启用Wal(缓存名称);
无功功率,无功功率 缓存名称 = “myCache”
无功功率,无功功率 点燃 = 点火.起点();
点燃.获取群集().禁用沃尔玛(缓存名称);

//负荷数据

点燃.获取群集().启用Wal(缓存名称);
交流发电机   无记录

//...

交流发电机   登录中
此API目前不适用于C++。
警告
如果禁用WAL并重新启动节点,则会从该节点上的持久存储中删除所有数据。这是因为在节点崩溃或重新启动的情况下,如果没有WAL,则无法保证数据一致性。

WAL存档压缩

您可以启用WAL存档压缩以减少WAL存档占用的空间。默认情况下,WAL存档包含最后20个检查点的段(此数字是可配置的)。如果启用了压缩,则所有旧检查点为1的存档段都将以ZIP格式进行压缩。如果需要分段(例如,为了在节点之间重新平衡数据),则将其解压缩为RAW格式。

请参阅配置属性以了解如何启用WAL存档压缩。

WAL记录压缩

如中所述设计文件,表示数据更新的物理和逻辑记录在确认用户操作之前写入WAL文件。Ignite可以在WAL记录写入磁盘之前压缩内存中的WAL记录以节省空间。

WAL记录压缩要求启用“点火压缩”模块。请参见启用模块.

默认情况下,WAL记录压缩被禁用。要启用它,请在数据存储配置中设置压缩算法和压缩级别:

点火配置 cfg(立方英尺/加仑) = 新的 点火配置();

数据存储配置 dsCfg公司 = 新的 数据存储配置();
dsCfg公司.获取默认数据区域配置().已启用setPersistenceEnabled(真的);

//WAL页面压缩参数
dsCfg公司.设置WalPageCompression(磁盘页面压缩.LZ4型);
dsCfg公司.设置页面压缩级别(8);

cfg(立方英尺/加仑).setDataStorageConfiguration(设置数据存储配置)(dsCfg公司);
点燃 点燃 = 点火.开始(cfg(立方英尺/加仑));
此API目前不适用于C++。您可以使用XML配置。

中列出了支持的压缩算法磁盘页面压缩.

禁用WAL存档

在某些情况下,您可能希望禁用WAL存档,例如,以减少与将WAL段复制到存档相关的开销。在某些情况下,Ignite将数据写入WAL段的速度可能快于将段复制到存档中的速度。这可能会造成I/O瓶颈,从而冻结节点的操作。如果遇到此类问题,请尝试禁用WAL存档。

要禁用存档,请将WAL路径和WAL存档路径设置为相同的值。在这种情况下,Ignite不会将数据段复制到存档;相反,它会在WAL文件夹中创建新段。根据WAL存档大小设置,随着WAL的增长,旧段将被删除。

检查点

检查点是将脏页从RAM复制到磁盘上的分区文件的过程。脏页是在RAM中更新但未写入相应分区文件的页(但是,更新被附加到WAL中)。

创建检查点后,所有更改都将保存到磁盘,并且在节点崩溃并重新启动时可用。

检查点和写前日志记录旨在确保数据的持久性和节点故障时的恢复。

检查点持久性

此过程有助于通过保持页面在磁盘上处于最新状态来节省磁盘空间。通过检查点后,可以删除在该时间点之前创建的WAL段。

请参阅以下相关文档:

配置属性

下表描述了的一些属性数据存储配置.

属性名称 描述 默认值

持久性已启用

将此属性设置为真的以启用本机持久性。

存储路径

存储数据的路径。

${IGNITE_HOME}/work/db/node{IDX}-{用户识别码}

walPath(walPath)

存储活动WAL段的目录的路径。

${IGNITE_HOME}/work/db/wal/

walArchivePath(沃尔存档路径)

WAL存档的路径。

${IGNITE_HOME}/work/db/wal/archive/

wal压实已启用

设置为真的以启用WAL存档压缩.

walSegmentSize(墙段大小)

WAL段文件的大小(以字节为单位)。

64MB

walMode(沃尔模式)

写头日志记录模式.

日志_仅

wal压实水平

WAL存档压缩级别。1表示最快速度,以及9表示最佳压缩。

1

最大墙存档大小

WAL存档在文件系统上可以占用的最大大小(字节)。

大小的四倍检查点缓冲区.