第七节 段合并优化及注意事项
1、Lucene Index 原理回顾
1-1 Segment
在 Lucene 中,单个倒排索引文件被称为 Segment。
Segment 是自包含的,不可变更的。 多个 Segments 汇总在一起,称为 Lucene 的 Index,其对应的就是 ES 中的 Shard
An ES Shard = A Lucene Index
1-2 Commit Point & Refresh
- 当有新文档写入时,并且执行 Refresh,就会生成一个新 Segment。
- Lucene 中有一个文件,用来记录所有 Segments 信息,叫做 Commit Point。
- 查询时会同时查询所有 Segments,并且对结果汇总。
1-3 .del
- 删除的文档信息,保存在“.del”文件中,查 询后会进行过滤。
1-4 Merge
Segment 会定期 Merge,合并成一个,同时删除已删除文档
2、Merge 优化
- ES 和 Lucene 会自动进行 Merge 操作
- Merge 操作相对比较重,需要优化,降低对系统的影响
2-1 优化点一: 降低分段产生的数量/频率
- 可以将 Refresh Interval 调整到分钟级别 (提高Refresh Interval)
indices.memory.index_buffer_size
(默认是 10%)- 尽量避免文档的更新操作
2-2 优化点二: 降低最大分段大小
- 避免较大的分段继续参与 Merge,节省系统资源。(最终会有多个分段)
Index.merge.policy.segments_per_tier
,默认为 10, 越小需要越多的合并操作Index.merge.policy.max_merged_segment
, 默认 5 GB, 操作此大小以后,就不再参与后续的 合并操作
3、Force Merge
-
当 Index 不再有写入操作的时候,建议对其进行 force merge
- 提升查询速度
- 减少内存开销
-
最终分成几个 segments 比较合适?
- 越少越好,最好可以 force merge 成 1 个,但是,Force Merge 会占用大量的网络,IO 和 CPU
- 如果不能在业务高峰期之前做完,就需要考虑增大最终的分段数
- Shard 的大小
Index.merge.policy.max_merged_segment
的大小