_forcemerge API 使用说明

强制合并segment文件

force merge API 允许通过 API 强制合并一个或多个索引。 合并与 Lucene 索引在每个分片中保存的分段数有关。 强制合并操作允许通过合并来减少分段的数量。

此调用将阻塞,直到合并完成。 如果http连接丢失,请求会在后台继续,任何新的请求都会阻塞,直到之前的强制合并完成。

强制合并只能在只读索引时调用。对读写索引执行强制合并可能会产生非常大的分段(每个段>5Gb),并且合并策略永远不会考虑再次合并,直到它主要由被删除的文档组成。这可能会导致非常大的分段留在分片中。

API 语法

POST /twitter/_forcemerge

可选参数

强制合并 API 接受以下请求参数:

参数名解释
max_num_segments要合并到的分段数。 要完全合并索引,请将其设置为1。 默认为简单地检查合并是否需要执行,如果需要,则执行它。默认值-1
only_expunge_deletes合并过程是否应该只删除其中包含删除的分段。 在 Lucene 中,文档不会从段中删除,只是标记为已删除。 在分段的合并过程中,会创建一个没有这些删除的新段。 这个标志只允许合并有删除的分段。 默认为false。 请注意,这不会覆盖 index.merge.policy.expunge_deletes_allowed 阈值。
flush强制合并后是否应该执行刷新。 Defaults to true.
POST /kimchy/_forcemerge?only_expunge_deletes=false&max_num_segments=100&flush=true

多索引操作

强制合并 API 可以通过一次调用应用于多个索引,甚至可以应用于_all索引。 每个节点一次在一个分片上执行多索引操作。 强制合并使正在合并的分片的存储量暂时增加,在 max_num_segments 设置为 1 的情况下,它的大小会增加一倍,因为所有段都需要重新写入一个新的分段。

POST /kimchy,elasticsearch/_forcemerge

POST /_forcemerge

使用案例

查找存在删除文档的索引

GET _cat/indices?v&s=docs.deleted:desc
green  open   index1                             89fFEwgnSi2bUoE1JKzsNg   4   2   31770267     20108891     49.2gb         16.1gb
green  open   index2                       malrWzpfR2yMGIKHc_N20w  36   1 2268274293    405861291        1tb        550.5gb

查看线程池情况

GET /_cat/thread_pool/force_merge?v&s=node_name

force_merge线程池是一个fixed类型的,线程数为1且无限阻塞的队列的线程池。这样每个Node上只会有一个执行合并线程的线程。

node_name     name        active queue rejected
es13       force_merge      1     0        0
es13       force_merge      0     0        0
es14       force_merge      1     0        0
es14       force_merge      0     0        0
es15       force_merge      1     0        0
es15       force_merge      0     0        0
es16       force_merge      1     0        0
es17       force_merge      1     0        0
es18       force_merge      1     0        0
es19       force_merge      1     0        0
es20       force_merge      1     0        0

查看segment情况

GET /_cat/segments/indexname1?v&s=docs.deleted:desc,segment

查看任务

GET _tasks?detailed=true&actions=indices:admin/forcemerge*

合并任务会拆分成多个子任务执行。

1 只进行已删除的合并

POST /indexname1/_forcemerge?only_expunge_deletes=true

2 没有限制最大segment数的合并

POST /indexname1/_forcemerge

3 限制最大segment数的合并

POST /indexname1/_forcemerge?max_num_segments=20

注意点

  1. 不能频繁进行强制合并,会使得CPU和I/O变高,增大服务器压力。
  2. 在合并的时候需要有足够的存储空间,合并的方式是先将数据写入新的分段,在删除旧的分段,索引在合并的过程中索引占用的存储空间会增加,最大翻一倍。
  3. 在单纯使用限制最大segment数的合并的时候,结果中会存在满足已删除文档超过10%,没有进行合并的分段,可以再次执行只进行已删除的合并进行再次合并分段。
  4. 对于只读不写的索引,可以进行完全合并,完全合并的意思就是分段数设置为1

源码分析

强制合并分段 _forcemerge API 源码分析

Logo

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

更多推荐