更新时间:2024-09-14 GMT+08:00

增强Elasticsearch集群数据导入性能

特性介绍

数据导入性能增强为云搜索服务自主研发的特性,通过优化Bulk路由、文本索引加速、分词加速等方式,有效提升导入性能以及降低写入拒绝的情况。适用于索引分片较多、文本索引量大、导入吞吐量高的场景。

表1 数据导入性能优化方式

优化方式

功能描述

相关文档

Bulk路由优化

根据Elasticsearch默认的路由规则,Bulk请求中的每一条数据会被路由到不同的shard,当索引分片较多时,会产生大量的内部转发请求,在大规模写入场景下容易触发写拒绝。同时,在大规模集群中,长尾效应会导致Bulk请求时延较高。

通过指定配置项“index.bulk_routing”可以开启集群的Bulk路由优化,该优化可以减少内部转发的请求数量,在shard数较多的场景下,能够有效提升写入性能以及减少写入拒绝。
说明:

开启Bulk路由优化后(即“index.bulk_routing”设置为“pack”“ocal_pack”),数据写入不再根据“_id”进行路由,与路由的相关功能使用会受限,例如根据“_id”进行文档GET请求可能失败。

Bulk路由优化

Bulk聚合优化

通过指定配置项“index.aggr_perf_batch_size”可以开启集群的Bulk聚合优化。Bulk聚合优化是通过批量导入将Bulk请求中的doc从单个依次写入变为批量写入,该方案可以有效减少内存申请、锁申请、及其他调用开销,从而提升数据导入性能。

Bulk聚合优化

文本索引加速

通过指定配置项“index.native_speed_up”可以开启文本索引加速。索引加速功能通过优化索引流程以及内存使用等方式实现,对于文本字段(text、keyword)能够极大提升索引构建的性能。当开启文本索引加速时,支持通过指定配置项“index.native_analyzer”同时开启分词加速。对于需要分词的文本字段(text),当无特殊分词需求时可以开启分词加速提升分词性能。
说明:
  • 仅当开启文本索引加速(即“index.native_speed_up”设置为“true”)时,才支持开启分词加速(即“index.native_analyzer”设置为“true”),否则分词加速不生效。
  • 包含“nested”字段的索引不支持开启文本索引加速。

文本索引加速

索引merge任务优化

开启以上三种数据导入性能优化后,集群的索引merge任务会增加,通过指定配置项“index.merge.scheduler.max_thread_count”可以降低索引merge任务开销对导入性能的影响。索引merge任务优化可以增加shard的合并线程数,减少合并对数据导入的限流。

索引merge任务优化

约束限制

仅Elasticsearch 7.10.2集群和OpenSearch 1.3.6集群支持数据导入性能增强。

前提条件

待增强数据导入性能的集群处于“可用”状态。

Bulk路由优化

通过指定配置项“index.bulk_routing”可以开启集群的Bulk路由优化,该优化可以减少内部转发的请求数量,在shard数较多的场景下,能够有效提升写入性能以及减少写入拒绝。

开启Bulk路由优化后(即“index.bulk_routing”设置为“pack”“ocal_pack”),数据写入不再根据“_id”进行路由,与路由的相关功能使用会受限,例如根据“_id”进行文档GET请求可能失败。

  1. “集群管理”页面,选择可用的集群,单击操作列“Kibana”,登录Kibana界面。
  2. 在Kibana左侧导航栏,选择“Dev Tools”
  3. “Dev Tools”页面,执行如下命令开启Bulk路由优化。
    PUT my_index 
    {
      "settings": { 
        "index.bulk_routing": "local_pack"
      } 
    }
    配置项“index.bulk_routing”的取值范围如下所示。
    • “default”:缺省值,使用集群默认的路由机制,Bulk请求中的每一条记录会拆分后独立路由。
    • “pack”:单个Bulk请求的数据会被随机路由到同一个shard中。
    • “ocal_pack”:单个Bulk请求的数据会被路由到接收该Bulk请求的数据节点的本地shard中,如果该节点不包含对应index的shard,则会进行随机路由到其他包含该索引shard节点上。该方案依赖客户端Bulk请求的随机打散和主shard的均衡分布。

Bulk聚合优化

通过指定配置项“index.aggr_perf_batch_size”可以开启集群的Bulk聚合优化。Bulk聚合优化是通过批量导入将Bulk请求中的doc从单个依次写入变为批量写入,该方案可以有效减少内存申请、锁申请、及其他调用开销,从而提升数据导入性能。

  1. “集群管理”页面,选择可用的集群,单击操作列“Kibana”,登录Kibana界面。
  2. 在Kibana左侧导航栏,选择“Dev Tools”
  3. “Dev Tools”页面,执行如下命令开启Bulk聚合优化。
    PUT my_index 
    {
      "settings": { 
        "index.aggr_perf_batch_size": "128"
      } 
    }

    配置项“index.aggr_perf_batch_size”的取值范围为[1, Integer.MAX_VALUE]。缺省值为1,表示关闭Bulk聚合优化。当取值大于1时,表示打开Bulk聚合优化且批量取值为MIN(bulk_doc_size, aggr_perf_batch_size)。

文本索引加速

通过指定配置项“index.native_speed_up”可以开启文本索引加速。索引加速功能通过优化索引流程以及内存使用等方式实现,对于文本字段(text、keyword)能够极大提升索引构建的性能。当开启文本索引加速时,支持通过指定配置项“index.native_analyzer”同时开启分词加速。对于需要分词的文本字段(text),当无特殊分词需求时可以开启分词加速提升分词性能。
  • 仅当开启文本索引加速(即“index.native_speed_up”设置为“true”)时,才支持开启分词加速(即“index.native_analyzer”设置为“true”),否则分词加速不生效。
  • 包含“nested”字段的索引不支持开启文本索引加速。
  1. “集群管理”页面,选择可用的集群,单击操作列“Kibana”,登录Kibana界面。
  2. 在Kibana左侧导航栏,选择“Dev Tools”
  3. “Dev Tools”页面,执行如下命令开启文本索引加速。
    PUT my_index 
    {
      "settings": {
        "index.native_speed_up": true,
        "index.native_analyzer": true
      }
    }

    配置项“index.native_speed_up”“index.native_analyzer”的取值范围是true和fales,缺省值是fales。

索引merge任务优化

开启以上三种数据导入性能优化后,集群的索引merge任务会增加,通过指定配置项“index.merge.scheduler.max_thread_count”可以降低索引merge任务开销对导入性能的影响。索引merge任务优化可以增加shard的合并线程数,减少合并对数据导入的限流。

  1. “集群管理”页面,选择可用的集群,单击操作列“Kibana”,登录Kibana界面。
  2. 在Kibana左侧导航栏,选择“Dev Tools”
  3. “Dev Tools”页面,执行如下命令启动索引merge任务优化。
    PUT my_index 
    {
      "settings": {
        "index.merge.scheduler.max_thread_count": 8
      }
    }

    配置项“index.merge.scheduler.max_thread_count”的取值范围是[1, node.processors/2],缺省值是4,建议设置为8。