Elasticsearch 集群管理与性能监控全解析
1. 响应结构与统计信息
在 Elasticsearch 中,对某些命令的响应可能包含大量信息。当响应行数超过 500 时,我们通常只关注其结构。响应中除了状态和时间信息外,主要包含三个对象:
primaries
、
total
和
indices
。
-
indices
:包含库和映射索引的信息。
-
primaries
:包含当前节点上分配的主分片信息。
-
total
:包含所有分片(包括副本)的信息。
这些对象中又包含描述特定统计信息的子对象,如
docs
、
store
、
indexing
、
get
、
search
等。下面详细介绍这些统计信息:
-
Docs
:显示索引文档的信息,例如:
"docs" : {
"count" : 4,
"deleted" : 0
}
count
表示文档数量,当删除文档时,Elasticsearch 不会立即物理删除,而是标记为删除,在段合并时才真正删除,
deleted
表示标记为删除的文档数量。
-
Store
:提供存储相关信息,例如:
"store" : {
"size_in_bytes" : 6003,
"throttle_time_in_millis" : 0
}
主要信息是索引大小,还可查看限流统计,在系统 I/O 性能有问题且对段合并操作有限制时有用。
-
Indexing、get 和 search
:提供数据操作信息,示例如下:
"indexing" : {
"index_total" : 11501,
"index_time_in_millis" : 4574,
"index_current" : 0,
"delete_total" : 0,
"delete_time_in_millis" : 0,
"delete_current" : 0
},
"get" : {
"total" : 3,
"time_in_millis" : 0,
"exists_total" : 2,
"exists_time_in_millis" : 0,
"missing_total" : 1,
"missing_time_in_millis" : 0,
"current" : 0
},
"search" : {
"query_total" : 0,
"query_time_in_millis" : 0,
"query_current" : 0,
"fetch_total" : 0,
"fetch_time_in_millis" : 0,
"fetch_current" : 0
}
这些统计信息结构相似,可读取各种请求类型的总时间和请求数量,从而计算单个查询的平均时间。对于实时
get
请求,
missing_total
表示未找到文档的数量。
此外,Elasticsearch 还提供以下信息:
-
merges
:Lucene 段合并信息。
-
refresh
:刷新操作信息。
-
flush
:刷新信息。
-
warmer
:预热器信息及执行时间。
-
filter_cache
:过滤器缓存统计。
-
id_cache
:标识符缓存统计。
-
fielddata
:字段数据缓存统计。
-
percolate
:过滤器使用信息。
-
completion
:自动完成建议器信息。
-
segments
:Lucene 段信息。
-
translog
:事务日志数量和大小信息。
2. 各类 API 介绍
Elasticsearch 提供了多种 API 用于获取集群和索引的信息,下面详细介绍这些 API:
-
状态 API(Status API)
:通过
_status
端点获取索引信息,返回的信息包括可用分片、主分片信息、分片分配节点、分片状态、事务日志和合并过程信息以及刷新和刷新统计。
-
节点信息 API(Nodes Info API)
:通过向
_nodes
REST 端点发送请求获取集群节点信息。可根据以下方面获取特定节点信息:
- 节点名称:如
_nodes/Pulse
。
- 节点标识符:如
_nodes/ny4hftjNQtuKMyEvpUdQWg
。
- IP 地址:如
_nodes/192.168.1.103
。
- Elasticsearch 配置参数:如
/_nodes/rack:2
。
还可通过模式(如
_nodes/192.168.1.*
)、节点枚举(如
_nodes/Pulse,Slab
)或两者结合(如
/ _nodes/P*,S*
)获取多个节点信息。默认返回节点基本信息,添加以下参数可获取更多信息:
-
settings
:Elasticsearch 配置信息。
-
os
:服务器信息,如处理器、内存和交换空间。
-
process
:进程标识符和可用文件描述符。
-
jvm
:Java 虚拟机信息,如内存限制。
-
thread_pool
:线程池配置。
-
network
:网络接口名称和地址。
-
transport
:传输模块监听地址。
-
http
:HTTP 监听地址。
-
plugins
:已安装插件信息。
示例命令:
curl 'localhost:9200/_nodes/Pulse/os,jvm,plugins?pretty'
该命令将返回节点
Pulse
的操作系统、Java 虚拟机和插件信息。
-
节点统计 API(Nodes Stats API)
:与节点信息 API 类似,但主要提供集群工作过程中的统计信息。向
/ _nodes/statsREST 端点发送请求使用该 API,也可获取特定节点信息(如_nodes/Pulse/stats)。默认返回所有可用统计信息,可通过以下选项限制:-
indices:索引信息,包括大小、文档数量、索引统计、搜索和获取时间、缓存、段合并等。 -
os:操作系统信息,如可用磁盘空间、内存和交换使用情况。 -
process:Elasticsearch 进程的内存、CPU 和文件处理使用情况。 -
jvm:Java 虚拟机内存和垃圾回收统计。 -
network:TCP 级信息。 -
transport:传输模块发送和接收的数据信息。 -
http:HTTP 连接信息。 -
fs:可用磁盘空间和 I/O 操作统计。 -
thread_pool:线程状态信息。 -
breaker:字段数据缓存断路器信息。
-
示例命令:
curl 'localhost:9200/_nodes/Pulse/stats/os,jvm,breaker?pretty'
该命令将返回节点
Pulse
的操作系统、Java 虚拟机和字段数据缓存断路器统计信息。
-
集群状态 API(Cluster State API)
:通过该 API 可获取整个集群的信息,添加
local=true参数可限制为本地节点信息。基本命令如下:
curl 'localhost:9200/_cluster/state?pretty'
还可通过指定指标和索引来限制返回信息,示例如下:
curl 'localhost:9200/_cluster/state/nodes/map,library?pretty'
可用指标包括:
-
version
:集群状态版本信息。
-
master_node
:选举出的主节点信息。
-
nodes
:节点信息。
-
routing_table
:路由相关信息。
-
metadata
:元数据信息,指定
index_templates=true
可包含索引模板。
-
blocks
:响应中的块信息。
-
待处理任务 API(Pending Tasks API)
:通过向
/ _cluster/pending_tasksREST 端点发送请求,可查看等待执行的任务,响应中包含任务优先级和队列时间等信息。 -
索引段 API(Indices Segments API)
:通过
/ _segments端点获取分片、分片位置以及 Lucene 库管理的物理索引段信息,可用于整个集群或单个索引。 -
Cat API
:Elasticsearch 提供的更友好的 API,响应为 JSON 格式,方便人类查看。向
_catREST 端点发送请求,后跟以下选项之一:-
aliases:别名信息。 -
allocation:分片分配和磁盘使用信息。 -
count:文档数量信息。 -
health:集群健康信息。 -
indices:索引信息。 -
master:主节点信息。 -
nodes:集群拓扑信息。 -
pending_tasks:待处理任务信息。 -
recovery:恢复过程信息。 -
thread_pool:线程池统计信息。 -
shards:分片信息。
-
示例命令:
curl -XGET 'localhost:9200/_cat/shards?v'
v
参数表示更详细的信息,还可使用
help
参数获取命令头描述,
h
参数指定响应中包含的列。响应示例如下:
index shard prirep state docs store ip node
map 0 p STARTED 4 5.9kb 192.168.1.40 es_node_1
library 0 p STARTED 9 11.8kb 192.168.56.1 es_node_2
部分 Cat API 命令可限制返回信息,总结如下:
| 命令 | 限制方式 |
| ---- | ---- |
|
aliases
| 在请求中追加别名 |
|
count
| 在请求中追加感兴趣的索引名称 |
|
indices
| 同
count
命令 |
|
shards
| 在请求中追加感兴趣的索引名称 |
3. 集群重新平衡控制
默认情况下,Elasticsearch 会尝试在集群中均匀平衡分片及其副本,但在某些情况下,我们需要控制这种行为。
-
重新平衡概念
:重新平衡是在集群不同节点之间移动分片的过程。大多数情况下是有益的,但有时需要避免,如自定义分片放置时。
-
集群就绪状态
:当所有主分片分配到节点(达到黄色健康状态)时,集群即可使用,此时 Elasticsearch 可能仍在初始化副本分片,但不影响搜索和索引操作。
Elasticsearch 提供以下属性控制重新平衡过程:
-
控制重新平衡开始时间
:
cluster.routing.allocation.allow_rebalance
可设置为以下值:
-
always
:需要时立即开始重新平衡。
-
indices_primaries_active
:所有主分片初始化后开始。
-
indices_all_active
:所有分片和副本初始化后开始(默认值)。
-
控制节点间并发移动分片数量
:
cluster.routing.allocation.cluster_concurrent_rebalance
默认为 2,可根据集群节点数量调整。
-
控制单节点并发初始化分片数量
:
cluster.routing.allocation.node_concurrent_recoveries
默认为 2,分片恢复过程 I/O 密集,避免并发恢复过多分片。
-
控制单节点并发初始化主分片数量
:
cluster.routing.allocation.node_initial_primaries_recoveries
可控制节点上并发初始化的主分片数量。
-
控制分片分配类型
:
cluster.routing.allocation.enable
可设置为以下值:
-
all
:允许所有类型分片分配(默认值)。
-
primaries
:仅分配主分片。
-
new_primaries
:仅分配新创建的主分片。
-
none
:禁用分片分配。
-
控制单节点并发流数量
:
indices.recovery.concurrent_streams
默认为 3,可根据网络和节点性能调整。
通过合理使用这些属性,我们可以更好地控制 Elasticsearch 集群的分片和副本分配,提高集群性能和稳定性。
下面是一个简单的 mermaid 流程图,展示集群重新平衡控制的主要流程:
graph LR
A[开始] --> B{是否需要控制重新平衡}
B -- 是 --> C{控制重新平衡开始时间}
C --> D{控制节点间并发移动分片数量}
D --> E{控制单节点并发初始化分片数量}
E --> F{控制单节点并发初始化主分片数量}
F --> G{控制分片分配类型}
G --> H{控制单节点并发流数量}
H --> I[结束]
B -- 否 --> I
通过以上介绍,我们了解了 Elasticsearch 中各种统计信息、API 的使用以及集群重新平衡的控制方法,这些知识有助于我们更好地管理和监控 Elasticsearch 集群。
4. 集群重新平衡控制的实际应用场景
在实际使用 Elasticsearch 集群时,我们会遇到各种需要控制集群重新平衡的场景,以下为你详细介绍:
-
网络流量场景
:
-
高流量网络
:当你的网络能够处理非常高的流量时,你可以适当增加
cluster.routing.allocation.cluster_concurrent_rebalance
的值,让更多的分片在节点间并发移动,加快集群重新平衡的速度。例如,将其从默认的 2 增加到 5,这样可以在短时间内完成更多分片的迁移,使集群更快达到平衡状态。
-
低流量网络
:若网络使用频繁,为避免网络压力过大,你可以减少并发移动的分片数量,甚至将
cluster.routing.allocation.allow_rebalance
设置为
none
暂时禁止重新平衡,待网络压力减小后再恢复。
-
I/O 子系统场景
:在全集群重启后,为减轻 I/O 子系统的压力,你可以降低
cluster.routing.allocation.node_concurrent_recoveries
的值,减少同时初始化的分片数量。比如将其从 2 降低到 1,让分片和副本逐个初始化,避免 I/O 系统过载。
5. 集群管理的最佳实践
为了更好地管理 Elasticsearch 集群,我们可以遵循以下最佳实践:
-
定期监控
:使用上述介绍的各种 API 定期获取集群和节点的信息,监控集群的健康状态、节点性能、索引状态等。例如,每天定时使用节点统计 API 获取节点的资源使用情况,及时发现潜在问题。
-
合理配置重新平衡参数
:根据实际的网络和 I/O 情况,合理设置集群重新平衡的相关参数。在网络稳定、I/O 性能较好时,适当提高并发移动和初始化的分片数量;在网络或 I/O 压力较大时,降低并发数量或禁止重新平衡。
-
备份与恢复
:定期备份索引数据,以防止数据丢失。可以使用 Elasticsearch 的快照和恢复功能,将索引数据备份到远程存储中。在需要时,能够快速恢复数据。
-
集群扩展
:当集群负载增加时,及时添加节点进行扩展。在添加节点后,根据新的集群规模调整重新平衡参数,确保分片和副本均匀分布。
6. 总结
Elasticsearch 提供了丰富的功能和 API 来帮助我们管理和监控集群。通过了解响应结构中的统计信息,我们可以深入了解索引和节点的状态;使用各种 API 可以方便地获取集群和节点的详细信息;合理控制集群重新平衡可以根据实际情况优化集群性能。
在实际应用中,我们要根据网络、I/O 等具体情况,灵活调整相关参数,遵循最佳实践,确保 Elasticsearch 集群的稳定运行和高效性能。
以下是一个简单的 mermaid 流程图,展示了 Elasticsearch 集群管理的整体流程:
graph LR
A[开始] --> B[监控集群状态]
B --> C{是否需要调整?}
C -- 是 --> D[调整重新平衡参数]
D --> E[重新监控]
C -- 否 --> E
E --> F{是否达到预期状态?}
F -- 否 --> D
F -- 是 --> G[结束]
希望通过本文的介绍,你能更好地掌握 Elasticsearch 集群的管理和监控方法,让你的集群在实际应用中发挥出最佳性能。
超级会员免费看
1083

被折叠的 条评论
为什么被折叠?



