检查点和日志清理
检查点是将所有待处理更新从易失性内存刷新到非易失性数据存储的过程。此操作对于限制在恢复过程中需要重放的事务数量至关重要,特别是为了最小化数据库不当关闭或崩溃后的恢复时间。
独立于检查点是否存在,数据库操作仍然安全,因为任何尚未确认其修改已持久化到存储的事务将在下次数据库启动时重放。然而,此保证取决于包含这些事务的变更集合的可用性,这些变更集合保存在事务日志中。
维护一个长长的未应用事务列表(由于不频繁的检查点)会导致事务日志的累积,因为它们对于恢复目的至关重要。检查点涉及在事务日志中包含一个特殊的 检查点 条目,标记发生检查点的最后一个事务。此条目用于识别不再需要的事务日志,因为它们包含的所有事务都已安全地存储在存储文件中。
消除恢复不再需要的事务日志的过程称为 清理。清理依赖于检查点。检查点决定了哪些日志可以被清理,并决定了清理的发生,因为没有检查点意味着可用于清理的事务日志文件集没有改变。因此,每当检查点发生时,就会触发清理。
有关 Neo4j 4.4 中检查点和日志清理的信息,请分别参阅配置设置 → 检查点设置、性能 → 检查点 IOPS 限制和事务日志 → 日志清理。 |
配置检查点策略
检查点策略是日志清理的驱动事件,由 db.checkpoint
配置。根据您的需求,检查点可以定期运行(这是默认设置)、在一定量数据写入事务日志后运行,或持续运行。
策略 | 描述 |
---|---|
|
默认 此策略每 10 分钟检查一次是否有待刷新更改,如果有,则执行检查点并随后触发日志清理。周期性策略由 |
|
当事务日志的大小达到 |
|
企业版 此策略会忽略 |
|
企业版 此策略每 10 秒检查一次是否有足够的日志量可供清理,如果有,则触发检查点,随后清理日志。默认情况下,卷设置为 256MiB,但可以使用 |
配置检查点间隔
如果发现事务日志文件数量超出预期,这很可能是因为检查点不够频繁或耗时过长。这是一种临时情况,在下次成功检查点后,预期与实际日志文件数量之间的差距将消除。检查点之间的间隔可以通过以下方式配置:
检查点配置 | 默认值 | 描述 |
---|---|---|
|
配置检查点之间的时间间隔。 |
|
|
配置检查点之间的事务间隔。 |
控制事务日志清理
事务日志清理是指安全自动地删除旧的、不必要的事务日志文件。要删除文件,需要满足两个条件:
-
文件必须已经轮转。
-
在较新的日志文件中至少发生过一个检查点。
事务日志清理配置主要涉及指定应保留的事务日志数量。保留超过恢复所需的绝对最小量的主要原因来自集群部署和在线备份的要求。由于数据库更新是通过事务日志在集群成员和备份客户端之间通信的,因此保留超过最小必要量允许只传输增量更改(以事务的形式),而不是整个存储文件,这可以大大节省时间和网络带宽。
清理操作后剩余的事务日志数量由 db.tx_log.rotation.retention_policy
设置控制。
db.tx_log.rotation.retention_policy
的默认值从 2 days
更改为 2 days 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