force merge API 允许通过 API 强制合并一个或多个索引。 合并与 Lucene 索引在每个分片中保存的分段数有关。 强制合并操作允许通过合并来减少分段的数量。
此调用将阻塞,直到合并完成。 如果http连接丢失,请求会在后台继续,任何新的请求都会阻塞,直到之前的强制合并完成。
强制合并只能在只读索引时调用。对读写索引执行强制合并可能会产生非常大的分段(每个段>5Gb),并且合并策略永远不会考虑再次合并,直到它主要由被删除的文档组成。这可能会导致非常大的分段留在分片中。
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
GET /_cat/segments/indexname1?v&s=docs.deleted:desc,segment
GET _tasks?detailed=true&actions=indices:admin/forcemerge*
合并任务会拆分成多个子任务执行。
POST /indexname1/_forcemerge?only_expunge_deletes=true
POST /indexname1/_forcemerge
POST /indexname1/_forcemerge?max_num_segments=20
限制最大segment数的合并
的时候,结果中会存在满足已删除文档超过10%,没有进行合并的分段,可以再次执行只进行已删除的合并
进行再次合并分段。1
。强制合并分段 _forcemerge API 源码分析