ES查看segment大小

摘自:http://www.aboutyun.com/thread-17078-1-1.html

 

Segment Memory

Segment不是file吗?segment memory又是什么?前面提到过,一个segment是一个完备的lucene倒排索引,而倒排索引是通过词典 (Term Dictionary)到文档列表(Postings List)的映射关系,快速做查询的。 由于词典的size会很大,全部装载到heap里不现实,因此Lucene为词典做了一层前缀索引(Term Index),这个索引在Lucene4.0以后采用的数据结构是FST (Finite State Transducer)。 这种数据结构占用空间很小,Lucene打开索引的时候将其全量装载到内存中,加快磁盘上词典查询速度的同时减少随机磁盘访问次数。

下面是词典索引和词典主存储之间的一个对应关系图:

<ignore_js_op> 

说了这么多,要传达的一个意思就是,ES的data node存储数据并非只是耗费磁盘空间的,为了加速数据的访问,每个segment都有会一些索引数据驻留在heap里。因此segment越多,瓜分掉的heap也越多,并且这部分heap是无法被GC掉的! 理解这点对于监控和管理集群容量很重要,当一个node的segment memory占用过多的时候,就需要考虑删除、归档数据,或者扩容了。

怎么知道segment memory占用情况呢?  CAT API可以给出答案。

1.  查看一个索引所有segment的memory占用情况:
<ignore_js_op> 
2.  查看一个node上所有segment占用的memory总和:
<ignore_js_op> 

那么有哪些途径减少data node上的segment memory占用呢? 总结起来有三种方法:

    •     删除不用的索引。
    •     关闭索引 (文件仍然存在于磁盘,只是释放掉内存)。需要的时候可以重新打开。
    •     定期对不再更新的索引做optimize (ES2.0以后更改为force merge api)。这Optimze的实质是对segment file强制做合并,可以节省大量的segment memory。
### 如何清理 Elasticsearch 中超过 5G 大小的段 在 Elasticsearch 中,可以通过调整 `index.merge.policy.max_merged_segment` 参数来控制合并后的段的最大大小。默认情况下,该参数设置为 5GB[^3]。如果存在超过此大小的段,则可能是因为之前的配置不当或者数据量增长较快而未及时触发合并。 #### 方法一:手动强制合并(Force Merge) Elasticsearch 提供了一个 API 来强制合并索引中的段。这可以帮助减少段的数量并确保它们不超过指定大小。以下是具体的操作方法: 1. **API 请求** 使用 `_forcemerge` API 对目标索引进行操作: ```json POST /<your_index_name>/_forcemerge?max_num_segments=<number> ``` - `<your_index_name>` 是要处理的目标索引名称。 - `<number>` 表示最终保留的段数量。例如,将其设为 1 可以尝试将整个索引合并到单个段中。 2. **注意事项** - 强制合并是一个资源密集型操作,可能会显著增加 CPU 和 I/O 的负载。因此建议在低峰时段执行。 - 如果索引非常大,可以分批次逐步降低段数而不是一次性完成全部工作。 #### 方法二:动态调整段合并策略 除了手动干预外,还可以通过更改索引级别的设置来自定义段合并行为。例如,重新设定最大允许的段尺寸: ```json PUT /<your_index_name>/_settings { "index.merge.policy.max_merged_segment": "5gb" } ``` 上述命令会更新当前索引的段合并上限至新的阈值 (即 5 GB)[^3]。之后新产生的段将会遵循这一规则被自动管理起来。 #### 方法三:定期维护计划 为了避免频繁出现过大的 segment 导致性能下降的情况发生,应该建立一套完善的监控体系以及周期性的优化流程。比如利用 Curator 工具定时删除旧日志或冷门文档;又或者是借助 Kibana UI 界面查看健康状态图表以便快速定位异常现象[^2]。 最后提醒一点就是关于内存占用方面的问题——由于每个 Segment 占用固定的 Cache 储存空间且无法随 GC 自动回收,所以当面对大量小型 Segments 或者超出了硬件承载能力范围内的巨型 ones 时候都会引起严重的后果诸如 OOM 错误之类的事情发生[^4] 。所以在日常运维过程中一定要密切关注相关指标变化趋势从而采取预防措施加以规避风险。 ```python import requests def force_merge(index_name, max_segments=1): url = f"http://localhost:9200/{index_name}/_forcemerge?max_num_segments={max_segments}" response = requests.post(url) return response.json() result = force_merge("my_large_index", 5) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值