重分片数据库

Neo4j 支持多种数据库重分片方法,具体取决于您的特定需求和约束条件。

  • 服务器重分片(在线):在创建时选择超过实际所需的属性分片数量,以便为数据增长预留空间,或者通过调整属性分片副本的数量来增减冗余度和读取扩展性。

  • 数据库重分片:复制现有的标准数据库,或者从 Neo4j 2026.03 版本开始,利用现有标准数据库或已分片属性数据库的备份,来创建一个具有所需数量属性分片的新已分片属性数据库。

服务器重分片(在线)

在线对已分片属性数据库进行重分片有两种方式:

在创建时选择超过所需的属性分片数量(在线)

您可以在创建时选择比实际需要更多的属性分片,并为数据增长留出空间,因为 Neo4j 集群允许根据服务器的可用性迁移数据库。例如,最初可以将 6 个属性分片分布在 3 台服务器上(每台服务器 2 个分片),并根据需要添加额外的服务器。

在创建时配置超过所需的属性分片数量来创建已分片属性数据库
CREATE DATABASE foo
GRAPH SHARD     { TOPOLOGY 1 PRIMARY 0 SECONDARIES }
PROPERTY SHARDS { COUNT 6 TOPOLOGY 1 REPLICA };

有关管理集群中数据库和服务器的详细信息,请参阅 管理集群中的数据库管理集群中的服务器

通过调整属性分片副本数量进行扩展(在线)

您可以调整已分片属性数据库中属性分片副本的数量,以在不停机的情况下实现更高或更低的冗余度和读取扩展性。

例如,要更改属性分片 foo-sharded-p000 的副本数量,请通过驱动程序或 Cypher Shell 连接到 DBMS,并运行以下命令:

ALTER DATABASE `foo-sharded-p000`
SET TOPOLOGY 2 REPLICAS;

数据库重分片

您可以通过复制现有数据库(可以是标准数据库,或自 Neo4j 2026.03 起的现有标准数据库或已分片属性数据库的备份)来创建具有所需数量属性分片的新已分片属性数据库。

将现有数据库拆分为分片(离线)

您可以使用 neo4j-admin database copy 命令从标准数据库创建已分片属性数据库,并指定新数据库的属性分片数量。在复制过程中,必须停止现有数据库。

可以为 neo4j-admin database copy 命令指定以下选项:

  • --copy-schema — 如果需要,复制现有数据库的模式。

  • --property-shard-count — 为新数据库创建的属性分片数量,必须大于 0。

  • --target-location — 目标备份制品数据的文件夹路径。需与 --target-format=backup 一起使用。

  • --target-format — 输出数据的格式。可能的值为 backupdatabase(默认)。

无法为已分片数据库指定存储格式;如果指定,它将被忽略,并记录一条警告。

以下示例展示了如何在集群部署中从现有的标准数据库 foo 创建一个名为 foo-sharded 的新已分片属性数据库。在复制过程中必须停止 foo 数据库。

  1. 将现有数据库 foo 中的数据复制到数据库 foo-sharded 中,创建一个图分片和三个属性分片。

    neo4j-admin database copy foo foo-sharded --copy-schema --property-shard-count 3 --target-location=s3://bucket/folder/ --target-format=backup

    有关 neo4j-admin database copy 命令的语法和选项的更多信息,请参阅 复制数据库存储

    复制数据库不会自动创建它。因此,此时执行 SHOW DATABASES 命令时将看不到该数据库。

  2. 通过驱动程序或 Cypher Shell 连接到 DBMS,并运行以下命令,通过从 AWS S3 存储桶中的备份文件夹进行播种(seeding),将 foo-sharded 创建为已分片属性数据库:

    CREATE DATABASE `foo-sharded`
    DEFAULT LANGUAGE CYPHER 25
    PROPERTY SHARDS { COUNT 3 }
    OPTIONS {seedUri: “s3://bucket/folder/”};

    集群会自动将数据分布到其服务器上。有关播种提供程序的更多信息,请参阅 通过 URI 创建已分片数据库(在线)

  3. 通过运行以下命令验证新数据库是否已上线:

    SHOW DATABASES;

从标准数据库备份创建已分片属性数据库(在线)

您可以使用 neo4j-admin database copy 命令从标准数据库的备份中创建已分片属性数据库。该过程类似于通过将现有数据库拆分为分片来进行重分片,但您使用的是标准数据库的备份,而不是直接使用标准数据库作为源。

应为 neo4j-admin database copy 命令指定以下选项:

  • --source-location — 现有数据库的完整备份或链中最后一个差异备份的路径。该文件夹可以位于本地或远程(例如 S3 存储桶),并且必须包含完整备份以及链中的所有差异备份(如果有)。

  • --source-format=backup — 源备份的格式。

  • --copy-schema — 如果需要,复制现有数据库的模式。

  • --property-shard-count — 为新数据库创建的属性分片数量,必须大于 0。

  • --target-location — 目标备份制品数据的文件夹路径。需与 --target-format=backup 一起使用。

  • --target-format — 输出数据的格式。可能的值为 backupdatabase(默认)。

由于尝试同时从两个不同位置提供数据会产生冲突,--source-location--source-format 不能与 --from-path-data 和/或 --from-path-txn 一起使用。
同样无法为已分片数据库指定存储格式;如果指定,它将被忽略,并记录一条警告。

以下示例展示了如何在集群部署中从现有数据库 foo 的备份中创建一个具有 3 个属性分片的已分片属性数据库 foo-sharded。假设您的 AWS S3 存储桶中已有 foo 数据库的备份。如果您没有数据库备份或不确定是否有当前备份,请执行步骤 1 和 2。否则,直接转至步骤 3。

  1. 通过驱动程序或 Cypher Shell 连接到 DBMS,并将数据库 foo 设置为只读模式,以确保在复制后您的 foo-sharded 版本包含旧数据库的所有数据。

    ALTER DATABASE foo SET ACCESS READ ONLY;
  2. 使用 neo4j-admin database backup 命令将数据库 foo 备份到集群可访问的位置(例如 AWS S3 存储桶)。--type=full 选项会强制创建数据库的完整备份,即使指定位置已有现有完整备份。

    bin/neo4j-admin database backup --type=full --to-path=s3://bucket/folder/ foo

    有关 neo4j-admin database backup 命令的语法和选项的更多信息,请参阅 将数据库备份到云存储

  3. 将标准数据库 foo 备份中的数据复制到数据库 foo-sharded 中,创建一个图分片和三个属性分片。

    neo4j-admin database copy foo foo-sharded --source-location=s3://bucket/folder/foo.backup --source-format=backup --copy-schema --property-shard-count 3 --target-location=s3://bucket/folder --target-format=backup

    有关 neo4j-admin database copy 命令的语法和选项的更多信息,请参阅 复制数据库存储

    复制数据库不会自动创建它。因此,此时执行 SHOW DATABASES 命令时将看不到该数据库。

  4. 通过驱动程序或 Cypher Shell 连接到 DBMS,并运行以下命令,通过从 AWS S3 存储桶中的备份文件夹进行播种,将 foo-sharded 创建为已分片属性数据库:

    CREATE DATABASE `foo-sharded`
    DEFAULT LANGUAGE CYPHER 25
    PROPERTY SHARDS { COUNT 3 }
    OPTIONS {seedUri: “s3://bucket/folder/”};

    集群会自动将数据分布到其服务器上。有关播种提供程序的更多信息,请参阅 通过 URI 创建数据库

  5. 等待所有数据库分配节点的最后提交事务 ID 相同,然后通过运行以下命令验证新数据库是否已上线:

    SHOW DATABASES;
  6. 新数据库上线后,如果不再需要旧数据库 foo,可以将其删除;或者如果您出于其他目的想保留它,可以将其设置为读写模式。

    运行以下命令删除旧数据库 foo

    DROP DATABASE foo;

    将旧数据库 foo 的访问模式更改为读写:

    ALTER DATABASE foo SET ACCESS READ WRITE;

从已分片属性数据库的备份创建已分片属性数据库(在线)

您可以使用 neo4j-admin database copy 命令从现有已分片属性数据库的备份中创建一个新的已分片属性数据库,并为新数据库指定不同的属性分片数量。该过程类似于从标准数据库的备份创建已分片属性数据库,但不是使用备份文件作为源,而是指定包含现有已分片属性数据库所有备份的文件夹作为源。

请记住,此过程可能需要很长时间才能完成,特别是当现有数据库很大时,因为它涉及从所有分片复制所有数据,并将其重新分布到新分片中。

应为 neo4j-admin database copy 命令指定以下选项:

  • --source-location — 包含现有已分片属性数据库所有备份的文件夹路径,包括图分片的完整备份及其所有差异备份链,以及每个属性分片的最新完整备份。该文件夹可以位于本地或远程(例如 S3 存储桶)。

  • --source-format=backup — 源备份的格式。

  • --copy-schema — 如果需要,复制现有数据库的模式。

  • --property-shard-count — 为新数据库创建的属性分片数量,必须大于 0。

  • --target-location — 目标备份制品数据的文件夹路径。需与 --target-format=backup 一起使用。

  • --target-format — 输出数据的格式。可能的值为 backupdatabase(默认)。

  • 要复制的数据库名称必须是虚拟数据库的名称。

由于尝试同时从两个不同位置提供数据会产生冲突,--source-location--source-format 不能与 --from-path-data 和/或 --from-path-txn 一起使用。
同样无法为已分片数据库指定存储格式;如果指定,它将被忽略,并记录一条警告。

以下示例展示了如何在集群部署中从现有的已分片属性数据库 foo-sharded 的备份中,创建一个具有 5 个属性分片的已分片属性数据库 foo-sharded-new。该操作假设您的 AWS S3 存储桶中已有 foo-sharded 数据库的备份。
如果您没有数据库备份或不确定是否有当前备份,请参阅 备份与恢复 获取如何备份数据库的说明。为了确保所有备份处于同一事务状态,建议将数据库设置为只读模式,使用 Cypher Shell 或驱动程序运行 ALTER DATABASE foo-sharded SET ACCESS READ ONLY。即使各个分片的备份具有不同的最后应用事务,复制操作也能工作,但可能会因为某个分片缺失最后几个事务的信息而导致数据丢失。

  1. 将已分片属性数据库 foo-sharded 备份中的数据复制到数据库 foo-sharded-new 中,将属性分片数量更改为 5。

    neo4j-admin database copy foo-sharded foo-sharded-new --source-location=s3://bucket/folder --source-format=backup --copy-schema --property-shard-count 5 --target-location=s3://bucket/folder/ --target-format=backup

    有关 neo4j-admin database copy 命令的语法和选项的更多信息,请参阅 复制数据库存储

    复制数据库不会自动创建它。因此,此时执行 SHOW DATABASES 命令时将看不到该数据库。

  2. 通过驱动程序或 Cypher Shell 连接到 DBMS,并运行以下命令,通过从 AWS S3 存储桶中的备份文件夹进行播种,将 foo-sharded-new 创建为已分片属性数据库:

    CREATE DATABASE `foo-sharded-new`
    DEFAULT LANGUAGE CYPHER 25
    PROPERTY SHARDS { COUNT 5 }
    OPTIONS {seedUri: “s3://bucket/folder/”};

    集群会自动将数据分布到其服务器上。有关播种提供程序的更多信息,请参阅 通过 URI 创建数据库

  3. 等待所有数据库分配节点的最后提交事务 ID 相同,然后通过运行以下命令验证新数据库是否已上线:

    SHOW DATABASES;
  4. 新数据库上线后,如果不再需要旧数据库 foo-sharded,可以将其删除;或者如果您出于其他目的想保留它,可以将其设置为读写模式。

    运行以下命令删除旧数据库 foo-sharded

    DROP DATABASE foo-sharded;

    将旧数据库 foo-sharded 的访问模式更改为读写:

    ALTER DATABASE foo-sharded SET ACCESS READ WRITE;