知识库

系统数据库概述

Neo4j 4.0 及更高版本支持在同一数据库管理系统中管理多个数据库。所有这些数据库都通过一个名为system的特殊数据库进行控制。

本文简要概述了system数据库的架构。

system数据库的作用是**定义其他数据库的配置**。数据库可能有多种类型的配置。例如

  • 操作配置

    • 存在(存在或不存在)

    • 状态(联机/脱机)

  • 安全配置(RBAC)

  • neo4j.conf(这尚未由system数据库维护,但未来版本有计划)

configuration

在独立和集群环境中,许多有趣的操作工作(在后台)由一个称为**协调器**的组件处理。请参阅下面的图 2。

reconciler

system数据库在集群中复制,并且与任何其他数据库一样,它都有一个领导者。4.0 及以后版本中的每个数据库都位于独立的 Raft 组中。这意味着核心 1 可能是system数据库的领导者,而核心 2 可能是mydb数据库的领导者。system数据库中的所有内容也存储在图数据模型中。但是,只有 DDL 命令(CREATE、DROP、SHOW 等)可以在此数据库中执行,而不能执行常规 Cypher 命令(例如 MATCH)。有一些节点表示其他数据库(在此示例中来自图 2 的neo4jmydb)。

**协调器**与另一个称为**数据库管理器**的组件通信,后者管理实际的数据库。每个实例都协调所有数据库的本地副本。如果核心 2 上的协调器(在上面的示例中)知道mydb在领导者(核心 1)中联机,它将确保mydb在此实例中也联机。每个实例中的system数据库都有一个协调器和一个数据库管理器。

协调器的作用是在所需状态(STOPPED、STARTED、DROPPED)和当前状态之间进行协调。

协调器的一个重要方面是它完全异步地运行,并且始终从写入系统数据库的复制“真相来源”所需状态运行。例如,如果某个服务器与集群的其余部分断开连接一段时间,或者由于某种原因落后,那么它将不会获得对“所需状态”的更新,因此该服务器上的协调器不会执行其他服务器已经执行的操作更改。但是,一旦集群恢复正常,并且具有连接性,协调器将继续运行。

当创建名为mydb的数据库时,会在system数据库中创建一个标签为Database的节点。该节点还有一些其他属性,例如namestatusuuid,如上图所示。需要注意的是,当删除mydb数据库时,节点的标签将更改为DeletedDatabase

这是一个单个数据库节点的示例

( n:Database { name : mydb, uuid: 7242f697-7f4f-4bbf-b989-aad3e8980bfb, status: online } )

如果它被删除,只需将 Database 标签更改为 DeletedDatabase

( n:DeletedDatabase { name : mydb, uuid: 7242f697-7f4f-4bbf-b989-aad3e8980bfb, status: offline } )

在内部唯一标识数据库的属性是uuid,其类型为 UUID。因此,您可以 DROP 数据库neo4j,然后再次 CREATE 它。在内部,第一个数据库将存在于DeletedDatabase标签下,而新数据库将具有Database标签和不同的uuid

备份system数据库时,请记住它包含操作配置。假设在执行system数据库的联机备份时,mydb数据库已停止。因此,当您还原system数据库备份时,mydb将处于停止状态。因此,操作状态始终由system数据库中的内容定义。

以下是执行SHOW DATABASES命令时协调器将发布的所有状态的状态图(图 3)。

states

文件系统中文件夹(例如$neo4j_home/data/database/mydb)的存在并不定义数据库的存在。它由system数据库中的内容决定。如果数据库不在system数据库中,则即使该文件夹存在,它也不会被注册。要让系统获取数据库,您需要执行CREATE DATABASE mydb

此外,如果system数据库具有数据库Xdb,并且在还原它之前,$neo4j_home/data/database/位置中没有此类数据库,则协调器将创建该文件夹,现在您将拥有一个空白的Xdb。但是,如果集群中还有其他实例正在积极运行Xdb数据库,则集群绑定过程将对该数据库执行**存储副本**,而不是创建空数据库。

最后,以下是一些关于多数据库操作的注意事项

  1. 需要以与备份其他数据库相同的频率备份system数据库。

  2. 如果您查看debug.log,则 Raft 成员资格的MemberId对于每个数据库将不会不同。一个实例中的所有数据库都将具有相同的MemberId

  3. 所有多数据库管理命令都必须针对system数据库运行。当通过 Bolt 连接到数据库管理系统时,这些管理命令会自动路由到system数据库。

  4. 本机用户存储在system数据库中,安全模型也存储在此处。

  5. neo4j-admin unbind在特定服务器上的所有数据库上运行。

  6. dbms.memory.pagecache.sizedbms.memory.heap.initial_sizedbms.memory.heap.max_size设置都位于实例级别。所有数据库都在一个 JVM 下运行,它们共享相同的页面缓存和堆。