ElasticSearch API查看集群状态
[toc]
# Elasticsearch 集群健康状态
GET /_cluster/health
是 Elasticsearch 集群健康状态的查询 API。这个 API 提供了关于集群健康、节点、分片和索引的概览。执行这个命令,你将得到集群的健康状态,包括其总体状态、数据节点数量、活跃分片数量等关键信息。
命令参数
这个命令可以接受一些参数来定制返回的信息,常见的参数包括:
level
: 定义返回信息的详细程度,可以是cluster
(默认,返回集群级别的信息)、indices
(返回索引级别的信息)、shards
(返回分片级别的信息)。shards包含indices/cluster。wait_for_status
: 指定等待集群达到特定状态(如green
、yellow
或red
)后才返回结果。wait_for_no_relocating_shards
: 等待所有分片迁移完成后才返回结果。wait_for_active_shards
: 等待指定数量的活跃分片后返回结果。wait_for_nodes
: 等待指定数量的节点加入集群后返回结果。timeout
: 指定等待的时长,默认为 30 秒。
返回结果
{
"cluster_name" : "dev-cluster",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 139,
"active_shards" : 222,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 10,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 95.6896551724138
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
返回结果说明
执行 GET /_cluster/health
命令后,返回的结果是一个 JSON 对象,包含以下字段:
status
: 集群的整体状态,可以是green
、yellow
或red
。green
表示所有功能正常。yellow
表示所有数据可用,但某些副本尚未分配。red
表示某些数据因某种原因不可用。
timed_out
: 查询是否超时。number_of_nodes
: 集群中的节点数量。number_of_data_nodes
: 集群中的数据节点数量。active_primary_shards
: 活跃的主分片数量。active_shards
: 活跃的分片总数(包括副本)。relocating_shards
: 正在迁移的分片数量。initializing_shards
: 正在初始化的分片数量。unassigned_shards
: 未分配的分片数量。delayed_unassigned_shards
: 由于某些原因(如分配规则)而延迟分配的分片数量。number_of_pending_tasks
: 等待执行的任务数量。number_of_in_flight_fetch
: 正在进行的取数据操作数量。task_max_waiting_in_queue_millis
: 任务在队列中等待的最长时间(毫秒)。active_shards_percent_as_number
: 活跃分片占总分片的比例(以数值形式表示)。 这些信息可以帮助你快速了解集群的当前状态和潜在问题。
# 查看未分配分片和原因
# 查看所有分片状态 GET /_cat/shards
- 使用
GET /_cat/shards
查看所有分片的状态,找到UNASSIGNED
状态的分片。
# 查看具体分片未分配详细原因 GET /_cluster/allocation/explain
使用 GET /_cluster/allocation/explain
获取关于分片未分配原因的详细解释。
参数
- index: 指定要解释的索引名称。取值范围:合法的索引名称。
- shard: 指定要解释的分片编号。取值范围:整型,合法的分片编号。
- primary: 指定是否解释主分片(
true
)或副本分片(false
)。取值范围:布尔值。 - include_yes_decisions: 即使分片已经被分配,也返回解释。默认为
false
。取值范围:布尔值。
返回结果
{
"index" : "test-20231110-2",
"shard" : 0,
"primary" : false,
"current_state" : "unassigned",
"unassigned_info" : {
"reason" : "NODE_LEFT",
"at" : "2024-03-16T21:02:35.220Z",
"details" : "node_left [Hw6awNn-RCOgA921YGAviw]",
"last_allocation_status" : "no_attempt"
},
"can_allocate" : "no",
"allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",
"node_allocation_decisions" : [
{
"node_id" : "Hw6awNn-RCOgA921YGAviw",
"node_name" : "node-3",
"transport_address" : "172.16.24.200:9300",
"node_attributes" : {
"ml.machine_memory" : "67381817344",
"ml.max_open_jobs" : "512",
"xpack.installed" : "true",
"ml.max_jvm_size" : "8389328896",
"transform.node" : "true"
},
"node_decision" : "no",
"deciders" : [
{
"decider" : "same_shard",
"decision" : "NO",
"explanation" : "a copy of this shard is already allocated to this node [[test-20231110-2][0], node[Hw6awNn-RCOgA921YGAviw], [R], s[STARTED], a[id=Q2QMaVd4TlSoh7NWkI7uNA]]"
},
{
"decider" : "disk_threshold",
"decision" : "NO",
"explanation" : "the node is above the low watermark cluster setting [cluster.routing.allocation.disk.watermark.low=85%], using more disk space than the maximum allowed [85.0%], actual free: [12.00695361391614%]"
}
]
},
{
"node_id" : "OJJMpbG6Qta6ch5Prcpidw",
"node_name" : "node-2",
"transport_address" : "172.16.24.201:9300",
"node_attributes" : {
"ml.machine_memory" : "67381817344",
"ml.max_open_jobs" : "512",
"xpack.installed" : "true",
"ml.max_jvm_size" : "8389328896",
"transform.node" : "true"
},
"node_decision" : "no",
"deciders" : [
{
"decider" : "same_shard",
"decision" : "NO",
"explanation" : "a copy of this shard is already allocated to this node [[test-20231110-2][0], node[OJJMpbG6Qta6ch5Prcpidw], [R], s[STARTED], a[id=l4jEGwz1SDOFMJ7lzo0CYQ]]"
}
]
},
{
"node_id" : "bJxIbe1TR22rEQC5hqhIYQ",
"node_name" : "node-1",
"transport_address" : "172.16.24.199:9300",
"node_attributes" : {
"ml.machine_memory" : "67381817344",
"ml.max_open_jobs" : "512",
"xpack.installed" : "true",
"ml.max_jvm_size" : "8389328896",
"transform.node" : "true"
},
"node_decision" : "no",
"deciders" : [
{
"decider" : "same_shard",
"decision" : "NO",
"explanation" : "a copy of this shard is already allocated to this node [[test-20231110-2][0], node[bJxIbe1TR22rEQC5hqhIYQ], [P], s[STARTED], a[id=vEFW9hwTS2GWuYHnoyt-rw]]"
}
]
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
返回结果说明
index: 解释的索引名称。取值范围:合法的索引名称。
shard: 解释的分片编号。取值范围:整型,合法的分片编号。
primary: 指示这是否是主分片。取值范围:布尔值。
current_state: 分片的当前状态。取值范围:字符串,例如 “unassigned”。
unassigned_info: 分片未分配的原因信息。取值范围:对象,包含未分配的具体原因、发生时间戳、最后分配尝试状态等。
- reason: 未分配的具体原因。取值范围:字符串,例如 “NODE_LEFT”。
- at: 未分配发生的时间戳。取值范围:日期时间字符串。
- details: 详细信息,例如 “node_left [Hw6awNn-RCOgA921YGAviw]”。取值范围:字符串。
- last_allocation_status: 最后一次分配尝试的状态。取值范围:字符串,例如 “no_attempt”。
can_allocate: 指示分片是否可以被分配。取值范围:字符串,例如 “no”。
allocate_explanation: 分片分配的解释。取值范围:字符串,描述分片分配的可行性。
node_allocation_decisions: 包含每个节点的决策列表。取值范围:数组,包含多个对象,每个对象代表一个节点的决策。
node_id: 节点的唯一标识符。取值范围:字符串。
node_name: 节点的名称。取值范围:字符串。
transport_address: 节点的传输地址。取值范围:字符串。
node_attributes: 节点的属性列表。取值范围:对象,包含多个键值对。
node_decision: 节点是否可以分配分片。取值范围:字符串,例如 “no”。
deciders
: 决策者列表。取值范围:数组,包含多个对象,每个对象代表一个决策者及其决策结果。
- decider: 决策者的名称。取值范围:字符串。
- decision: 决策的结果。取值范围:字符串,例如 “NO”。
- explanation: 决策的解释。取值范围:字符串,描述为什么决策不允许分配。
# 查看节点信息
GET /_nodes/stats
和 GET /_cat/nodes
是 Elasticsearch 中用于获取节点信息的两个不同 API。
- GET /_nodes/stats:
- 返回集群中一个或多个节点的统计信息。
- 提供关于节点的详细运行状况,包括内存使用、CPU 利用率、磁盘空间、索引状态等。
- 可以通过指定不同的路径参数和查询参数来自定义返回的信息,例如选择特定的指标或节点 ID。
- 响应体包含关于选定节点的详细统计信息,包括节点 ID、名称、传输地址、主机、IP 地址、角色、属性、索引统计等。
- GET /_cat/nodes:
- 返回集群中所有节点的信息。
- 设计用于人类交互,如命令行或 Kibana 控制台。
- 可以通过
h
参数指定要显示的列。 - 返回的信息包括节点 IP 地址、堆大小、内存使用情况、文件描述符使用情况、节点角色、主节点状态、节点名称、节点 ID、进程 ID、端口、HTTP 地址、版本、构建哈希、Java 版本等。 主要区别在于:
GET /_nodes/stats
提供详细的统计信息,适合自动化和应用程序使用。GET /_cat/nodes
提供简洁的文本输出,适合人类阅读和交互。GET /_nodes/stats
支持更复杂的查询参数和路径参数,可以自定义返回的信息。GET /_cat/nodes
通过h
参数提供有限的列选择,更适合快速查看节点概览。
# 查看节点信息 _cat/nodes
GET /_cat/nodes?v
是 Elasticsearch 中的一个命令,用于返回集群节点的信息。这个命令是专门为人类使用而设计的,通过命令行或 Kibana 控制台进行交互。它不适用于应用程序使用,而是建议使用 JSON API 来进行应用程序交互。
使用样例
GET /_cat/nodes?h=pid,ip,cpu,heap.max,ram.percent,load_1m,load_5m,load_15m&v
结果
pid ip cpu heap.max ram.percent load_1m load_5m load_15m
32624 172.16.24.200 5 7.8gb 74 1.14 1.03 1.08
26851 172.16.24.201 12 7.8gb 97 2.68 3.17 3.07
32113 172.16.24.199 7 7.8gb 99 1.41 1.70 2.00
2
3
4
该命令的请求参数包括:
- bytes: (可选) 用于显示字节值的字节大小单位。
- format: (可选) 指定响应返回的数据格式,如 JSON、YAML 等。
- full_id: (可选) 如果设置为
true
,则返回完整的节点 ID;如果设置为false
,则返回缩写的节点 ID。默认为false
。 - h: (可选) 逗号分隔的列名称列表,用于指定要显示的列。如果不指定列,API 将返回默认列,按照下面的顺序列出。如果明确指定一个或多个列,则只返回指定的列。
有效的列包括:
ip
: 节点 IP 地址。heap.percent
: 最大配置堆的百分比。heap.max
: 总堆大小。ram.percent
: 使用的总内存百分比。file_desc.percent
: 使用的文件描述符百分比。node.role
: 节点的角色。master
: 指示节点是否为选举出的主节点。name
: 节点名称。id
: 节点 ID。pid
: 进程 ID。port
: 绑定的传输端口。http_address
: 绑定的 HTTP 地址。version
: Elasticsearch 版本。build
: Elasticsearch 构建哈希。jdk
: Java 版本。disk.total
: 总磁盘空间。disk.used
: 已使用的磁盘空间。disk.avail
: 可用磁盘空间。disk.used_percent
: 已使用磁盘空间的百分比。heap.current
: 已使用的堆大小。ram.current
: 使用的总内存。ram.max
: 总内存。file_desc.current
: 使用的文件描述符数量。file_desc.max
: 最大文件描述符数量。cpu
: 最近系统 CPU 使用百分比。load_1m
: 最近一分钟的平均负载。load_5m
: 过去五分钟的平均负载。load_15m
: 过去十五分钟的平均负载。uptime
: 节点运行时间。completion.size
: 完成大小。dense_vector.value_count
: 索引的密集向量数量。fielddata.memory_size
: 使用的字段数据缓存内存。fielddata.evictions
: 字段数据缓存驱逐次数。query_cache.memory_size
: 使用的查询缓存内存。query_cache.evictions
: 查询缓存驱逐次数。query_cache.hit_count
: 查询缓存命中次数。query_cache.miss_count
: 查询缓存未命中次数。request_cache.memory_size
: 使用的请求缓存内存。request_cache.evictions
: 请求缓存驱逐次数。request_cache.hit_count
: 请求缓存命中次数。request_cache.miss_count
: 请求缓存未命中次数。flush.total
: 刷新次数。flush.total_time
: 花费在刷新上的时间。get.current
: 当前的获取操作次数。get.time
: 花费在获取上的时间。get.total
: 获取操作的总次数。get.exists_time
: 成功获取操作花费的时间。get.exists_total
: 成功的获取操作总次数。get.missing_time
: 失败获取操作花费的时间。get.missing_total
: 失败的获取操作总次数。
# 查看节点详细信息 _nodes/stats
GET /_nodes/stats
是 Elasticsearch 中的一个 API,用于获取集群中一个或多个节点的统计信息。这个 API 提供了关于节点的详细运行状况,包括内存使用、CPU 利用率、磁盘空间、索引状态等。
请求方式
GET /_nodes/stats
: 获取集群中所有节点的统计信息。GET /_nodes/<node_id>/stats
: 获取指定节点 ID 的节点的统计信息。GET /_nodes/stats/<metric>
: 获取指定指标的统计信息。GET /_nodes/<node_id>/stats/<metric>
: 获取指定节点 ID 和指标的统计信息。GET /_nodes/stats/<metric>/<index_metric>
: 获取指定指标和索引指标的统计信息。
路径参数
<metric>
: (可选, string) 限制返回的信息到特定的指标。例如adaptive_selection
,breaker
,discovery
,fs
,http
,indexing_pressure
,indices
,ingest
,jvm
,os
,process
,repositories
,thread_pool
,transport
等。<index_metric>
: (可选, string) 当指定indices
或all
指标时,可以进一步限制为特定索引指标。例如bulk
,completion
,docs
,fielddata
,flush
,get
,indexing
,mappings
,merge
,query_cache
,recovery
,refresh
,request_cache
,search
,segments
,shard_stats
,store
,translog
,warmer
,dense_vector
等。<node_id>
: (可选, string) 逗号分隔的节点 ID 或名称列表,用于限制返回的信息。
查询参数
completion_fields
,fielddata_fields
,fields
: (可选) 指定要包括在统计中的字段。groups
: (可选) 指定要包括在search
统计中的搜索组。level
: (可选) 指示统计是在集群、索引还是分片级别聚合。types
: (可选) 指定indexing
索引指标的文档类型。master_timeout
,timeout
: (可选) 指定等待主节点响应或等待响应的时间。include_segment_file_sizes
,include_unloaded_segments
: (可选) 控制是否包含段文件大小信息或未加载段的信息。
返回结果说明
_nodes
: 包含根据请求选择的节点统计信息的对象。total
: 请求中选择的节点总数。successful
: 成功响应请求的节点数量。failed
: 拒绝请求或未能响应的节点数量。cluster_name
: 集群名称。nodes
: 包含选定节点的统计信息的对象。<node_id>
: 包含节点统计信息的对象。timestamp
: 收集节点统计信息的时间戳。name
: 节点的人可读标识符。transport_address
: 节点的传输地址。host
: 节点的网络主机。ip
: 节点的 IP 地址。roles
: 分配给节点的角色数组。attributes
: 包含节点属性的对象。indices
: 包含分配给节点的索引统计信息的对象。docs
: 包含分配给节点的所有主分片上的文档统计信息的对象。store
: 包含分配给节点的分片大小统计信息的对象。 通过使用不同的参数,你可以自定义输出,以显示你感兴趣的节点统计信息。 参考资料: