Teng's blog Teng's blog
首页
Java
H5前端
GitHub (opens new window)
首页
Java
H5前端
GitHub (opens new window)
  • 认知

  • 入门

  • 环境

  • 进阶

  • 框架集成

  • 优化

    • 硬件选择
    • 分片策略
    • 路由选择
    • 写入速度优化
      • 优化存储设备
      • 合理使用合并
      • 减少 Refresh 的次数
      • 加大 Flush 设置
      • 减少副本的数量
    • 内存设置
    • 重要配置
  • 面试题

  • Database-Elasticsearch
  • 优化
Shetengteng
2022-02-05

写入速度优化

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

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

  • 加大Translog Flush,目的是降低Iops、Writeblock
  • 增加Index Refesh间隔,目的是减少Segment Merge的次数
  • 调整Bulk 线程池和队列
  • 优化节点间的任务分布
  • 优化Lucene层的索引建立,目的是降低CPU及IO

# 优化存储设备

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

# 合理使用合并

Lucene 以段的形式存储数据。当有新的数据写入索引时, Lucene 就会自动创建一个新的段

随着数据量的变化,段的数量会越来越多,消耗的多文件句柄数及 CPU 就越多,查询效率就会下降

由于 Lucene 段合并的计算量庞大,会消耗大量的 I/O,所以 ES 默认采用较保守的策略,让后台定期进行段合并

# 减少 Refresh 的次数

Lucene 在新增数据时,采用了延迟写入的策略

  • 默认情况下索引的refresh_interval 为1 秒
  • 将待写入的数据先写到内存中,超过 1 秒(默认)时就会触发一次 Refresh,然后 Refresh 会把内存中的的数据刷新到操作系统的文件缓存系统中

如果对搜索的实效性要求不高,可以将 Refresh 周期延长,例如 30 秒;可以有效地减少段刷新次数,但需要消耗更多的 Heap 内存

# 加大 Flush 设置

Flush 的主要目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到 512MB 或者 30 分钟时,会触发一次 Flush。

index.translog.flush_threshold_size 参数的默认值是 512MB,进行修改

  • 增加参数值
    • 文件缓存系统中可能需要存储更多的数据
    • 需要为操作系统的文件缓存系统留下足够的空间

# 减少副本的数量

ES 为了保证集群的可用性,提供了 Replicas(副本)支持,然而每个副本也会执行分析、索引及可能的合并过程,所以 Replicas 的数量会严重影响写索引的效率

当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越慢

如果需要大批量进行写入操作,可以先禁止Replica复制,设置

  • index.number_of_replicas: 0 关闭副本
  • 在写入完成后, Replica 修改回正常的状态
Last Updated: 2022/02/05, 15:58:51
路由选择
内存设置

← 路由选择 内存设置→

Theme by Vdoing | Copyright © 2021-2022 Shetengteng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式