系统数据库概述
Neo4j 4.0 及更高版本支持在同一数据库管理系统中管理多个数据库。所有这些数据库都通过一个名为system
的特殊数据库进行控制。
本文简要概述了system
数据库的架构。
system
数据库的作用是**定义其他数据库的配置**。数据库可能有多种类型的配置。例如
-
操作配置
-
存在(存在或不存在)
-
状态(联机/脱机)
-
-
安全配置(RBAC)
-
neo4j.conf
(这尚未由system
数据库维护,但未来版本有计划)
在独立和集群环境中,许多有趣的操作工作(在后台)由一个称为**协调器**的组件处理。请参阅下面的图 2。
system
数据库在集群中复制,并且与任何其他数据库一样,它都有一个领导者。4.0 及以后版本中的每个数据库都位于独立的 Raft 组中。这意味着核心 1 可能是system
数据库的领导者,而核心 2 可能是mydb
数据库的领导者。system
数据库中的所有内容也存储在图数据模型中。但是,只有 DDL 命令(CREATE、DROP、SHOW 等)可以在此数据库中执行,而不能执行常规 Cypher 命令(例如 MATCH)。有一些节点表示其他数据库(在此示例中来自图 2 的neo4j
和mydb
)。
**协调器**与另一个称为**数据库管理器**的组件通信,后者管理实际的数据库。每个实例都协调所有数据库的本地副本。如果核心 2 上的协调器(在上面的示例中)知道mydb
在领导者(核心 1)中联机,它将确保mydb
在此实例中也联机。每个实例中的system
数据库都有一个协调器和一个数据库管理器。
协调器的作用是在所需状态(STOPPED、STARTED、DROPPED)和当前状态之间进行协调。
协调器的一个重要方面是它完全异步地运行,并且始终从写入系统数据库的复制“真相来源”所需状态运行。例如,如果某个服务器与集群的其余部分断开连接一段时间,或者由于某种原因落后,那么它将不会获得对“所需状态”的更新,因此该服务器上的协调器不会执行其他服务器已经执行的操作更改。但是,一旦集群恢复正常,并且具有连接性,协调器将继续运行。
当创建名为mydb
的数据库时,会在system
数据库中创建一个标签为Database
的节点。该节点还有一些其他属性,例如name
、status
、uuid
,如上图所示。需要注意的是,当删除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)。
文件系统中文件夹(例如$neo4j_home/data/database/mydb
)的存在并不定义数据库的存在。它由system
数据库中的内容决定。如果数据库不在system
数据库中,则即使该文件夹存在,它也不会被注册。要让系统获取数据库,您需要执行CREATE DATABASE mydb
。
此外,如果system
数据库具有数据库Xdb
,并且在还原它之前,$neo4j_home/data/database/
位置中没有此类数据库,则协调器将创建该文件夹,现在您将拥有一个空白的Xdb
。但是,如果集群中还有其他实例正在积极运行Xdb
数据库,则集群绑定过程将对该数据库执行**存储副本**,而不是创建空数据库。
最后,以下是一些关于多数据库操作的注意事项
-
需要以与备份其他数据库相同的频率备份
system
数据库。 -
如果您查看
debug.log
,则 Raft 成员资格的MemberId
对于每个数据库将不会不同。一个实例中的所有数据库都将具有相同的MemberId
。 -
所有多数据库管理命令都必须针对
system
数据库运行。当通过 Bolt 连接到数据库管理系统时,这些管理命令会自动路由到system
数据库。 -
本机用户存储在
system
数据库中,安全模型也存储在此处。 -
neo4j-admin unbind
在特定服务器上的所有数据库上运行。 -
dbms.memory.pagecache.size
、dbms.memory.heap.initial_size
和dbms.memory.heap.max_size
设置都位于实例级别。所有数据库都在一个 JVM 下运行,它们共享相同的页面缓存和堆。
此页面是否有帮助?