在集群中管理服务器
如前所述,在集群环境中,服务器管理与数据库管理是完全独立的。本节介绍如何在集群中操作服务器:添加和移除服务器,以及修改它们的元数据。
服务器状态
服务器在 DBMS 中可以有五种不同的状态
-
空闲
-
已启用
-
正在解除分配
-
已解除分配
-
受限
-
已丢弃

空闲状态
当发现服务发现服务器时(更多信息请参见集群服务器发现),它将以空闲状态创建。此状态下的服务器具有唯一自动生成的 ID,但未进行其他配置。这些空闲服务器尚未成为集群的一部分,无法被分配来托管任何数据库。
首次发现时,服务器的名称默认为其生成的服务器 ID 的值。 |
已启用状态
处于空闲状态的服务器需要明确启用,才能被视为集群的活动成员。命令 ENABLE SERVER server name
用于将服务器转换为此已启用状态。服务器的初始名称是其 ID。如果服务器已经启用,并且使用相同的选项执行此命令,则不会发生任何变化。
启用服务器时可能的选项有
选项 | 允许值 | 描述 |
---|---|---|
modeConstraint |
|
数据库只能以约束指定的模式托管在服务器上。 |
allowedDatabases |
数据库名称列表,例如 |
只有与指定名称匹配的数据库才能托管在服务器上。此选项不能与 |
deniedDatabases |
数据库名称列表,例如 |
只有不与指定名称匹配的数据库才能托管在服务器上。此选项不能与 |
tags |
服务器标签列表,例如 |
在数据库分配以及负载均衡和路由策略中使用的服务器标签列表。 |
当启用服务器时,如果未提供 |
一旦启用,服务器就可以被分配数据库来托管。
正在解除分配状态
当服务器不再需要时,如果它仍然被分配来托管任何数据库,则无法将其从集群中移除。命令 DEALLOCATE DATABASE[S] FROM SERVER[S] server[,…]
用于将服务器转换为正在解除分配状态,将其所有托管的数据库重新分配给集群中的其他服务器。此外,正在解除分配的服务器将不会再被分配任何数据库。
已解除分配状态
当服务器处于已解除分配状态时,它不再托管除 system
之外的任何数据库,并且可以从集群中移除。此外,已解除分配的服务器不能再被分配任何数据库。请注意,存在一种已知情况,即之前已解除分配的离线服务器在重启时可能会暂时显示为正在解除分配,但最终会无需干预地返回到已解除分配状态。
受限状态
受限状态与正在解除分配状态类似,因为处于此状态的服务器将不会被分配来托管额外的数据库。然而,与正在解除分配不同的是,受限服务器不会失去它们已经托管的数据库。值得注意的是,当减少数据库的分配数量时,会首先移除受限服务器上的分配。
通过对 system
数据库执行过程 dbms.cluster.cordonServer
,服务器从已启用状态转换为受限状态。处于受限状态的服务器可以转换为正在解除分配状态,或返回到已启用状态。
此状态主要用于错误处理。
列出服务器
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 |
服务器状态信息: |
|
||
health |
服务器的可用性: |
|
||
hosting |
服务器当前托管的数据库列表。 |
|
||
requestedHosting |
应托管在服务器上的数据库列表。复合数据库目前不会出现在此列表中,但会出现在所有服务器的 |
|
||
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
用于控制服务器是否只能以主模式或辅助模式托管数据库。allowedDatabases
和 deniedDatabases
是数据库名称的集合,用于筛选哪些数据库可以托管在服务器上。allowedDatabases
和 deniedDatabases
互斥,如果两者都指定,则返回错误。
可选地,可以通过将 initial.dbms.automatically_enable_free_servers
设置为 true
来自动启用空闲服务器。这可以在启动后使用 dbms.cluster.setAutomaticallyEnableFreeServers
过程进行更改。
服务器 tags
用于数据库分配以及配置负载均衡和复制策略。它们不能包含重复项,因此 tags:['eu', 'eu']
将返回错误。服务器标签也不能包含逗号。通过 Cypher 修改服务器标签时,编码采用 UTF-8。
|
如果未设置任何选项,服务器可以以任何模式托管任何数据库。服务器还可以在启用时通过其 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.conf 和 ENABLE SERVER
命令之间提供了冲突的选项,则使用提供给 ENABLE SERVER
的选项。
服务器标签的输入是逗号分隔的列表,不能有重复项。 Neo4j .conf 文件默认使用 Latin1 进行编码。因此,对于需要更大字符集(例如中文或阿拉伯语)的服务器标签,建议使用 Cypher 来修改服务器标签。 通过设置环境变量 |
在添加的服务器上托管数据库
一旦启用,服务器不会自动托管数据库,除非
-
创建新数据库。
-
现有数据库拓扑已更改以请求更多主机。
-
另一个服务器转换为正在解除分配状态。
-
您明确地在集群中重新平衡数据库。
命令 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" |
+------------------------------------------------------------------------------------------------------------------------------------------+
在以下情况下,目前会阻止解除分配。
|
一旦命令执行,服务器状态将变为 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 |
|
数据库只能以约束指定的模式托管在服务器上。 |
allowedDatabases |
数据库名称列表,例如 |
只有与指定名称匹配的数据库才能托管在服务器上。此选项不能与 |
deniedDatabases |
数据库名称列表,例如 |
只有不与指定名称匹配的数据库才能托管在服务器上。此选项不能与 |
tags |
服务器标签列表,例如 |
在数据库分配以及负载均衡和路由策略中使用的服务器标签列表。 |
|
与 DEALLOCATE DATABASES FROM SERVER …
命令一样,如果修改服务器选项导致集群无法满足一个或多个数据库的拓扑结构,则该命令将失败,并且不会进行任何更改。
提供给 |
错误处理
有时,集群中的服务器可能会遇到网络分区或进程崩溃等问题。观察这些服务器故障的最简单方法是执行 SHOW SERVERS
并检查 health
列中的 'Unavailable'
状态。
|
如果 Unavailable
服务器的问题被证明是永久性的,则应移除该服务器。然而,如果问题是暂时的,那么完全移除这些服务器可能并不理想,因为这会导致所有托管的数据库被移动。相反,最好是阻止这些服务器被分配任何新的数据库来托管,无论是由于创建或移动数据库而导致的分配。
这被称为对相关服务器进行受限,可以通过对 system
数据库执行以下过程来实现
neo4j@neo4j> CALL dbms.cluster.cordonServer('25a7efc7-d063-44b8-bdee-f23357f89f01');
然后 SHOW SERVERS
应该反映相关服务器现在处于受限状态。
一旦服务器问题得到解决,服务器可以通过以下方式恢复到之前的已启用状态
neo4j@neo4j> ENABLE SERVER '25a7efc7-d063-44b8-bdee-f23357f89f01';
未受限的不可用服务器仍可能被分配来托管新数据库。当服务器恢复时,它会发现自己需要托管这些数据库,并开始从其他可用服务器(如果存在)追赶。然而,在此期间,这些数据库的容错能力会降低,甚至可用性也会降低。有关更多详细信息,请参见灾难恢复。 |