检查点和日志修剪

检查点是指将所有挂起的更新从易失性内存刷新到非易失性数据存储的过程。此操作对于限制在恢复过程中需要重放的事务数量至关重要,特别是为了最大程度地减少数据库不正常关闭或崩溃后恢复所需的时间。

独立于检查点是否存在,数据库操作仍然安全,因为任何尚未确认其修改已持久保存到存储的事务将在下次数据库启动时重放。但是,此保证取决于包含这些事务的更改集合的可用性,该集合在事务日志中维护。

如果由于检查点不频繁导致未应用的事务列表很长,则会导致事务日志的累积,因为事务日志对于恢复目的至关重要。检查点包括在事务日志中添加一个特殊的检查点条目,标记发生检查点的最后一次事务。此条目用于识别不再需要的的事务日志,因为它们包含的所有事务都已安全地存储在存储文件中。

消除不再需要用于恢复的事务日志的过程称为修剪。修剪依赖于检查点。检查点确定可以修剪哪些日志并确定修剪的发生时间,因为没有检查点意味着可用于修剪的事务日志文件集不可能发生变化。因此,每当发生检查点时,就会触发修剪。

配置检查点策略

检查点策略是日志修剪的驱动事件,由db.checkpoint配置。根据您的需求,检查点可以定期运行(这是默认设置),当一定量的数据写入事务日志时,或者连续运行。

表 1. 可用的检查点策略
策略 描述

PERIODIC

默认 此策略每 10 分钟检查一次是否有待刷新的更改,如果有,则执行检查点并随后触发日志修剪。周期性策略由db.checkpoint.interval.txdb.checkpoint.interval.time设置指定,并且当其中任何一个达到时都会触发检查点。有关更多详细信息,请参阅配置检查点间隔

VOLUME

当事务日志的大小达到由db.checkpoint.interval.volume设置指定的值时,此策略会运行检查点。默认情况下,它设置为250.00MiB

CONTINUOUS

企业版 此策略忽略db.checkpoint.interval.txdb.checkpoint.interval.time设置,并始终运行检查点过程。就像周期性策略一样,日志修剪在检查点完成后立即触发。

VOLUMETRIC

企业版 此策略每 10 秒检查一次是否有足够的日志可供修剪,如果有,则触发检查点,然后修剪日志。默认情况下,该容量设置为 256MiB,但可以使用设置db.tx_log.rotation.retention_policydb.tx_log.rotation.size进行配置。有关更多信息,请参阅配置事务日志轮换大小

配置检查点间隔

观察到您的事务日志文件比您预期的多,这可能是由于检查点发生频率不够或花费时间过长。这是一种临时情况,日志文件的预期数量和观察数量之间的差距将在下次成功的检查点上关闭。检查点之间的间隔可以使用以下方法配置

表 2. 检查点间隔配置
检查点配置 默认值 描述

15m

配置检查点之间的时间间隔。

100000

配置检查点之间的事务间隔。

控制事务日志修剪

事务日志修剪是指安全且自动删除旧的、不必要的事务日志文件。要删除文件,需要两件事

  • 该文件必须已轮换。

  • 在更新的日志文件中必须至少发生一个检查点。

事务日志修剪配置主要涉及指定应保留多少个事务日志。保留超过恢复绝对所需最小量的主要原因来自集群部署和在线备份的要求。由于数据库更新是通过事务日志在集群成员和备份客户端之间通信的,因此保留超过最小所需数量允许仅传输增量更改(以事务形式)而不是整个存储文件,这可以节省大量时间和网络带宽。

修剪操作后剩余的事务日志数量由设置db.tx_log.rotation.retention_policy控制。

db.tx_log.rotation.retention_policy的默认值已从2 天更改为2 天 2G,这意味着 Neo4j 保留包含两天内提交的任何事务的逻辑日志,以及指定的 2G 日志空间。有关更多信息,请参阅配置事务日志保留策略

拥有最少的事务日志数据可以加快检查点过程。要配置检查点过程允许使用的每秒 I/O 数量,请使用配置参数db.checkpoint.iops.limit

禁用 IOPS 限制可能会导致事务处理速度稍微降低。有关更多信息,请参阅检查点 IOPS 限制事务日志设置

检查点日志记录和指标

以下详细说明了在检查点事件发生时logs\debug.log中预期出现的消息

  • 基于db.checkpoint.interval.time的检查点

    2023-05-28 12:55:05.174+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Scheduled checkpoint for time threshold" @ txId: 49 checkpoint started...
    2023-05-28 12:55:05.253+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Scheduled checkpoint for time threshold" @ txId: 49 checkpoint completed in 79ms
  • 基于db.checkpoint.interval.tx的检查点

    2023-05-28 13:08:51.603+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Scheduled checkpoint for tx count threshold" @ txId: 118 checkpoint started...
    2023-05-28 13:08:51.669+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Scheduled checkpoint for tx count threshold" @ txId: 118 checkpoint completed in 66ms
  • db.checkpoint=continuous时的检查点

    2023-05-28 13:17:21.927+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Scheduled checkpoint for continuous threshold" @ txId: 171 checkpoint started...
    2023-05-28 13:17:21.941+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Scheduled checkpoint for continuous threshold" @ txId: 171 checkpoint completed in 13ms
  • 数据库关闭导致的检查点

    2023-05-28 12:35:56.272+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Database shutdown" @ txId: 47 checkpoint started...
    2023-05-28 12:35:56.306+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Database shutdown" @ txId: 47 checkpoint completed in 34ms
  • CALL db.checkpoint()导致的检查点

    2023-05-28 12:31:56.463+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Call to db.checkpoint() procedure" @ txId: 47 checkpoint started...
    2023-05-28 12:31:56.490+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Call to db.checkpoint() procedure" @ txId: 47 checkpoint completed in 27ms
  • 备份运行导致的检查点

    2023-05-28 12:33:30.489+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Full backup" @ txId: 47 checkpoint started...
    2023-05-28 12:33:30.509+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Checkpoint triggered by "Full backup" @ txId: 47 checkpoint completed in 20ms

检查点指标也可使用,并在metrics/目录中的以下文件中详细说明

neo4j.check_point.duration.csv
neo4j.check_point.total_time.csv
neo4j.check_point.events.csv