Neo4j 数据库管理系统上的 CDC

Neo4j 从事务日志中提取 CDC 信息。但是,默认情况下,事务日志不包含 CDC 直接可用的信息。要使 CDC 正常工作,需要通过更多信息来丰富事务日志。这作为每个数据库的额外配置选项应用。启用 CDC 后,数据库即可准备从客户端应用程序接收 CDC 查询。

CDC 有三种工作模式

  • OFF — CDC 已禁用(默认值)。

  • DIFF — 将变更捕获为每个已变更实体的之前和之后状态之间的差异(即,它们仅包含删除、更新和添加)。

  • FULL — 将变更记录为每个已变更实体的之前和之后状态的完整副本(即,包含完整的节点/关系,而不管它们被修改的程度如何)。

切换 CDC 模式

创建启用了 CDC 的数据库

要创建启用了 CDC 的新数据库,请使用CREATE DATABASE Cypher 命令并将选项 txLogEnrichment 设置为 FULLDIFF

查询
CREATE DATABASE <dbName> IF NOT EXISTS OPTIONS {txLogEnrichment: "FULL"}

修改数据库的 CDC 模式

要调整现有数据库上的 CDC 模式,请使用ALTER DATABASE Cypher 命令并将选项 txLogEnrichment 设置为 FULLDIFF

查询
ALTER DATABASE <dbName> SET OPTION txLogEnrichment "DIFF"

将 CDC 模式从 DIFF 修改为 FULL 或反之亦然会立即更改捕获变更的结构。您的 CDC 应用程序必须能够处理格式更改。

获取数据库的 CDC 模式

要查看数据库的 CDC 模式是什么值,请使用SHOW DATABASES Cypher 命令。

查询
SHOW DATABASES YIELD name, options
表 1. 结果
名称 选项

"neo4j"

{"txLogEnrichment": "DIFF"}

"system"

{}

禁用 CDC

要禁用数据库上的 CDC,请将选项 txLogEnrichment 显式设置为 OFF 或完全删除它。

使用 set 选项子句
ALTER DATABASE <dbName> SET OPTION txLogEnrichment "OFF"
使用 remove 选项子句
ALTER DATABASE <dbName> REMOVE OPTION txLogEnrichment

禁用 CDC 会立即中断变更事件的连续性。在禁用 CDC 之前生成的变更标识符将无法再使用,即使重新启用 CDC,之前生成的变更标识符仍然无效。禁用然后重新启用 CDC 等效于首次启用它:不会记住之前的变更。

关键注意事项

安全性

CDC 返回数据库中的所有变更,并且不限于特定用户有权访问的实体。为了防止未经授权的访问,过程db.cdc.query需要管理员权限,应配置为最小权限访问。

要使普通用户能够运行 db.cdc.query,必须授予该用户执行权限以及提升的执行权限。

GRANT EXECUTE PROCEDURE db.cdc.query ON DBMS TO $role;
GRANT EXECUTE BOOSTED PROCEDURE db.cdc.query ON DBMS TO $role;

非提升的执行权限通常是 PUBLIC 角色的一部分,在这种情况下,无需再次授予。

此外,除非已授予用户访问权限,否则他们无权访问数据库。

GRANT ACCESS ON DATABASE $database TO $role

通常,PUBLIC 角色已具有对默认数据库的访问权限。

过程db.cdc.currentdb.cdc.earliest不需要管理员权限。要执行这些操作,只需访问数据库和常规执行权限即可。

有关 Neo4j 中过程权限的更多详细信息,请参阅操作手册→管理过程和用户定义函数权限

磁盘大小

启用 CDC 后,会将更多数据写入该数据库的事务日志文件。因此,事务日志文件会更频繁地轮换和修剪。如果事务日志存储的磁盘大小有限,则磁盘可能会耗尽空间,因此请确保有足够的可用空间。

特别是,使用 DIFF CDC 模式时,计划将写入事务日志的数据增加 50%,使用 FULL CDC 模式时增加 75%。实际磁盘使用情况取决于应用程序、数据模型和事务特征。

事务日志保留

由于 CDC 信息存储在事务日志条目中,因此保留日志的时间决定了应用程序可以查询 CDC 数据的回溯时间。作为一般经验法则,您可以选择一个大于或等于下游应用程序的停机容忍度的周期,以便在应用程序有时间处理变更之前不会对其进行修剪。

您可以通过配置设置 db.tx_log.rotation.retention_policy 控制事务日志保留期。有关事务日志文件以及如何配置它们的更多详细信息,请参阅事务日志记录

事务日志不仅由 CDC 使用,还由差异备份和集群操作使用。在为 CDC 需求设置保留期时,请记住它可能会影响系统的其他区域。
示例 1. 事务日志配置和 CDC 行为

此示例显示了给定服务器配置导致的行为。

db.tx_log.rotation.retention_policy = 2G 1Day
db.tx_log.rotation.size = 256M
db.checkpoint.interval.time = 15m
db.checkpoint.interval.tx = 100000

随着新事务的到来,服务器会将其写入日志文件。当该文件超过 256MB 时,它会创建一个新文件并继续在那里写入(尽管事务永远不会跨文件中断,因此如果当前日志在 255MB 时有 5MB 的新事务进来,则该文件将在轮换到新文件之前增长到 260MB)。

每 15 分钟 100000 个事务(以先发生者为准),服务器都会从新到旧遍历事务日志文件。当扫描文件的总和大于 2GB 时,所有后续文件都将被删除,包括最新扫描的文件,以便总大小再次低于 2GB。超过 1 天的文件也将被删除。

换句话说,服务器最多保留 2GB 的事务日志,只要它们都比 1 天新即可。只要它们都比 1 天新,服务器就至少保留 2GB - 256MB 的事务日志(当前日志文件总是需要 256MB 来增长)。如果大型事务导致日志文件大于 256MB,则保留的日志的最小大小可能小于 2GB - 256MB

未记录的变更

CDC 只能捕获通过事务层传递的数据更改,因此任何绕过此层的任何数据创建都无法捕获。例如,当使用 neo4j-admin database import 工具导入数据(无论是完整导入还是增量导入),或使用 neo4j-admin database load 工具加载数据时,数据会直接写入存储,而不会向事务日志发送任何内容,因此 CDC **不会**捕获此类更改。