MST
星途 面试题库

面试题:ElasticSearch索引设置参数调优在高并发海量数据场景下的应用

假设你面临一个高并发、海量数据写入和查询的ElasticSearch应用场景,每秒有上万条数据写入,同时有大量的实时查询请求。请详细阐述你会如何对索引设置的各项参数(如 `refresh_interval`、`index.translog.durability`、`index.merge.policy` 等)进行调优,以确保系统在这种极端场景下仍能保持高性能、高可用性和数据一致性。
12.6万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

refresh_interval

  1. 默认情况:默认值是1秒,这意味着Elasticsearch每秒会将内存中的数据刷新到磁盘生成新的段,从而使数据可搜索。
  2. 高并发场景调整:在高并发海量写入场景下,可适当增大该值,如设置为30秒或1分钟。这样减少了频繁刷新操作对系统资源的消耗,因为每次刷新都会涉及I/O操作。但增大该值会导致数据可见延迟增加,所以要根据业务对数据实时性的容忍程度来调整。

index.translog.durability

  1. 默认情况:默认值为 request,即每次写入请求都将事务日志(translog)刷新到磁盘,确保数据不会丢失,但这在高并发写入时会带来较大的I/O开销。
  2. 高并发场景调整:可考虑设置为 async,并结合一个合理的 async_interval(如5秒)。这种方式下,Elasticsearch会每隔 async_interval 时间将事务日志刷新到磁盘。这样可以减少I/O操作频率,提高写入性能。不过,一旦发生故障,可能会丢失 async_interval 时间段内的数据,所以要权衡数据一致性和写入性能的需求。

index.merge.policy

  1. 默认策略:Elasticsearch默认使用 TieredMergePolicy
  2. 高并发场景调整
    • 调整参数
      • max_merge_at_once:默认值是10,可适当增大该值,例如设置为20或30,允许一次合并更多的段,减少合并次数,但会占用更多的I/O和内存资源。
      • max_merge_at_once_explicit:默认值是30,在手动触发合并时,可根据实际情况适当调整,以优化合并过程。
      • index.merge.policy.floor_segment:默认值是2MB,可适当增大,比如设置为10MB,减少小文件段的合并频率,提高性能。

其他索引设置优化

  1. 副本数量
    • 默认情况:默认每个索引有1个副本。
    • 高并发场景调整:在高并发读场景下,可适当增加副本数量,提高查询的并行处理能力。但副本数量过多会占用更多的磁盘空间和网络带宽用于数据同步,所以要根据硬件资源和业务需求权衡。
  2. 分片数量
    • 计算方式:要根据数据量、节点数量和硬件资源合理规划。一般原则是每个分片大小控制在10GB - 50GB左右。例如,如果预计数据量为1TB,可考虑设置20 - 100个分片。
    • 动态调整:在集群运行过程中,可根据实际的写入和查询负载动态调整分片数量。如果写入负载过高,可适当增加分片;如果查询性能不佳,可考虑减少分片以优化查询效率。