Elasticsearch7.8.0版本优化——写入速度优化

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch7.8.0版本优化——写入速度优化相关的知识,希望对你有一定的参考价值。

目录

一、 写入速度优化的概述

  • ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实使用时,我们需要根据公司要求,进行偏向性的优化。

  • 针对于搜索性能要求不高,但是对写入要求较高的场景,我们需要尽可能的选择恰当写
    优化策略。综合来说,可以考虑以下几个方面来提升写索引的性能:

    1、加大 Translog Flush ,目的是降低 Iops、Writeblock。

    2、增加 Index Refresh 间隔,目的是减少 Segment Merge 的次数。

    3、调整 Bulk 线程池和队列。

    4、优化节点间的任务分布。

    5、优化 Lucene 层的索引建立,目的是降低 CPU 及 IO。

二、如何写入速度优化

2.1、 批量数据提交

  • ES 提供了 Bulk API 支持批量操作,当我们有大量的写任务时,可以使用 Bulk 来进行批量写入。
  • 通用的策略如下:Bulk 默认设置批量提交的数据量不能超过 100M。数据条数一般是根据文档的大小和服务器性能而定的,但是单次批处理的数据大小应从 5MB~15MB 逐渐增加,当性能没有提升时,把这个数据量作为最大值。

2.2、 优化存储设备

  • ES 是一种密集使用磁盘的应用,在段合并的时候会频繁操作磁盘,所以对磁盘要求较高,当磁盘速度提升之后,集群的整体性能会大幅度提高。

2.31、 合理使用合并

  • Lucene 以段的形式存储数据。当有新的数据写入索引时,Lucene 就会自动创建一个新的段。
  • 随着数据量的变化,段的数量会越来越多,消耗的多文件句柄数及 CPU 就越多,查询效率就会下降。
  • 由于 Lucene 段合并的计算量庞大,会消耗大量的 I/O,所以 ES 默认采用较保守的策略,让后台定期进行段合并

2.4、 减少 Refresh

  • Lucene 在新增数据时,采用了延迟写入的策略,默认情况下索引的 refresh_interval 为1 秒。
  • Lucene 将待写入的数据先写到内存中,超过 1 秒(默认)时就会触发一次 Refresh,然后 Refresh 会把内存中的的数据刷新到操作系统的文件缓存系统中。
  • 如果我们对搜索的实效性要求不高,可以将 Refresh 周期延长,例如 30 秒。这样还可以有效地减少段刷新次数,但这同时意味着需要消耗更多的 Heap 内存。

2.5、 加大 Flush

  • Flush 的主要目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到512MB 或者 30 分钟时,会触发一次 Flush。
  • index.translog.flush_threshold_size 参数的默认值是 512MB,我们进行修改。
  • 增加参数值意味着文件缓存系统中可能需要存储更多的数据,所以我们需要为操作系统
    的文件缓存系统留下足够的空间。

2.6、 减少副本的数量

  • ES 为了保证集群的可用性,提供了 Replicas(副本)支持,然而每个副本也会执行分析、索引及可能的合并过程,所以 Replicas 的数量会严重影响写索引的效率。
  • 当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越慢。
  • 如 果 我 们 需 要 大 批 量 进 行 写 入 操 作 , 可 以 先 禁 止 Replica 复 制 , 设 置index.number_of_replicas: 0 关闭副本。在写入完成后,Replica 修改回正常的状态。

以上是关于Elasticsearch7.8.0版本优化——写入速度优化的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch7.8.0版本优化——硬件选择

Elasticsearch7.8.0版本优化——分片策略

Elasticsearch7.8.0版本优化——内存设置

Elasticsearch7.8.0版本优化——一些重要配置解释

Elasticsearch7.8.0版本进阶——数据写流程

Elasticsearch入门——Elasticsearch7.8.0版本指定JDK11版本