elasticsearch forcemerge

es验证版本:1.0.0 , 7.x

1 elasticsearch 删除更新与删除机制

1.1 删除

每个段中维护一个.del 文件,ES 只是逻辑删除文档,在.del 文件中标记为已删除,查询依然可以查到,但是会在结果中过滤掉。

  • 删除索引是会立即释放空间的,不存在所谓的“标记”逻辑。
  • 删除文档的时候,是将新文档写入,同时将旧文档标记为已删除。 磁盘空间是否释放取决于新旧文档是否在同一个segment file里面,因此ES后台的segment merge在合并segment file的过程中有可能触发旧文档的物理删除。

1.2 更新

引入版本的概念,旧版本的记录将在 .del 文件中标记为删除,新版本的文档将被索引到一个新段(Segment)。

es在Segment数量达到一定得临界点会自动forcemerge。实际得生产情况,会极大得影响查询得效率。

解决方案:执行forcemerge操作,手动释放磁盘空间;在merge的过程中会占用极大的cpu,io资源,尽量选择系统低消费时间段force_merge。

2 forcemerge操作

官网文档:https://www.elastic.co/cn/

2.1 查看es索引优化信息列表

2.1.1 api

使用posman调接口,或者是浏览器,get/post 请求代码均可;
当前api在高低版本均可使用

  1. 查看api
# 查询api,高低版本均支持,博主已验证
http://xxx.xxx.xxx.xxx:9200/_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r
  1. 结果

在这里插入图片描述

参数说明

  • index:es中得索引名称
  • segamentsCount: segament文件数量,正常情况越少查询效率越高
  • megesCurrent:force_merge线程个数
  • mergesCurrentDocs:force_merge文档个数
  • storeSize:当前index占用磁盘的空间
  • p:当前index有几个分片
  • r:几份副本

2.2 force_merge操作

2.2.1 低版本 2.1 以下
2.2.1.1 api
  1. 单索引
# 语法 max_num_segments=1参数设置1,${index_name}填写要force_merge的index
post: http://xxx.xxx.xxx.xxx:9200/${index_name}/_optimize?max_num_segments=1
  1. 多索引
# 语法 max_num_segments=1参数设置1,${index_name}填写要force_merge的index
post: http://xxx.xxx.xxx.xxx:9200/${index_name1},${index_name2}/_optimize?max_num_segments=1
# 全部 force_merge
post: http://xxx.xxx.xxx.xxx:9200/_optimize?max_num_segments=1
  1. 参数说明
  • max_num_segments:要优化的段数。要完全优化索引,请将其设置为1。默认值是简单地检查是否需要执行合并,如果需要,则执行合并。
  • only_expunge_deletes:优化过程应该只删除其中有删除的片段。在Lucene中,不会从段中删除文档,而只是将其标记为已删除。在段的合并过程中,将创建一个没有这些删除的新段。此标志仅允许合并具有删除的段。默认为false。请注意,这不会超过 index.merge.policy.expunge_deletes_allowed阈值。
  • flush:优化后是否应执行冲洗。默认为 true。
  • wait_for_merge:该请求是否应等待合并结束。默认为true。请注意,合并可能是一项非常繁重的操作,因此运行设置为的合并可能很有意义false。
  • force:即使分片中只有一个片段而没有删除,也强制执行合并操作。 [ 1.1.0 ]
2.2.1.1 演示

在这里插入图片描述

2.2.2 高版本
2.2.2.1 api
  1. 单索引
# 语法 max_num_segments=1参数设置1,${index_name}填写要force_merge的index
http://xxx.xxx.xxx.xxx:9200/${index_name}/_forcemerge?max_num_segments=1
  1. 多索引
# 语法 max_num_segments=1参数设置1,${index_name}填写要force_merge的index
http://xxx.xxx.xxx.xxx:9200/${index_name1}, /${index_name2}/_forcemerge?max_num_segments=1
# 全部
http://xxx.xxx.xxx.xxx:9200/_forcemerge?max_num_segments=1

  1. 参数说明
  • max_num_segments:合并到的段数。要完全合并索引,请将其设置为1。默认值是简单地检查是否需要执行合并,如果需要,则执行合并。
  • only_expunge_deletes:合并过程应该只删除其中有删除的段。在Lucene中,不会从段中删除文档,而只是将其标记为已删除。在段的合并过程中,将创建一个没有这些删除的新段。此标志仅允许合并具有删除的段。默认为false。请注意,这不会超过 index.merge.policy.expunge_deletes_allowed阈值。
  • flush:强制合并后是否应该执行刷新。默认为 true。
2.2.2.2 演示

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐