管理集群中的服务器
如前所述,在集群环境中,服务器管理与数据库管理完全独立。本节介绍如何在集群中操作服务器:添加和删除服务器,以及更改其元数据。
服务器状态
服务器可以在 DBMS 中存在于五种不同的状态
-
空闲
-
已启用
-
正在释放
-
已释放 在 5.15 中引入
-
已隔离
-
已删除
空闲状态
当服务器被发现服务发现(有关更多信息,请参阅 集群服务器发现)时,它将在 *空闲* 状态下创建。处于此状态的服务器具有唯一的自动生成的 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 中引入 |
启用服务器时,如果未提供任何 |
启用后,服务器可能会被分配数据库来托管。
释放状态
当不再需要服务器时,只要它仍然分配给托管任何数据库,就无法从集群中将其删除。DEALLOCATE DATABASE[S] FROM SERVER[S] server[,…]
命令用于将服务器过渡到释放状态,并将所有托管的数据库重新分配到集群中的其他服务器。此外,正在释放的服务器将不会再分配任何数据库。
已释放状态
当服务器处于释放状态时,它不再托管除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 更改服务器标签。 从 Neo4j 5.8.0 开始,.conf文件可以通过设置环境变量 |
在添加的服务器上托管数据库
启用后,服务器不会自动托管数据库,除非
-
创建新的数据库。
-
现有数据库拓扑被更改为请求更多主机。
-
另一个服务器过渡到释放状态。
-
显式地重新平衡集群中的数据库。
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" |
+------------------------------------------------------------------------------------------------------------------------------------------+
在以下情况下,当前阻止释放。
|
执行该命令后,服务器的状态将更改为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 中引入 |
|
与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';
未隔离的不可用服务器仍然可能被分配来托管新数据库。当服务器恢复时,它会观察到它应该托管这些数据库,并从其他可用服务器(如果存在)开始追赶。但是,在此期间,这些数据库的容错性降低了,或者更糟的是,可用性降低了。有关详细信息,请参阅灾难恢复。 |