faster-bulk插件是阿里云Elasticsearch团队自研的插件,目的是为了提高写入吞吐和降低写入拒绝。该插件能够实现将bulk写入请求按照指定bulk请求大小和时间间隔进行批量聚合,防止过小的bulk请求阻塞写入队列,有效提升写入吞吐。本文介绍faster-bulk插件的适用场景和使用方法。

适用场景

faster-bulk插件适用于写入吞吐高、索引分片数多的场景,实测对这类场景写入吞吐提升20%以上,能有效降低写入拒绝,测试说明如下。
注意 faster-bulk实现的本质是对bulk写入请求进行批量聚合后再写入shard,因此建议不要在写入延时要求较高的场景中使用。
  • 测试环境
    • 节点:3 * 16核64 GB数据节点 + 2 * 16核64 GB独立协调节点。
    • 数据集:esrally官方数据集nyc-taxis,单文档大小为650字节。
    • 参数:apack.fasterbulk.combine.interval设置为200ms
    • translog状态:分别对translog在同步及异步状态进行测试。
  • 测试结果
    translog状态 写入性能(原生集群,未使用faster-bulk插件) 写入性能(阿里云集群,使用faster-bulk插件) 性能提升
    同步状态 182314/s 226242/s 23%
    异步状态 218732/s 241060/s 10%
  • 结论

    由实验数据对比可得,使用faster-bulk插件后,translog同步或异步状态下写入性能均有所提升,同步状态(默认)下写入性能提升了23%。

前提条件

您已完成以下操作:

  • 创建阿里云Elasticsearch实例,版本为6.7.0或7.10.0。
    具体操作步骤请参见创建阿里云Elasticsearch实例
    说明 faster-bulk插件目前仅支持阿里云Elasticsearch 6.7.0和7.10.0版本(商业版和增强版)。
  • 安装faster-bulk插件。

    具体操作步骤请参见安装或卸载系统默认插件。插件安装后,bulk聚合功能默认关闭,使用前需要先开启该功能。

开启bulk聚合功能

  1. 登录阿里云Elasticsearch实例的Kibana控制台。
    具体操作步骤请参见登录Kibana控制台
  2. 在左侧导航栏,单击Dev Tools
  3. Console中,执行以下命令,开启bulk聚合功能。
    PUT _cluster/settings
    {
       "transient" : {
          "apack.fasterbulk.combine.enabled":"true"
       }
    }
    说明 您也可以通过curl命令或第三方可视化插件执行以上命令。

设置bulk聚合大小和时间间隔

执行以下命令,指定bulk请求的聚合大小和时间间隔。当单个数据节点上,bulk请求的累计大小或聚合时间间隔达到阈值,即会触发数据写入。
PUT _cluster/settings
{
   "transient" : {
      "apack.fasterbulk.combine.flush_threshold_size":"1mb",
      "apack.fasterbulk.combine.interval":"50"
   }
}
  • apack.fasterbulk.combine.flush_threshold_size:聚合的bulk请求的最大值,默认值为1mb
  • apack.fasterbulk.combine.interval:聚合的bulk请求的最大时间间隔,单位为ms,默认值为50
说明 对于海量数据高并发场景,在集群可承受的压力范围内,可适当将最大聚合大小或最大时间间隔调大,减少bulk请求阻塞写入队列。

定向路由

当批量写入文档未指定routing和主键(_id)时,您可以为集群或指定索引开启定向路由,提高写入速度。
说明 如果集群或索引开启了定向路由,同时写入中也指定了routing和主键(_id),那么定向路由不会生效,且不会影响正常的业务写入。
  • 为集群开启定向路由
    PUT _cluster/settings
    {
      "persistent" : {
        "index.direct_routing.global.enable" : "true"
      }
    }
  • 为指定索引开启定向路由
    PUT index/settings
    {
      "index.direct_routing.enable" : "true"
    }

关闭bulk聚合功能

执行以下命令,关闭bulk聚合功能。
PUT _cluster/settings
{
   "transient" : {
      "apack.fasterbulk.combine.enabled":"false"
   }
}