管理集群中的服务器

如前所述,在集群环境中,服务器管理与数据库管理完全独立。本节介绍如何在集群中操作服务器:添加和删除服务器,以及更改其元数据。

服务器状态

服务器可以在 DBMS 中存在于五种不同的状态

  • 空闲

  • 已启用

  • 正在释放

  • 已释放 在 5.15 中引入

  • 已隔离

  • 已删除

server states4

空闲状态

当服务器被发现服务发现(有关更多信息,请参阅 集群服务器发现)时,它将在 *空闲* 状态下创建。处于此状态的服务器具有唯一的自动生成的 ID,但其他方面未配置。这些空闲服务器尚未成为集群的一部分,也不能分配来托管任何数据库。

首次发现时,服务器的名称默认为其生成的服务器 ID 的值。

已启用状态

处于空闲状态的服务器需要显式启用,才能被视为集群中的活动成员。命令 `ENABLE SERVER server name` 用于将服务器过渡到 *已启用* 状态。服务器的初始名称是其 ID。如果服务器已启用,并且使用相同的选项执行该命令,则不会发生任何更改。

启用服务器时,可能的选项如下

选项 允许值 描述

modeConstraint

`PRIMARY`、`SECONDARY`、`NONE`

数据库只能在由约束指定的模式下托管在服务器上。`None` 表示没有约束,任何模式都是允许的。

allowedDatabases

数据库名称列表,例如 `["db1", "db2"]`

只有与指定名称匹配的数据库才能托管在服务器上。这不能与 `deniedDatabases` 一起指定。

deniedDatabases

数据库名称列表,例如 `["db1", "db2"]`

只有**不**与指定名称匹配的数据库才能托管在服务器上。这不能与 `allowedDatabases` 一起指定。

tags

服务器标签列表,例如 `["tag1", "tag2"]`

数据库分配期间以及负载均衡和路由策略中使用的服务器标签列表。 在 5.6 中引入

启用服务器时,如果未提供任何OPTIONS,则默认服务器值将从设置initial.server.mode_constraintinitial.server.allowed_databasesinitial.server.denied_databases和/或initial.server.tags中获取。

启用后,服务器可能会被分配数据库来托管。

释放状态

当不再需要服务器时,只要它仍然分配给托管任何数据库,就无法从集群中将其删除。DEALLOCATE DATABASE[S] FROM SERVER[S] server[,…​]命令用于将服务器过渡到释放状态,并将所有托管的数据库重新分配到集群中的其他服务器。此外,正在释放的服务器将不会再分配任何数据库。

已释放状态

当服务器处于释放状态时,它不再托管除system之外的任何数据库,并且可以从集群中删除。此外,已释放的服务器无法再分配任何数据库。请注意,已知在重新启动时,以前已释放的脱机服务器可能会短暂地显示为正在释放,但是,它最终将无需干预即可恢复到已释放状态。

隔离状态

隔离状态类似于释放,因为处于此状态的服务器不会被分配来托管其他数据库。但是,与释放不同,隔离服务器不会丢失它们已经托管的数据库。值得注意的是,在减少数据库分配数量时,首先会删除隔离服务器上的分配。

通过执行过程dbms.cluster.cordonServer,将服务器从已启用状态过渡到隔离状态。处于隔离状态的服务器可以过渡到释放状态,也可以过渡回已启用状态。

此状态主要用于错误处理

已删除状态

一旦服务器处于释放状态并且仅托管系统数据库,就可以安全地将其删除。DROP SERVER server name命令从集群中逻辑删除服务器。但是,只要服务器的 Neo4j 进程正在运行,它仍然对集群中的其他成员可见,处于已删除状态。一旦 Neo4j 进程停止,服务器最终就会消失。删除后,服务器无法重新加入集群。

相同的物理硬件可以重新加入集群,前提是 Neo4j 安装已“重置”(重新安装或运行neo4j-admin unbind),导致它在下次启动时接收新的生成的服务器 ID。

列出服务器

Cypher 命令SHOW SERVERS显示集群中运行的所有当前服务器,包括 DBMS 中尚未启用的服务器(即处于空闲状态的服务器)以及已删除的服务器。

neo4j@neo4j> SHOW SERVERS;
+------------------------------------------------------------------------------------------------------------------+
| name                                   | address          | state     | health      | hosting                    |
+------------------------------------------------------------------------------------------------------------------+
| "135ad202-5405-4d3c-9822-df39f59b823c" | "localhost:7690" | "Dropped" | "Available" | ["system"]                 |
| "25a7efc7-d063-44b8-bdee-f23357f89f01" | "localhost:7689" | "Enabled" | "Available" | ["system", "foo", "neo4j"] |
| "42a97acc-acf6-40c0-aff2-3993e90db1ff" | "localhost:7691" | "Free"    | "Available" | ["system"]                 |
| "782f0ee2-5474-4250-b905-4cd8b8f586ba" | "localhost:7688" | "Enabled" | "Available" | ["system", "foo", "neo4j"] |
| "8512c9b9-d9e8-48e6-b037-b15b0004ca18" | "localhost:7687" | "Enabled" | "Available" | ["system", "foo", "neo4j"] |
+------------------------------------------------------------------------------------------------------------------+

要显示有关集群中服务器的所有可用信息,请使用SHOW SERVERS YIELD *

neo4j@neo4j> SHOW SERVERS YIELD *;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| serverId                               | name                                   | address          | httpAddress      | httpsAddress | state          | health      | hosting                    | requestedHosting           | tags | allowedDatabases | deniedDatabases | modeConstraint | version          |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "135ad202-5405-4d3c-9822-df39f59b823c" | "135ad202-5405-4d3c-9822-df39f59b823c" | "localhost:7690" | "localhost:7477" | NULL         | "Deallocating" | "Available" | ["system"]                 | ["system"]                 | []   | []               | []              | "NONE"         | "5.0.0-drop09.0" |
| "25a7efc7-d063-44b8-bdee-f23357f89f01" | "25a7efc7-d063-44b8-bdee-f23357f89f01" | "localhost:7689" | "localhost:7476" | NULL         | "Enabled"      | "Available" | ["system", "foo", "neo4j"] | ["system", "foo", "neo4j"] | []   | []               | []              | "NONE"         | "5.0.0-drop09.0" |
| "42a97acc-acf6-40c0-aff2-3993e90db1ff" | "42a97acc-acf6-40c0-aff2-3993e90db1ff" | "localhost:7691" | "localhost:7478" | NULL         | "Free"         | "Available" | ["system"]                 | []                         | []   | []               | []              | "NONE"         | "5.0.0-drop09.0" |
| "782f0ee2-5474-4250-b905-4cd8b8f586ba" | "782f0ee2-5474-4250-b905-4cd8b8f586ba" | "localhost:7688" | "localhost:7475" | NULL         | "Enabled"      | "Available" | ["system", "foo", "neo4j"] | ["system", "foo", "neo4j"] | []   | []               | []              | "NONE"         | "5.0.0-drop09.0" |
| "8512c9b9-d9e8-48e6-b037-b15b0004ca18" | "8512c9b9-d9e8-48e6-b037-b15b0004ca18" | "localhost:7687" | "localhost:7474" | NULL         | "Enabled"      | "Available" | ["system", "foo", "neo4j"] | ["system", "foo", "neo4j"] | []   | []               | []              | "NONE"         | "5.0.0-drop09.0" |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

结果表显示有关服务器的信息

描述 类型 默认输出 完整输出

name

服务器的名称。

STRING

serverId

服务器的 ID。

STRING

address

服务器的 Bolt 地址(如果已启用)。

STRING

httpAddress

服务器的 Http 地址(如果已启用)。

STRING

httpsAddress

服务器的 Https 地址(如果已启用)。

STRING

state

服务器状态信息:freeenableddeallocatingcordoneddropped

STRING

health

服务器的可用性:availableunavailable

STRING

hosting

当前托管在服务器上的数据库列表。

LIST<STRING>

requestedHosting

应该托管在服务器上的数据库列表。组合数据库目前未出现在此列表中,但它们确实出现在所有服务器的hosting中。

LIST<STRING>

tags

标签是用户提供的字符串,可以在分配数据库时使用。

LIST<STRING>

allowedDatabases

允许托管在服务器上的数据库列表。

LIST<STRING>

deniedDatabases

不允许托管在服务器上的数据库列表。

LIST<STRING>

modeConstraint

分配器仅在服务器上分配此模式下的数据库的约束。

STRING

version

服务器运行的 Neo4j 版本。

STRING

将服务器添加到集群

要将服务器添加到正在运行的集群中(有关如何设置基本集群的更多信息,请参阅部署基本集群),将其配置为发现其他现有的集群成员。有几种不同的方法可以做到这一点,请参阅集群服务器发现。配置完新服务器以发现集群的成员后,可以启动它。

启动后,新服务器将出现在SHOW SERVERS的输出中,状态为空闲。从SHOW SERVERS中复制服务器的名称并启用它

neo4j@neo4j> ENABLE SERVER '42a97acc-acf6-40c0-aff2-3993e90db1ff';

ENABLE命令可以接受多个选项

neo4j@neo4j> ENABLE SERVER '25a7efc7-d063-44b8-bdee-f23357f89f01' OPTIONS
    {modeConstraint:'PRIMARY', allowedDatabases:['foo'], tags:['eu','eu-west']};

modeConstraint用于控制服务器是否可以用于仅以主模式或从模式托管数据库。allowedDatabasesdeniedDatabases是数据库名称的集合,用于过滤哪些数据库可以托管在服务器上。allowedDatabasesdeniedDatabases是互斥的,如果同时指定了这两个选项,则会返回错误。

可选地,可以通过将initial.dbms.automatically_enable_free_servers设置为true来自动启用空闲服务器。启动后可以使用dbms.cluster.setAutomaticallyEnableFreeServers过程更改此设置。

服务器tags用于数据库分配以及配置负载均衡和复制策略时。它们不能包含重复项,因此tags:['eu', 'eu']将返回错误。服务器标签也不能包含逗号。通过 cypher 更改服务器标签时,编码采用 UTF-8 进行。

allowedDatabasesdeniedDatabases不会影响组合数据库,它们始终在所有地方都可用。

如果没有设置选项,服务器可以以任何模式托管任何数据库。服务器还可以通过其neo4j.conf文件在启用时为这些选项提供默认值。

initial.server.mode_constraint='PRIMARY'
initial.server.allowed_databases='foo'
initial.server.denied_databases='bar','baz'
initial.server.tags=eu,eu-west

如果neo4j.confENABLE SERVER命令之间提供了冲突的选项,则使用提供给ENABLE SERVER的选项。

服务器标签的输入是逗号分隔的列表,不能包含重复项。

Neo4j .conf文件默认情况下使用Latin1进行编码。因此,对于需要更大字符集(例如中文或阿拉伯语)的服务器标签,建议使用 Cypher 更改服务器标签。

从 Neo4j 5.8.0 开始,.conf文件可以通过设置环境变量NEO4J_CONFIG_FILE_CHARSET=utf8来使用UTF-8。这允许通过配置设置更大字符集的服务器标签。

在添加的服务器上托管数据库

启用后,服务器不会自动托管数据库,除非

  • 创建新的数据库。

  • 现有数据库拓扑被更改为请求更多主机。

  • 另一个服务器过渡到释放状态。

  • 显式地重新平衡集群中的数据库。

REALLOCATE DATABASE[S]命令可用于重新平衡集群中的数据库分配,将一些数据库添加到新添加的服务器(s),有关更多信息,请参阅重新分配数据库

从集群中删除服务器

从集群中删除服务器需要两个步骤:释放,然后删除。

从服务器释放数据库

在从集群中删除服务器之前,使用DEALLOCATE DATABASES FROM SERVER 'name'将其设置为不托管任何数据库(有关更多信息,请参阅释放状态)。

DEALLOCATE DATABASES命令可以使用服务器 ID 或其名称。

neo4j@neo4j> DRYRUN DEALLOCATE DATABASES FROM SERVER '135ad202-5405-4d3c-9822-df39f59b823c';

从服务器释放数据库时,请务必注意每个数据库的拓扑结构,以确保集群中剩余的服务器数量足以满足每个数据库的拓扑结构。尝试从会造成可用服务器数量少于所需数量的服务器释放数据库(s)会导致失败,并会返回错误,不会进行任何更改。

例如,如果集群包含 5 台服务器,并且数据库foo的拓扑结构需要 3 个主服务器和 2 个从服务器,那么无法释放最初的 5 台服务器中的任何一台,除非先启用第 6 台服务器,或者更改foo所需的拓扑结构以减少所需的服务器数量。

该命令可以与DRYRUN一起使用,以查看如何从释放的服务器(s)中移动数据库。

neo4j@neo4j> DRYRUN DEALLOCATE DATABASES FROM SERVER '135ad202-5405-4d3c-9822-df39f59b823c';
+------------------------------------------------------------------------------------------------------------------------------------------+
| database | fromServerName | fromServerId                           | toServerName | toServerId                             | mode        |
+------------------------------------------------------------------------------------------------------------------------------------------+
| "db1"    | "server-3"     | "135ad202-5405-4d3c-9822-df39f59b823c" | "server-5"   | "00000003-b30a-434e-b9bf-1a5c8009773a" | "secondary" |
+------------------------------------------------------------------------------------------------------------------------------------------+

在以下情况下,当前阻止释放。

  • 如果服务器托管的数据库处于脱机状态。

  • 如果服务器托管的数据库的分配为 1 个主服务器。

  • 如果托管数据库的主模式的服务器的法定人数被隔离。

执行该命令后,服务器的状态将更改为deallocating,并且无法轻易重新启用,有关更多信息,请参阅已删除状态

删除服务器

一旦对服务器执行了DEALLOCATE DATABASES,其数据库就开始移动。在SHOW SERVERS报告正在释放的服务器处于 (已释放状态) 之前,不要尝试执行下一步。

例如,不要删除服务器135ad202-5405-4d3c-9822-df39f59b823c,因为以下输出

neo4j@neo4j> SHOW SERVERS;
+------------------------------------------------------------------------------------------------------------------+
| name                                   | address          | state          | health      | hosting               |
+------------------------------------------------------------------------------------------------------------------+
| "135ad202-5405-4d3c-9822-df39f59b823c" | "localhost:7690" | "Deallocating" | "Available" | ["system", "foo"]     |
+------------------------------------------------------------------------------------------------------------------+

释放过程可能需要一些时间,因为必须在135ad202-5405-4d3c-9822-df39f59b823c上成功复制并启动foo,然后才能在135ad202-5405-4d3c-9822-df39f59b823c上停止它,以保持foo的可用性和容错性。

一旦SHOW SERVERS反映出服务器已释放,并且因此不再托管foo,就可以删除服务器。可以使用服务器 ID 或其名称

neo4j@neo4j> DROP SERVER '135ad202-5405-4d3c-9822-df39f59b823c';

成功执行此命令后,可以停止该服务器上的 neo4j 进程。

控制服务器的元数据

更改服务器选项

可以使用ALTER SERVER 'name' SET OPTIONS { option: value }命令修改正在运行的服务器的选项。可以使用服务器的 ID 或名称。

例如,要阻止服务器托管PRIMARY中的数据库,请执行以下操作

neo4j@neo4j> ALTER SERVER '25a7efc7-d063-44b8-bdee-f23357f89f01' SET OPTIONS {modeConstraint:'SECONDARY'};

更改服务器可能会导致数据库移动,应谨慎执行。例如,如果服务器25a7efc7-d063-44b8-bdee-f23357f89f01在执行上述命令时以主模式托管数据库foo,那么另一台服务器必须开始以主模式托管foo

同样,如果执行ALTER SERVER '25a7efc7-d063-44b8-bdee-f23357f89f01' SET OPTIONS {allowedDatabases:['bar','baz']};,那么foo将被强制移动。

更改服务器时可能的选项是

选项 允许值 描述

modeConstraint

`PRIMARY`、`SECONDARY`、`NONE`

数据库只能在由约束指定的模式下托管在服务器上。`None` 表示没有约束,任何模式都是允许的。

allowedDatabases

数据库名称列表,例如 `["db1", "db2"]`

只有与指定名称匹配的数据库才能托管在服务器上。这不能与 `deniedDatabases` 一起指定。

deniedDatabases

数据库名称列表,例如 `["db1", "db2"]`

只有**不**与指定名称匹配的数据库才能托管在服务器上。这不能与 `allowedDatabases` 一起指定。

tags

服务器标签列表,例如 `["tag1", "tag2"]`

数据库分配期间以及负载均衡和路由策略中使用的服务器标签列表。 在 5.6 中引入

allowedDatabasesdeniedDatabases不会影响组合数据库,它们始终在所有地方都可用。

DEALLOCATE DATABASES FROM SERVER …​命令一样,如果更改服务器的选项导致集群无法满足一个或多个数据库的拓扑结构,那么该命令将失败,不会进行任何更改。

提供给SET OPTIONS {…​}的输入将替换**所有**现有选项,而不是与它们合并。例如,如果执行SET OPTIONS {modeConstraint:'SECONDARY'},然后执行SET OPTIONS {allowedDatabases:['foo']},则第二个ALTER的执行将删除模式约束。

重命名服务器

首次发现时,服务器名称默认为其生成的服务器 ID 的值。但是,只要服务器处于启用状态,可以使用以下命令在以后更改此名称

neo4j@neo4j> RENAME SERVER '25a7efc7-d063-44b8-bdee-f23357f89f01' TO 'eu-server-4';

这只会影响服务器的名称;服务器的 ID 保持不变,为25a7efc7-d063-44b8-bdee-f23357f89f01。请记住,服务器名称在现有服务器中必须是唯一的。

错误处理

偶尔,集群中的服务器可能会遇到网络分区或进程崩溃等问题。观察这些服务器故障的最简单方法是执行SHOW SERVERS并检查health列中的'Unavailable'

Available 健康状态并不表示服务器运行完美,而只是表示集群中的其他服务器能够与其建立连接。有关集群和服务器健康的更深入监控,请参阅监控服务器

如果Unavailable服务器的问题被证明是永久性的,则应删除该服务器。但是,如果问题是暂时的,则可能不希望完全删除这些服务器,因为这会导致其托管的所有数据库被迁移。相反,最好阻止这些服务器分配任何新的数据库,无论这些数据库是由于创建还是迁移而产生的。

这称为将问题服务器隔离,可以通过对system数据库执行以下过程来实现

neo4j@neo4j> CALL dbms.cluster.cordonServer('25a7efc7-d063-44b8-bdee-f23357f89f01');

然后SHOW SERVERS应该反映问题服务器现在处于隔离状态。

一旦服务器的问题得到解决,可以将服务器恢复到之前的已启用状态,方法如下

neo4j@neo4j> ENABLE SERVER '25a7efc7-d063-44b8-bdee-f23357f89f01';

未隔离的不可用服务器仍然可能被分配来托管新数据库。当服务器恢复时,它会观察到它应该托管这些数据库,并从其他可用服务器(如果存在)开始追赶。但是,在此期间,这些数据库的容错性降低了,或者更糟的是,可用性降低了。有关详细信息,请参阅灾难恢复