Neo4j 数据库管理系统上的 CDC
Neo4j 从事务日志中提取 CDC 信息。但是,默认情况下,事务日志不包含 CDC 直接可用的信息。要使 CDC 正常工作,需要通过更多信息来丰富事务日志。这作为每个数据库的额外配置选项应用。启用 CDC 后,数据库即可准备从客户端应用程序接收 CDC 查询。
CDC 有三种工作模式
-
OFF
— CDC 已禁用(默认值)。 -
DIFF
— 将变更捕获为每个已变更实体的之前和之后状态之间的差异(即,它们仅包含删除、更新和添加)。 -
FULL
— 将变更记录为每个已变更实体的之前和之后状态的完整副本(即,包含完整的节点/关系,而不管它们被修改的程度如何)。
切换 CDC 模式
创建启用了 CDC 的数据库
要创建启用了 CDC 的新数据库,请使用CREATE DATABASE
Cypher 命令并将选项 txLogEnrichment
设置为 FULL
或 DIFF
。
CREATE DATABASE <dbName> IF NOT EXISTS OPTIONS {txLogEnrichment: "FULL"}
修改数据库的 CDC 模式
要调整现有数据库上的 CDC 模式,请使用ALTER DATABASE
Cypher 命令并将选项 txLogEnrichment
设置为 FULL
或 DIFF
。
ALTER DATABASE <dbName> SET OPTION txLogEnrichment "DIFF"
将 CDC 模式从 |
获取数据库的 CDC 模式
要查看数据库的 CDC 模式是什么值,请使用SHOW DATABASES
Cypher 命令。
SHOW DATABASES YIELD name, options
名称 | 选项 |
---|---|
|
|
|
|
禁用 CDC
要禁用数据库上的 CDC,请将选项 txLogEnrichment
显式设置为 OFF
或完全删除它。
ALTER DATABASE <dbName> SET OPTION txLogEnrichment "OFF"
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;
非提升的执行权限通常是 |
此外,除非已授予用户访问权限,否则他们无权访问数据库。
GRANT ACCESS ON DATABASE $database TO $role
通常, |
过程db.cdc.current
和db.cdc.earliest
不需要管理员权限。要执行这些操作,只需访问数据库和常规执行权限即可。
有关 Neo4j 中过程权限的更多详细信息,请参阅操作手册→管理过程和用户定义函数权限。
磁盘大小
启用 CDC 后,会将更多数据写入该数据库的事务日志文件。因此,事务日志文件会更频繁地轮换和修剪。如果事务日志存储的磁盘大小有限,则磁盘可能会耗尽空间,因此请确保有足够的可用空间。
特别是,使用 DIFF
CDC 模式时,计划将写入事务日志的数据增加 50%,使用 FULL
CDC 模式时增加 75%。实际磁盘使用情况取决于应用程序、数据模型和事务特征。
事务日志保留
由于 CDC 信息存储在事务日志条目中,因此保留日志的时间决定了应用程序可以查询 CDC 数据的回溯时间。作为一般经验法则,您可以选择一个大于或等于下游应用程序的停机容忍度的周期,以便在应用程序有时间处理变更之前不会对其进行修剪。
您可以通过配置设置 db.tx_log.rotation.retention_policy
控制事务日志保留期。有关事务日志文件以及如何配置它们的更多详细信息,请参阅事务日志记录。
事务日志不仅由 CDC 使用,还由差异备份和集群操作使用。在为 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 **不会**捕获此类更改。