知识卡片
每日主动段合并优化:碎片化是查询性能的隐形杀手
内容
Elasticsearch这类基于Lucene的搜索引擎,索引底层由许多”段”(segment)构成,随着持续写入,段的数量会不断增多、碎片化程度不断加重,而碎片化本身会显著拖慢查询性能——即使查询逻辑和数据量本身没有变化,纯粹因为底层存储碎片化程度上升,查询也会变得越来越慢。应对这个问题的做法是主动定期(每天)触发段合并优化(设置max_num_segments为1,把碎片化的多个段合并成尽量少的段),虽然这个优化操作本身开销很大、耗时较长,但只要能安排在业务高峰期之前完成,就能显著改善接下来一段时间的查询性能,这笔”提前投入”被认为是划算的。这个案例的价值在于揭示了一类容易被忽视的性能衰减模式:某些系统的性能不会因为负载不变就保持稳定,而是会随着运行时间的推移持续、隐性地劣化(这里是碎片化累积),如果不主动介入去做周期性的整理维护,性能会在没有任何外部负载变化的情况下自然下滑,最终在某个时刻表现为”看起来毫无征兆”的慢查询问题。应对这类隐性衰减,比”等到问题出现再排查”更好的策略是识别出衰减的根源(碎片化),把清理这类衰减的操作变成一项周期性的、主动安排在低峰期执行的常规运维动作,而不是被动响应。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.8 亿级规模的Elasticsearch优化实战"节,"2.8.3 其他"及"2.8.4 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter2_8_4.xhtml、Chapter2_8_5.xhtml)
- 结论依据:原文说明"每天优化是有好处的,可以大大改善查询性能。建议配置max_num_segments为1。虽然优化时间会变长,但是在高峰期前能完成的话,会对查询性能有很大好处",以及问答环节"优化是值得的,大量的碎片会导致查询性能大大降低",共同支撑本卡片结论。
- 原始内容:每天优化是有好处的,可以大大改善查询性能。建议配置max_num_segments为1。虽然优化时间会变长,但是在高峰期前能完成的话,会对查询性能有很大好处……优化是值得的,大量的碎片会导致查询性能大大降低。