ELASTICSEARCH 写入速度优化

提升ES的写入速度可以从以下几方面入手:

  • 加大 translog flush ,可以降低 iops,writeblock
  • 加大 index refresh 间隔, 除了降低 io, 也降低了 segment merge 频率
  • 调整 bulk 线程池和队列
  • 优化磁盘间的任务均匀情况,将 shard 尽量均匀分布到物理主机的各磁盘
  • 优化节点间的任务分布,将任务尽量均匀的发到各节点
  • 优化 lucene 层建立索引的过程,目的是降低 CPU 占用率及 IO

translog flush 间隔调整

默认设置下,translog 的持久化策略为:每个请求都flush,对应配置项为:index.translog.durability: request
这会很大程度影响 es 写入速度,但写操作确很可靠,不会丢失数据。如果可以接受一定几率的数据丢失,可以调整 translog 持久化策略为周期性和一定大小

index.translog.durability: asyncindex.translog.sync_interval: 120s 
index.translog.flush_threshold_size: 1024mb
index.translog.flush_threshold_period: 120m

索引刷新间隔调整: refresh_interval

默认情况下,索引的refresh_interval为1秒,意味着数据写入1秒后就可以被搜索到。
每次索引的 refresh 会产生一个新的 lucene 段,这会导致频繁的 segment merge 行为,如果不需要这么高的搜索实时性,可以降低索引refresh周期,如:
index.refresh_interval: 120s

磁盘间的任务均衡

如果部署方案是为 path.data 配置多个路径来使用多块磁盘, es 在分配 shard 时,落到各磁盘上的shard可能并不均匀,这种不均匀可能会导致某些磁盘繁忙,利用率达到100%,这种不均匀达到一定程度可能会对写入性能产生负面影响。

es 在处理多路径时,优先将shard分配到可用空间百分比最多的磁盘,因此短时间内创建的 shard 可能被集中分配到这个磁盘,即使可用空间是99%和98%的差别。

es 增加了两种策略

  • 简单轮询:系统初始阶段,简单轮询的效果是最均匀的
  • 基于可用空间的动态加权轮询:以可用空间作为权重,在磁盘之间加权轮询

节点间的任务均衡

为了在节点间任务尽量均衡,数据写入客户端应该把bulk请求轮询发送到各个节点,当使用java api 或者rest api 的bulk接口发送数据时,客户端将会轮询的发送的集群节点。
当client.transport.sniff为true,列表为所有数据节点;否则,列表为初始化客户端对象时添加进去的节点。
观察bulk 请求在不同节点上的处理情况,通过 cat 接口观察 bulk 线程池和队列情况,是否存在不均:_cat/thread_pool

索引过程调整和优化

  1. 自动生成 doc ID

分析 es 写入流程可以看到,写入 doc 时如果是外部指定了 id,es 会先尝试读取原来doc的版本号, 判断是否需要更新,使用自动生成 doc id 可以避免这个环节.

  1. 调整字段 Mappings

字段的 index 属性设置为: not_analyzed,或者 no。

对字段不分词,或者不索引,可以节省很多运算,降低 CPU 占用。尤其是 binary 类型,默认情况下占用 CPU 非常高,而这种类型根本不需要进行分词做索引。

单个 doc 在建立索引时的运算复杂度,最大的因素不在于 doc 的字节数或者说某个字段 value 的长度,而是字段的数量。例如在满负载的写入压力测试中,mapping 相同的情况下,一个有10个字段,200字节的 doc, 通过增加某些字段 value 的长度到500字节,写入 es 时速度下降很少,而如果字段数增加到20,即使整个 doc 字节数没增加多少,写入速度也会降低一倍。

  1. 使用不同的分析器:analyzer

不同的分析器在索引过程中运算复杂度也有较大的差异。

  • 调整_source 字段
    _source 字段用于存储 doc 原始数据,对于部分不需要存储的字段,可以通过 includes excludes 来过滤,这样可以降低 io 的压力。

  • 禁用 _all 字段
    _all 字段默认是开启的,其中包含所有字段分词后的关键词,作用是可以在搜索的时候不指定特定字段,从所有字段中检索。如果你不需要这个特性,可以禁用_all,可以小幅的降低CPU 压力,对速度影响并不明显。

  • 对于 Analyzed 的字段禁用 Norms
    Norms 用于在搜索时计算 doc 的评分,如果不需要评分,可以禁用:"title": {"type": "string","norms": {"enabled": false}}

  • index_options 设置
    index_options 用于控制在建立倒排索引过程中,哪些内容会被添加到倒排,例如 doc数量,词频,positions,offsets等信息。

优化这些设置可以一定程度节省 CPU

你可能感兴趣的:(ELASTICSEARCH 写入速度优化)