一、集群情况查看
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:已分配堆内存
- 检查索引设置
powershell
curl -k -u elastic:Passw0rd -GET es_host:9200/pds_decision_instance/_settings?pretty
- 查看分片级写入压力(_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:分片存储大小,若某分片存储突然增长,可能是写入集中。
- 监控节点写入性能(_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 瓶颈)。
- 查看线程池状态
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时),因为副本分片是主分片的完整拷贝。这里23gb2=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'
- 彻底清理段文件,释放物理内存
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%" --索引缓冲占堆比例(足够缓冲减少小分段)
}