监控集群端点以获取状态信息企业版
集群提供了一些 HTTP 端点,可用于监控集群的健康状况。本节介绍了这些端点并解释了它们的语义。
调整集群端点的安全设置
如果在 Neo4j 中启用了身份验证和授权,集群状态端点也需要身份验证凭据。设置 dbms.security.auth_enabled 控制是否启用原生身份验证提供程序。对于某些负载均衡器和代理服务器,在请求中提供身份验证凭据并非可行选项。对于这些情况,请考虑通过在 neo4j.conf 中设置 dbms.security.cluster_status_auth_enabled=false 来禁用集群状态端点的身份验证。
统一端点
主服务器和从服务器上都存在一组统一的端点,其行为如下:
-
/db/<databasename>/cluster/writable— 用于将写流量定向到特定实例。 -
/db/<databasename>/cluster/read-only— 用于将读流量定向到特定实例。 -
/db/<databasename>/cluster/available— 可用于将任意类型的请求定向到可处理读事务的实例的通用情况。 -
/db/<databasename>/cluster/status— 提供该实例在给定数据库的集群内状态的详细描述。 -
/dbms/cluster/status— 提供该实例在所有数据库的集群内状态的详细描述。这对于监控和协调滚动升级非常有用。详细信息请参阅 状态端点。
每个 /db/<databasename>/* 端点都针对特定的数据库。databaseName 路径参数代表数据库的名称。默认情况下,一个包含 system 和 neo4j 两个数据库的新 Neo4j 安装具有以下集群端点:
https://:7474/dbms/cluster/status
https://:7474/db/system/cluster/writable
https://:7474/db/system/cluster/read-only
https://:7474/db/system/cluster/available
https://:7474/db/system/cluster/status
https://:7474/db/neo4j/cluster/writable
https://:7474/db/neo4j/cluster/read-only
https://:7474/db/neo4j/cluster/available
https://:7474/db/neo4j/cluster/status
|
尝试访问服务器上未托管的数据库的端点会产生 |
| 端点 | 实例状态 | 返回代码 | 正文内容 |
|---|---|---|---|
|
主节点 (Leader) |
|
|
从节点 (Follower) |
|
|
|
辅助节点 (Secondary) |
|
|
|
|
主节点 (Leader) |
|
|
从节点 (Follower) |
|
|
|
辅助节点 (Secondary) |
|
|
|
|
主节点 (Leader) |
|
|
从节点 (Follower) |
|
|
|
辅助节点 (Secondary) |
|
|
|
|
主节点 (Leader) |
|
JSON - 详见 状态端点。 |
从节点 (Follower) |
|
JSON - 详见 状态端点。 |
|
辅助节点 (Secondary) |
|
JSON - 详见 状态端点。 |
|
|
主节点 (Leader) |
|
JSON - 详见 状态端点。 |
从节点 (Follower) |
|
JSON - 详见 状态端点。 |
|
辅助节点 (Secondary) |
|
JSON - 详见 状态端点。 |
在命令行中,请求这些端点的一种常用方法是使用 curl。如果不带参数,curl 会对提供的 URI 执行 HTTP GET 请求,并输出正文(如果有)。如果需要响应代码,只需添加 -v 标志以获取详细输出。以下是一些示例:
-
请求当前被选举为主节点的主数据库分配上的
writable端点,并显示详细输出
#> curl -v localhost:7474/db/neo4j/cluster/writable
* About to connect() to localhost port 7474 (#0)
* Trying ::1...
* connected
* Connected to localhost (::1) port 7474 (#0)
> GET /db/neo4j/cluster/writable HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: localhost:7474
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Access-Control-Allow-Origin: *
< Transfer-Encoding: chunked
< Server: Jetty(9.4.17)
<
* Connection #0 to host localhost left intact
true* Closing connection #0
状态端点
状态端点位于 /db/<databasename>/cluster/status,用于协助滚动升级。更多信息,请参阅 升级和迁移指南 → 集群。
通常,在将主节点从集群中移除之前,需要确保它对于每个数据库都是可以安全关闭的。反直觉的是,主节点可以安全关闭意味着其他大多数主节点是健康的、已追上进度的,并且最近收到了来自该数据库主节点的消息。状态端点提供以下信息以帮助解决此类问题。
|
状态端点响应中的几个字段涉及 Raft 的详细信息,这是 Neo4j 集群用于提供高可用性事务的算法。在 Neo4j 集群中,每个数据库都有其独立的 Raft 组。因此,诸如 |
{
"lastAppliedRaftIndex":0,
"votingMembers":["30edc1c4-519c-4030-8348-7cb7af44f591","80a7fb7b-c966-4ee7-88a9-35db8b4d68fe","f9301218-1fd4-4938-b9bb-a03453e1f779"],
"memberId":"80a7fb7b-c966-4ee7-88a9-35db8b4d68fe",
"leader":"30edc1c4-519c-4030-8348-7cb7af44f591",
"millisSinceLastLeaderMessage":84545,
"participatingInRaftGroup":true,
"core":true,
"isHealthy":true,
"raftCommandsPerSecond":124
}
| 字段 | 类型 | 可选 | 示例 | 描述 | ||
|---|---|---|---|---|---|---|
|
boolean |
否 |
|
用于区分服务器是以主模式(core)还是辅助模式托管数据库。 |
||
|
数量 (number) |
否 |
|
集群中的每个事务都与一个 Raft 索引相关联。 |
||
|
boolean |
否 |
|
参与成员可以投票。当主节点是投票成员资格的一部分并跟踪了主节点时,即被视为参与其中。 |
||
|
string[] |
否 |
|
当主节点一直在接收该成员的通信时,该成员被视为投票成员。 |
||
|
boolean |
否 |
|
指示此集群成员上的本地数据库未遇到可能阻塞数据库操作的关键错误。
|
||
|
string |
否 |
|
集群中的每个成员都有其唯一的成员 ID 来标识它。使用 |
||
|
string |
是 |
|
格式与 |
||
|
数量 (number) |
是 |
|
自上次类似心跳的主节点消息以来的毫秒数。与从服务器无关,因此未包含。 |
||
|
数量 (number) |
是 |
|
通过 |
实例启动后,可以访问状态端点以确保满足下表中列出的所有保证。
为了获得集群最准确的视图,强烈建议访问所有主成员上的状态端点并比较结果。下表解释了如何比较结果。
| 检查名称 | 计算方法 | 描述 |
|---|---|---|
|
每个主节点的状态端点指示 |
确保整个集群的数据是健康的。只要有任何主节点为 false,就表示存在更大的问题。 |
|
对于任意 2 个主节点 (A 和 B),状态端点 A 的 |
当投票开始时,所有主节点彼此相等,并且所有成员在成员资格上达成一致。 |
|
对于所有主节点 (S),不包括要关闭的主节点 Z,S 中的每个成员在其投票集中都包含 S。成员资格通过使用状态端点中的 |
有时网络状况并不理想,关闭最初计划之外的另一个主节点可能更合理。如果对所有主节点运行此检查,则可以关闭符合此条件的那些主节点(前提是同时也满足其他条件)。 |
|
对于任意 2 个主节点 (A 和 B), |
如果主节点不同,则可能存在分区(或者,这也可能是由于时序问题)。如果主节点未知,则意味着主节点消息已超时。 |
|
对于 |
如果主节点之间的应用索引存在较大差异,则关闭主节点可能存在危险。 |
|
|
组合状态端点
当使用状态端点支持滚动升级时,需要评估对于所有数据库是否可以安全关闭主节点。为了避免向每个 /db/<databasename>/cluster/status 端点发送单独的请求,请改用 /dbms/cluster/status。
此端点返回一个 JSON 数组,其元素包含与 单数据库版本 相同的字段,以及用于 databaseName 和 databaseUuid 的字段。
[
{
"databaseName": "neo4j",
"databaseUuid": "f4dacc01-f88a-4512-b3bf-68f7539c941e",
"databaseStatus": {
"lastAppliedRaftIndex": -1,
"votingMembers": [
"0cff51ad-7cee-44cc-9102-538fc4544b95",
"90ff5df1-f5f8-4b4c-8289-a0e3deb2235c",
"99ca7cd0-6072-4387-bd41-7566a98c6afc"
],
"memberId": "90ff5df1-f5f8-4b4c-8289-a0e3deb2235c",
"leader": "90ff5df1-f5f8-4b4c-8289-a0e3deb2235c",
"millisSinceLastLeaderMessage": 0,
"raftCommandsPerSecond": 0.0,
"core": true,
"participatingInRaftGroup": true,
"healthy": true
}
},
{
"databaseName": "system",
"databaseUuid": "00000000-0000-0000-0000-000000000001",
"databaseStatus": {
"lastAppliedRaftIndex": 7,
"votingMembers": [
"0cff51ad-7cee-44cc-9102-538fc4544b95",
"90ff5df1-f5f8-4b4c-8289-a0e3deb2235c",
"99ca7cd0-6072-4387-bd41-7566a98c6afc"
],
"memberId": "90ff5df1-f5f8-4b4c-8289-a0e3deb2235c",
"leader": "90ff5df1-f5f8-4b4c-8289-a0e3deb2235c",
"millisSinceLastLeaderMessage": 0,
"raftCommandsPerSecond": 0.0,
"core": true,
"participatingInRaftGroup": true,
"healthy": true
}
}
]