ES 生产排查

一、集群情况查看

1.监控集群状态:实时查看ES集群的CPU、I/O、内存使用率,避免出现资源耗尽:

powershell 复制代码
#查看节点状态
curl -s -k -u elastic:Passw0rd http http://<es_host>:<es_port>/_cat/nodes?v&h=name,cpus,load_1m,load_5m,load_15m,diskUsedPercent,memUsedPercent
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_cat/nodes?v&h=name,heap.percent,ram.percent,cpu"
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_cat/nodes?v"
curl -s -u elastic:Passw0rd -XGET 'http://es_host:9200/_nodes/stats/os?pretty'
# 查看集群节点内存使用
curl -u elastic:Passw0rd -XGET 'http://es_host:9200/_cat/nodes?v&h=name,ram.percent,heap.percent,ram.current,heap.current'

输出说明:

name:节点名称

ram.percent:系统内存使用率(ram.percent=100 表示内存耗尽)

heap.percent:JVM 堆内存使用率(建议 < 75%)

ram.current:当前使用的系统内存(如 31.2gb)

heap.current:当前使用的 JVM 堆内存(如 15.8gb)

2.查看系统磁盘使用

powershell 复制代码
curl -s -u elastic:Passw0rd -XGET 'http://es_host:9200/_cat/nodes?v&h=name,disk.used,disk.avail,disk.total,disk.percent'

输出说明:

disk.used:已使用磁盘空间

disk.avail:剩余磁盘空间

disk.total:总磁盘空间

disk.percent:磁盘使用率

3 监控指标:集群健康

powershell 复制代码
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_cluster/health?pretty"
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_cluster/health/group_tag_all_boci?level=indices&pretty"

4 查看当前JVM配置

powershell 复制代码
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_nodes/jvm?pretty"

输出说明:

heap_used_in_bytes:已使用堆内存

heap_max_in_bytes:堆内存总量

heap_used_percent:堆内存使用率

heap_committed_in_bytes:已分配堆内存

  1. 检查索引设置
powershell 复制代码
curl -k -u elastic:Passw0rd -GET es_host:9200/pds_decision_instance/_settings?pretty
  1. 查看分片级写入压力(_cat/shards增强版)
    Hive写入ES时,数据会路由到对应主分片,通过该命令可查看各分片的写入状态、存储变化,判断是否存在分片不均衡。
powershell 复制代码
# 查看所有分片的详细状态(包括文档数、存储、节点)
curl -s -k -u elastic:Passw0rd -XGET http http://es_host:9200/_cat/shards?v&h=index,shard,prirep,state,docs,store,node
# 过滤指定索引的分片
curl -s -k -u elastic:Passw0rd -XGET http http://es_host:9200/_cat/shards/group_tag_all_boci?v&h=index,shard,prirep,state,docs,store,node

关键指标:

shard:分片编号

prirep:p(主分片)/r(副本分片),主分片是写入瓶颈的核心关注点;

docs:每个分片的文档数,若主分片文档数差异过大(如超过20%),可能是路由不均;

store:分片存储大小,若某分片存储突然增长,可能是写入集中。

  1. 监控节点写入性能(_nodes/stats API)

从节点维度查看ES的写入、索引、I/O等性能指标,判断Hive写入是否导致节点负载过高。

powershell 复制代码
# 查看所有节点的写入相关统计
curl -s -k -u elastic:Passw0rd -XGET http http://es_host:9200/_nodes/stats/indices/indexing?pretty
# 查看指定节点的写入统计(替换为节点名)
curl -s -k -u elastic:Passw0rd 'http://es_host:9200/_nodes/group_tag_all_boci/stats/indices/indexing?pretty'

关键指标:

indices.write.index_total:索引操作总次数(对应 Hive 写入的文档数);

indices.write.index_time_in_millis:索引总耗时;

indices.write.index_current:当前正在执行的索引操作数(若持续 >0,说明写入繁忙);

indices.write.flush_total: flush 操作次数(将内存数据写入磁盘,耗时过高可能是 I/O 瓶颈)。

  1. 查看线程池状态
powershell 复制代码
# 查看bulk线程池的队列长度和拒绝次数
curl -s -u elastic:Passw0rd -XGET es_host:9200/_cat/thread_pool?v
# 查看ES的write线程池状态
curl -s -k -u elastic:Passw0rd http://es_host:9200/_cat/thread_pool/write?v 
#若active 列显示大于0,说明仍有写入任务在执行,可通过以下命令查看写入来源:
# 查看ES的慢查询日志(包含写入操作)查看写入来源
curl -s -k -u elastic:Passw0rd http://es_host:9200/_nodes/logging.yml?pretty

9.查看段内存使用 监控段状态:通过观察段数量/大小,若小段(<100MB)增多,及时触发合并。

powershell 复制代码
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_cat/segments?v"
# 查看索引的段文件信息
curl -s -k -u elastic:Passw0rd -XGET http://es_host:9200/_cat/segments/group_tag_all_boci?v
# 检查索引当前段数量
curl -k -u elastic:Passw0rd "http://es_host:9200/_cat/segments/group_tag_all_boci?v&h=segment,size,size.memory"

二、诊断索引

查看索引内存占用

powershell 复制代码
curl -s -k -u elastic:Passw0rd -XGET "http://es_host:9200/_cat/indices?v&s=store.size:desc"
curl -u elastic:Passw0rd -XGET es_host:9200/_cat/indices?v   # 查看所有索引及状态
curl -k -u elastic:Passw0rd "http://es_host:9200/_cat/indices/group_tag_all_boci?v" #检查索引大小和文档数

health status index                                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   group_tag_all_boci                    grN65MDQTrWPBb7pzr9ODw   1   1    6880028      1413755     46.9gb           23gb

集群中索引的关键健康和统计信息

1、health:green

含义:索引的健康状态为绿色。这是最理想的状态。

解读:表示索引的所有主分片(PrimaryShards)和副本分片(ReplicaShards)都处于active状态,集群功能完全正常。

2、status:open

含义:索引当前处于"打开"状态。

解读:这意味着索引可以被正常地读写和搜索。如果状态是closed,则索引无法被访问。

3、index:group_tag_all_boci

含义:这是索引的名称。

4、uuid:grN65MDQTrWPBb7pzr9ODw

含义:索引的唯一标识符(UniversallyUniqueIdentifier)。

解读:每个索引在创建时都会被分配一个唯一的UUID,用于在集群内部准确识别。

5、pri:1

含义:索引的主分片数量(PrimaryShards)。

解读:该索引被分为了1个主分片。主分片是数据的主要存储单元,所有的写入操作都先在主分片上完成,然后再同步到副本分片。

6、rep:1

含义:索引的副本分片数量(ReplicaShards)。

解读:每个主分片都有1个副本。副本分片是主分片的拷贝,主要用于:

高可用性:如果主分片所在的节点宕机,Elasticsearch可以将副本分片提升为新的主分片。

负载均衡:读请求(搜索、查询)可以被分发到主分片和副本分片,以分担压力。

总分片数:对于这个索引,总共有pri*(rep+1)=12=2个分片(1个主分片+1个副本分片)。
7、docs.count:6880028
含义:索引中当前存储的文档总数。
解读:这个索引大约存储了688万条数据。这是一个相当大的数据集。
8、docs.deleted:1413755
含义:索引中被标记为删除的文档数量。
解读:Elasticsearch在执行删除操作时,并不会立即将文档从磁盘上物理删除,而是先将其标记为已删除(tombstone)。这个字段显示了被标记为删除的文档总数。
注意:这些被标记为删除的文档仍然会占用磁盘空间,直到触发段合并(SegmentMerge)操作时,才会被真正物理删除并释放空间。
9、store.size:46.9gb
含义:索引在所有分片中占用的总磁盘空间大小(包括主分片和副本分片)。
解读:这个索引总共占用了约46.9GB的磁盘空间。
10、pri.store.size:23gb
含义:所有主分片占用的磁盘空间大小总和。
解读:这个值通常是store.size的一半(当rep:1时),因为副本分片是主分片的完整拷贝。这里23gb
2=46gb,与store.size基本吻合(存在少量元数据差异)。这也印证了索引的副本配置是1。

1、索引健康且正常运行:health:green和status:open表明索引状态非常好。

2、数据量较大:docs.count:688万和pri.store.size:23GB说明这是一个大型索引。

3、存在大量已删除文档:docs.deleted:~141万这个数字相当高,约占总文档数的20%。这意味着:

磁盘空间浪费:大量空间被无效的"已删除"文档占用。

潜在性能影响:过多的删除标记可能会在查询时带来轻微的性能开销,因为Lucene需要跳过这些被标记的文档。

4、分片配置:pri:1,rep:1的配置对于一个688万文档的索引来说,主分片数量可能过少。

问题:所有的数据都存储在一个主分片中,这意味着:

单点瓶颈:写入和查询压力无法在多个节点间分散,可能导致单个节点负载过高。

无法水平扩展:未来如果数据量继续增长,你无法通过增加节点来分担这个索引的负载,因为它只有一个主分片。

建议:在创建新索引时,根据预期的数据量和集群节点数,规划一个更合理的主分片数量。通常,主分片数量应该大于或等于集群中的数据节点数,以便更好地分布负载。

三、短期优化

强制合并分片,释放删除文档占用的空间(仅在低峰期执行)!!!

1.清理缓存:临时释放段缓存和查询缓存,快速缓解内存压力:

powershell 复制代码
curl -k -u elastic:Passw0rd -XPOST  "http://es_host:9200/_cache/clear?fielddata=true&query_cache=true&request_cache=true"
curl -u elastic:Passw0rd -XPOST 'http://es_host:9200/_cache/clear?pretty'
  1. 彻底清理段文件,释放物理内存
powershell 复制代码
curl -k -u elastic:Passw0rd -XPOST "http://es_host:9200/pds_msg_record_auto_backup/_forcemerge?only_expunge_deletes=true"
only_expunge_deletes=true 只清理已删除文件占用资源少
curl -k -u elastic:Passw0rd -XPOST http://es_host:9200/pds_msg_record_auto_backup/_forcemerge?max_num_segments=10
#将每个分片的段数限制为10,避免段过多占用内存,同时保留一定的查询性能。如果还是太多,再限制为5

3.执行轻量级段合并(仅清理已删除文档和过小的段,资源占用低):

powershell 复制代码
curl -k -u elastic:Passw0rd -XPOST  "http://es_host:9200/group_tag_all_boci/_forcemerge?only_expunge_deletes=true&max_num_segments=5"
only_expunge_deletes=true:仅清理包含已删除文档的段,不强制合并所有段,减少I/O和CPU 消耗;
max_num_segments=5:将每个分片的段数限制为5,避免段过多占用内存,同时保留一定的查询性能。

4.最优方案 慎用

powershell 复制代码
curl -k -u elastic:Passw0rd -XPOST http://es_host:9200/group_tag_all_boci/_forcemerge?max_num_segments=1
手动触发段合并:为了释放被删除文档占用的空间,可以手动触发一次段合并。
说明: _forcemerge会将索引的多个段(Segments)合并为一个(或指定数量的)段,在此过程中会物理删除被标记为删除的文档。
注意: 这个操作是I/O密集型的,会消耗大量磁盘I/O和CPU,建议在业务低峰期执行。

5.查看当前运行的段合并任务

powershell 复制代码
curl -k -u elastic:Passw0rd -XGET "http://es_host:9200/_tasks?actions=*forcemerge&detailed=true&pretty"
# 查看合并任务是否在运行、进度如何
# 查看所有后台任务(重点看"action"为"indices:admin/forcemerge"的任务)
curl -u elastic:Passw0rd "http://es_host:9200/_cat/tasks?v&actions=indices:admin/forcemerge"
# 按运行时长排序(查看最久的任务):
curl -u elastic:Passw0rd "http://es_host:9200/_cat/tasks?v&actions=indices:admin/forcemerge&s=running_time:desc"
# 查看待处理任务
curl -u elastic:Passw0rd -XGET 'http://es_host:9200/_cluster/pending_tasks?pretty'

6.取消任务(替换为实际task_id)

powershell 复制代码
curl -k -u elastic:Passw0rd -XPOST "http://es_host:9200/_tasks/task_id:1234/_cancel?pretty"
curl -k -u elastic:Passw0rd -XPOST "http://es_host:9200/_cache/clear?fielddata=true" 这个命令会清理:
fielddata 缓存(字段值缓存,占用内存较大)
查询缓存(query cache)
请求缓存(request cache)
段缓存(segment cache)

四、监控

1.查看文档写入统计(_stats API)

实时获取索引的文档增减、删除、刷新等统计,直接反映 Hive 写入是否生效。

powershell 复制代码
# 查看指定索引的文档统计(替换为你的索引名)
curl -s -k -u elastic:Passw0rd -XGET http http://es_host:9200/group_tag_all_boci/_stats/docs?pretty
# 查看所有索引的文档统计
curl -s -k -u elastic:Passw0rd -XGET http http://es_host:9200/_all/_stats/docs?pretty
关键指标:
_all.total.docs.count:当前索引总文档数(Hive写入会使该值增长);
_all.total.docs.deleted:被标记删除的文档数(若Hive有删除操作);
对比前后两次count差值,可估算写入速率。

2.监控索引刷新(_refresh状态)

Hive 写入的数据先存内存,需refresh后才可见(默认1秒自动刷新),可查看刷新频率和耗时,判断是否存在内存写入瓶颈。

powershell 复制代码
# 查看索引刷新统计
curl -s -k -u elastic:Passw0rd -XGET http http://es_host:9200/group_tag_all_boci/_stats/refresh?pretty
关键指标:
_all.total.refresh.total_time_in_millis:总刷新耗时;
_all.total.refresh.count:刷新次数;
若单次刷新耗时过高(如>500ms),可能是内存不足或写入速率过快。

五、长期优化

核心优化:关闭客户端主动触发刷新(最直接有效)

外部刷新的主要来源是客户端写入时主动请求刷新(如Hive、Logstash、Java客户端等),需针对性关闭。

1.Hive写入ES(elasticsearch-hadoop连接器)

Hive通过elasticsearch-hadoop插件写入时,默认可能配置了es.refresh=true(主动触发刷新),需修改为false(建表是永久,写在sql是临时):

sql 复制代码
INSERT INTO TABLE es_table
SELECT id, name, tag FROM source_table
TBLPROPERTIES (
  'es.refresh' = 'false',  -- 关闭写入后刷新(核心优化参数)
  'es.batch.size.entries' = '100000',  -- 增大批量写入大小
  'es.batch.write.retry.count' = '3',  -- 重试次数
  'es.batch.write.retry.wait' = '5000'  -- 重试间隔(毫秒)
);

2.长期优化:均衡内存负载

步骤1:检查索引的段文件大小:

powershell 复制代码
# 查看索引的段文件信息
curl -s -k -u elastic:Passw0rd -XGET http://es_host:9200/_cat/segments/group_tag_all_boci?v
若存在大量小尺寸段文件(如<100MB),可执行段合并优化:
curl -s -k -u elastic:Passw0rd -XPOST  http://es_host:9200/group_tag_all_boci/_forcemerge?max_num_segments=1
段合并会减少段文件数量,降低内存缓存压力,但会消耗CPU和I/O,建议在低峰期执行。

3.优化段合并策略(长期配置)

调整索引的合并策略参数,避免再次产生大量小尺寸段:

powershell 复制代码
curl -s -k -u elastic:Passw0rd -XPUT  http://es_host:9200/group_tag_all_boci/_settings  -H "Content-Type: application/json"  -d '{
    "index.merge.policy.min_merge_size": "5mb", --最小合并尺寸,小于此值的段会优先合并
    "index.merge.policy.max_merge_size": "500mb", --最大合并尺寸,避免合并过大段导致性能问题
    "index.merge.policy.merge_factor": 10, --每次合并的段数量,默认10,可根据实际调整
    "index.merge.scheduler.max_thread_count": 2 --合并线程数,避免占用过多CPU(默认1,机械硬盘建议1-2,SSD可适当增加)
  }'

批量写入优先:避免单条/小批量零散写入,批量大小设为5000-10000条(结合数据大小,单批约5-10MB),减少刷盘时生成的小分段。

延长刷新间隔:非实时查询场景,将index.refresh_interval设为30s-1min(默认1s),减少频繁刷新导致的小段拆分。

减少无效更新/删除:避免高频重复更新同一文档(更新会生成新段),删除操作尽量批量执行,避免单条删除累积删除标记。

powershell 复制代码
#修改刷新时间和副本数
curl -k -u elastic:Passw0rd -H "Content-Type: application/json" -XPUT "http://es_host:9200/group_tag_all_boci/_settings" 
-d '{"number_of_replicas":0,"refresh_interval":-1}'  #设置0副本 不刷新
#恢复刷新时间和副本数
curl -k -u elastic:Passw0rd -H "Content-Type: application/json" -XPUT "http://es_host:9200/group_tag_all_boci/_settings" 
-d '{"number_of_replicas":1,"refresh_interval":"1s"}'

4.配置层优化(加速小段合并,阻止累积)

a. 调整合并策略(直接套用):

powershell 复制代码
{
  "index.merge.policy.max_merged_segment": "5gb", --合并后的大段阈值(默认5gb,可根据磁盘调整)
  "index.merge.policy.segments_per_tier": 8, --每层允许的最大段数(默认10,减小则触发合并更频繁)
  "index.merge.policy.min_merge_size": "10mb" --最小合并大小(小于此的段优先合并)
}

b. 关闭不必要的副本同步:若集群稳定,避免频繁调整副本数/分片数,减少副本恢复时生成的临时小段。

c. 优化缓冲配置:

powershell 复制代码
PUT /目标索引/_settings
{
  "index.translog.flush_threshold_size": "512mb", --事务日志刷盘阈值(增大减少刷盘次数)
  "index.memory.index_buffer_size": "20%" --索引缓冲占堆比例(足够缓冲减少小分段)
}
相关推荐
幂律智能2 小时前
能源企业合同管理数智化转型解决方案
大数据·人工智能·能源
onebound_noah3 小时前
电商图片搜索:技术破局与商业落地,重构“视觉到交易”全链路
大数据·前端·网络·人工智能·重构·php
n***63275 小时前
Python大数据可视化:基于大数据技术的共享单车数据分析与辅助管理系统_flask+hadoop+spider
大数据·python·信息可视化
Michelle80236 小时前
24大数据 while循环
大数据·python
Hello.Reader6 小时前
从 CDC 到实时数据流Flink SQLServer CDC Connector 实战
大数据·sqlserver·flink
Huathy-雨落江南,浮生若梦7 小时前
ElasticSearch9入门(二)分词器安装与复杂查询语法
elasticsearch
TG:@yunlaoda360 云老大9 小时前
谷歌云Flink 核心组成及生态发展:实时数据处理的下一代引擎
大数据·flink·googlecloud
JavaBoy_XJ9 小时前
电商系统中ES检索技术设计和运用
大数据·elasticsearch·搜索引擎
Bobby Wang13 小时前
Git详解
elasticsearch