_forcemerge API 使用说明
文章目录
强制合并segment文件
- _forcemerge API 使用说明
- 强制合并segment文件
- API 语法
- 可选参数
- 多索引操作
- 使用案例
- 查找存在删除文档的索引
- 查看线程池情况
- 查看segment情况
- 查看任务
- 1 只进行已删除的合并
- 2 没有限制最大segment数的合并
- 3 限制最大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
注意点
- 不能频繁进行强制合并,会使得CPU和I/O变高,增大服务器压力。
- 在合并的时候需要有足够的存储空间,合并的方式是先将数据写入新的分段,在删除旧的分段,索引在合并的过程中索引占用的存储空间会增加,最大翻一倍。
- 在单纯使用
限制最大segment数的合并
的时候,结果中会存在满足已删除文档超过10%,没有进行合并的分段,可以再次执行只进行已删除的合并
进行再次合并分段。 - 对于只读不写的索引,可以进行完全合并,完全合并的意思就是分段数设置为
1
。
强制合并分段 _forcemerge API 源码分析