跳转至

第七节 段合并优化及注意事项

1、Lucene Index 原理回顾

Alt Image Text

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 的大小

Alt Image Text