在集群中管理服务器

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

服务器状态

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

  • 空闲

  • 已启用

  • 正在解除分配

  • 已解除分配

  • 受限

  • 已丢弃

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"]

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

当启用服务器时,如果未提供 OPTIONS,则默认服务器值将取自设置 initial.server.mode_constraintinitial.server.allowed_databasesinitial.server.denied_databases 和/或 initial.server.tags

一旦启用,服务器就可以被分配数据库来托管。

正在解除分配状态

当服务器不再需要时,如果它仍然被分配来托管任何数据库,则无法将其从集群中移除。命令 DEALLOCATE DATABASE[S] FROM SERVER[S] server[,…​] 用于将服务器转换为正在解除分配状态,将其所有托管的数据库重新分配给集群中的其他服务器。此外,正在解除分配的服务器将不会再被分配任何数据库。

已解除分配状态

当服务器处于已解除分配状态时,它不再托管除 system 之外的任何数据库,并且可以从集群中移除。此外,已解除分配的服务器不能再被分配任何数据库。请注意,存在一种已知情况,即之前已解除分配的离线服务器在重启时可能会暂时显示为正在解除分配,但最终会无需干预地返回到已解除分配状态。

受限状态

受限状态与正在解除分配状态类似,因为处于此状态的服务器将不会被分配来托管额外的数据库。然而,与正在解除分配不同的是,受限服务器不会失去它们已经托管的数据库。值得注意的是,当减少数据库的分配数量时,会首先移除受限服务器上的分配。

通过对 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

服务器名称。

字符串

serverId

服务器ID。

字符串

address

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

字符串

httpAddress

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

字符串

httpsAddress

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

字符串

state

服务器状态信息:freeenableddeallocatingcordoneddropped

字符串

health

服务器的可用性:availableunavailable

字符串

hosting

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

列表<字符串>

requestedHosting

应托管在服务器上的数据库列表。复合数据库目前不会出现在此列表中,但会出现在所有服务器的 hosting 中。

列表<字符串>

tags

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

列表<字符串>

allowedDatabases

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

列表<字符串>

deniedDatabases

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

列表<字符串>

modeConstraint

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

字符串

version

服务器正在运行的 Neo4j 版本。

字符串

向集群添加服务器

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

启动后,新服务器将以空闲状态出现在 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_CONFIG_FILE_CHARSET=utf8.conf 文件可以使用 UTF-8。这允许通过配置设置具有更大字符集的服务器标签。

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

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

  • 创建新数据库。

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

  • 另一个服务器转换为正在解除分配状态。

  • 您明确地在集群中重新平衡数据库。

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

从集群中移除服务器

从集群中移除服务器需要两个步骤:解除分配,然后丢弃。

从服务器解除数据库分配

为了从集群中移除服务器,请使用 DEALLOCATE DATABASES FROM SERVER 'name' 将其设置为不托管任何数据库(有关更多信息,请参见正在解除分配状态)。

服务器 ID 或其名称都可以与 DEALLOCATE DATABASES 命令一起使用

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

从服务器解除数据库分配时,务必注意每个数据库的拓扑结构,以确保集群中剩余的服务器足以满足每个数据库的拓扑结构。尝试从服务器解除数据库分配,如果导致可用服务器少于所需数量,则会失败并报错,且不会进行任何更改。

例如,如果集群包含 5 台服务器,并且数据库 foo 的拓扑结构要求 3 个主节点和 2 个辅助节点,那么在不先启用第 6 台服务器,或更改 foo 的所需拓扑以减少服务器总数的情况下,无法解除分配任何原始 5 台服务器。

该命令可以与 DRYRUN 一起使用,以查看数据库将如何从已解除分配的服务器中移动。

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"]     |
+------------------------------------------------------------------------------------------------------------------+

解除分配过程可能需要一些时间,因为必须先将 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"]

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

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';

未受限的不可用服务器仍可能被分配来托管新数据库。当服务器恢复时,它会发现自己需要托管这些数据库,并开始从其他可用服务器(如果存在)追赶。然而,在此期间,这些数据库的容错能力会降低,甚至可用性也会降低。有关更多详细信息,请参见灾难恢复

© . All rights reserved.