提升 Elasticsearch 索引性能 TOP 10 小技巧,你用到几个?

科技   2024-11-16 16:03   安徽  

👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;

截止目前,累计输出 68w+ 字,讲解图 2776+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2400+小伙伴加入

Elasticsearch 是一个功能强大的搜索和分析引擎,能够快速存储、搜索和分析海量数据。

在 Elasticsearch 的核心组件中,索引性能至关重要。索引(动词)过程负责将数据添加到 Elasticsearch 中,而索引性能的好坏直接影响到搜索查询的效率。

本文将分享提升 Elasticsearch 索引性能的 10 个实用技巧,帮助大家更高效地使用 Elasticsearch。

你一共用到几个?有没有更好的使用小技巧?欢迎留言补充交流。

1. 选择合适的硬件

要提升 Elasticsearch 的索引性能,首先需要确保硬件配置到位。

Elasticsearch 对内存 (RAM)、CPU 和 磁盘 I/O 的依赖性较高,因此选择合适的硬件至关重要。建议选择具备充足内存和 CPU 资源的服务器,并优先使用 SSD 磁盘以提高磁盘 I/O 性能,从而减少索引时间。

Elasticsearch 官方文档强调:

  • 搜索性能受存储和计算资源的影响较大。如果搜索受限于I/O,建议增大文件系统缓存或使用更快的存储设备(如SSD);
  • 若受限于CPU,则应使用更快的处理器。
  • 相比远程存储,本地直连存储通常性能更佳,配置更简单,延迟更低。远程存储在高负载下性能可能较差,但经过优化后也能达到可接受的效果。
  • 在确定存储架构前,应通过基准测试评估实际负载下的性能,并根据需要与供应商合作进行调优。https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

2. 使用 Bulk API 批量索引

Elasticsearch 提供了一个 Bulk API,允许在单次请求中索引多个文档。与一次索引一个文档相比,批量索引能显著提高性能,因为减少了网络往返的开销,提高了索引过程的效率。

Elasticsearch 官方文档强调:

  • 建议在单节点、单分片上进行基准测试,逐步增加批量请求的文档数量(100、200、400等)以找到最佳批量大小。

图示仅供参考递增批量值

  • 当索引速度趋于平稳时,即为最佳值。

  • 若数据量相近,宁可选择较小批次,以避免内存压力。

  • 通常批量请求不宜超过几十 MB,否则可能会对集群造成内存负担。

3. 在批量索引时禁用刷新

Elasticsearch 默认每秒刷新索引一次,这意味着每次添加新文档后,索引会立即可搜索。

然而,在批量索引时,这种行为会显著降低索引性能。

在进行大量数据写入时,可以暂时禁用自动刷新,待批量索引完成后再启用。

# 禁用刷新
PUT /my_index/_settings
{
  "refresh_interval""-1"
}

# 完成批量索引后重新启用
PUT /my_index/_settings
{
  "refresh_interval""30s"
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html

4. 调整刷新间隔

除了在批量索引时禁用刷新外,还可以通过增加默认的刷新间隔来提升索引性能。减少 Elasticsearch 每秒的刷新次数,可以降低系统的开销,从而提高索引速度。

不过,需要注意的是,刷新间隔增加后,新添加的文档不会立即可见,因此在某些实时性要求较高的场景中需要谨慎调整。

正确做法建议:在数据加载阶段将 refresh_interval 设置为较高值,例如 30s,完成后再恢复到默认值 1s。

5. 优化文档设计

文档的设计对索引性能有很大影响。避免使用过于庞大和复杂的文档,尽量减少嵌套字段的使用,尤其是深层嵌套结构,因为它们会显著降低索引速度。

正确做法:

  • 尽量减少文档大小(不要过大,比如:一本书导入一个文档),避免过多的嵌套。

  • 仅保留必要的字段,避免存储多余信息。

6. 减少索引的字段数量

过多的字段会显著增加索引的时间,因为 Elasticsearch 需要对每个字段进行分析和映射。

仅索引需要用于搜索的字段,其余字段可以设置为 index: false。

PUT /my_index
{
  "mappings": {
    "properties": {
      "description": { "type""text" },
      "comments": { "type""text""index"false } # 不需要搜索的字段
    }
  }
}

正确做法建议:减少不必要的字段,仅对需要搜索和聚合的字段进行索引。

7. 优化磁盘性能

Elasticsearch 的主分片数据会写入节点的文件系统,因此磁盘速度对索引性能有重要影响。

选择速度快、容量大的磁盘,如 SSD,可以显著提升索引效率。——多么正确的废话!但是很多咨询的球友企业不提供硬件支撑,在机械磁盘做再足优化也无济于事。

图示仅为方便大家直观认知

正确做法建议:尽量使用 NVMe SSD,尤其是在处理大量日志或时间序列数据时。

8. 索引生命周期 ILM 管理

当一个索引过大时,管理起来会变得困难,导致搜索和索引性能下降。可以考虑将索引分为每日或每周的索引,这在处理时间序列数据(如日志事件)时尤其有用。

正确做法:

对于日志数据,使用按日期滚动的索引,如

logs-2024-11-01、
logs-2024-11-02。

定期删除过期的索引以释放存储空间。

9. 防止映射爆炸

如果使用动态映射,可能会导致字段数量过多,从而引发映射爆炸的问题。

建议定义显式映射来控制字段数量,避免自动检测新字段。

PUT /my_index
{
  "mappings": {
    "dynamic""strict"# 禁止自动添加字段
    "properties": {
      "user": { "type""keyword" },
      "message": { "type""text" }
    }
  }
}

正确做法:使用 dynamic: strict 控制自动映射。

定期清理不再使用的字段。

10. 优化 Translog 性能

在Elasticsearch 8.x中,调整translog(事务日志)设置可以提高性能和数据持久性。主要设置包括:

translog的持久性(index.translog.durability)、

同步间隔(index.translog.sync_interval)、

刷新阈值大小(index.translog.flush_threshold_size)。

通过合理配置这些参数,可以在保证数据安全的同时,优化系统性能。

以下是优化 Elasticsearch 8.x 中 Translog 性能的推荐配置:

参数名称含义性能优先配置数据安全优先配置
index.translog.durability控制 Translog 的持久性方式。asyncrequest
index.translog.sync_interval定义 Translog 异步刷新的时间间隔(仅在 async 模式下有效)。10s5s(在 request 模式下无效)
index.translog.flush_threshold_size当 Translog 大小达到此阈值时,触发一次 Lucene 刷新(Flush)。1gb512mb

小结

Elasticsearch 是处理大规模数据的必备工具,但要充分发挥其性能,必须优化索引过程。通过遵循上述 10 个技巧,你可以显著提升 Elasticsearch 的索引效率,从而提高搜索和分析的能力。

呼吁大家重视 Elasticsearch 索引性能的优化,避免常见的误区,以更好地发挥搜索引擎的优势。希望这篇文章能帮助大家在实际项目中取得更好的搜索性能!

👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;

截止目前,累计输出 68w+ 字,讲解图 2776+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2400+小伙伴加入


1. 我的私密学习小圈子,从0到1手撸企业实战项目!

2. SpringBoot + MinIO + kkFile 实现文件预览,这样操作更安全!

3. OMG,数据库主从延迟了!!!

4. SpringBoot 官方强烈推荐,连接池,太快了!

最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

“在看”支持小哈呀,谢谢啦

小哈学Java
码龄9年,前某厂中台研发。专注于Java领域干货分享,不限于BAT面试, 算法,数据库,Spring Boot, 微服务,高并发, JVM, Docker容器,ELK相关知识,期待与您一同进步。
 最新文章