使用aliyun-codec插件

aliyun-codec插件是阿里云自主开发的索引压缩插件,可以对Elasticsearch(ES)底层多种索引文件进行压缩,同时支持source_reuse_doc_values特性。适用于写入量大、索引存储成本高的场景,例如日志场景、时序分析场景等,可以大幅降低索引的存储成本。

背景信息

aliyun-codec插件支持多种压缩算法,同时支持source_reuse_doc_values特性。本文介绍如何使用aliyun-codec插件,包括:

aliyun-codec插件的性能测试信息如下:

  • 测试环境

    • 数据集:使用阿里云Elasticsearch线上主日志。

    • 数据大小:单个index,索引大小为1.2 TB,22个shard。

    • 索引配置:开启行存(source)、列存(docvalue)和倒排(postings)压缩,都使用zstd压缩算法。

  • 测试结果

    • 使用aliyun-codec插件,开启索引压缩后,与未开启索引压缩特性的集群相比:

      • 写入速率:不变。

      • 索引整体大小:降低了40%。

      • I/O密集型查询场景延迟:降低了50%。

    • 使用aliyun-codec插件,开启source_reuse_doc_values特性后,与未开启该特性的集群相比:

      • 写入速率:不变。

      • 索引整体大小:最多可降低40%。降低百分比与索引中开启source_reuse_doc_values特性的字段的比例相关。

      • I/O密集型查询场景延迟:与索引中开启source_reuse_doc_values特性的字段的比例、节点磁盘类型等因素有关,具体以实际测试为准。

前提条件

  • 创建阿里云Elasticsearch实例,版本为7.10.0。

    具体操作,请参见创建阿里云Elasticsearch实例

  • 根据业务场景,升级实例的内核版本:

    • 如果您仅需要对索引文件进行压缩:将内核版本升级至1.5.0及以上版本。

    • 如果您不仅需要对索引文件进行压缩,还需要使用source_reuse_doc_values特性:将内核版本升级至1.6.0及以上。

    升级内核版本的具体操作请参见升级版本

  • 安装aliyun-codec插件(7.10版本实例默认已安装)。

    您可在插件配置页面查看是否已安装aliyun-codec插件。如果还未安装,请手动进行安装,安装方法请参见安装或卸载系统默认插件

使用限制

  • 仅实例版本为7.10.0,且内核版本为1.5.0及以上的阿里云Elasticsearch实例,支持aliyun-codec插件的索引压缩功能。6.7.0版本实例请使用codec-compression插件,详细信息请参见使用索引压缩插件beta版本(codec-compression)

  • 仅实例版本为7.10.0,且内核版本为1.6.0及以上的阿里云Elasticsearch实例支持source_reuse_doc_values特性,且日志场景化模板(aliyun_default_index_template )默认开启压缩,即"index.codec" : true

使用索引压缩功能

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 7.10.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 单击右上角的Dev tools
  3. Console页签,执行以下脚本,开启索引压缩。

    假设您已创建test索引,可通过如下脚本为该索引开启压缩。

    PUT test/_settings
    {
      "index.codec" : "ali"
    }

    为索引添加以上配置之后,阿里云Elasticsearch默认会对该索引的行存(source)、列存(docvalue)和倒排(postings)三类文件使用zstd算法进行压缩。

    您也可以为某类文件使用指定的压缩算法。以下示例表示对倒排(postings)文件不开启压缩,对行存(source)和列存(docvalue)文件使用zstd算法进行压缩。

    说明

    如果您要关闭某类文件的压缩,可将对应参数配置为"",例如以下示例代码中的"index.postings.compression":""

    PUT test/_settings
    {
      "index.codec":"ali",
      "index.doc_value.compression.default":"zstd",
      "index.postings.compression":"",
      "index.source.compression":"zstd"
    }

    索引配置参数说明如下。

    索引配置参数

    参数取值说明

    index.doc_value.compression.default

    • lz4:对列存(docvalue)文件使用lz4压缩算法。

    • zstd:对列存(docvalue)文件使用zstd压缩算法。

    说明

    该插件目前只对索引中的number类型、date类型、keyword类型和ip类型字段的docvalue文件开启压缩。

    index.postings.compression

    zstd:对倒排(postings)文件使用zstd压缩算法。

    index.source.compression

    • zstd:对行存(source)文件使用zstd压缩算法,压试块大小为128 KB。

    • zstd_1024:对行存(source)文件使用zstd压缩算法,压试块大小为1024 KB。

    • zstd_dict:对行存(source)文件使用zstd压缩算法,附带了dict功能,会比zstd压缩率更高,但是读写性能会差一些。

    • best_compression:对行存(source)文件使用原生Elasticsearch对应的source压缩算法。

    • default:对行存(source)文件使用原生Elasticsearch对应的source压缩算法。

    index.postings.pfor.enabled

    是否开启索引倒排编码优化:

    • true :开启

    • false:不开启

    该功能为原生ES 8.0版本功能,可以节省keyword, match_only_text, text字段14.4%的存储空间,3.5%的整体磁盘空间。被阿里内核应用在低版本阿里云ES上。

使用source_reuse_doc_values特性

开启source_reuse_doc_values特性

执行以下命令,在创建索引时开启source_reuse_doc_values特性。

PUT test
{
  "settings": {
    "index": {
      "ali_codec_service": {
        "source_reuse_doc_values": {
          "enabled": true
        }
      }
    }
  }
}
重要

source_reuse_doc_values特性只能在创建索引时开启,且一旦开启无法关闭。

调整source_reuse_doc_values特性配置

说明

原生Elasticsearch底层会存储多份数据,例如数据会同时存储在_source、倒排索引和doc_values中,source_reuse_doc_values会将_source中存储的相同部分的JSON数据进行裁剪,来降低整体索引的大小。

开启source_reuse_doc_values特性后,您还可以根据业务,调整source_reuse_doc_values特性的相关配置:

  • 调整开启source_reuse_doc_values字段的最大个数。

    当开启source_reuse_doc_values特性的字段个数超过您设置的值,Elasticsearch将抛出异常或自动关闭source_reuse_doc_values特性,默认为50。调整方式如下。

    PUT _cluster/settings
    {
      "persistent": {
           "apack.ali_codec_service.source_reuse_doc_values.max_fields": 100
      }
    }
  • 设置是否强制不能超过您设置的开启source_reuse_doc_values特性的最大字段个数。

    • true:超过您设置的值,Elasticsearch会抛出异常。

    • false:超过您设置的值,Elasticsearch会自动关闭source_reuse_doc_values特性。

    PUT _cluster/settings
    {
      "persistent": {
           "apack.ali_codec_service.source_reuse_doc_values.strict_max_fields": true
      }
    }
  • 调整查询时读取开启了source_reuse_doc_values字段值的并发度。

    在获取原文时,source_reuse_doc_values特性会并发读取文档中开启了source_reuse_doc_values字段的值并进行组装。为了降低耗时,您可以调整系统获取各字段值的并发度。默认并发度为5,您可以通过如下方式调整。

    PUT test/_settings
    {
      "index": {
        "ali_codec_service": {
          "source_reuse_doc_values": {
            "fetch_slice": 2
          }
        }
      }
    }
  • 调整读取开启了source_reuse_doc_values字段值的线程池和队列大小。

    线程池默认大小为节点的核数,队列默认大小为1000。该配置仅能通过修改YML文件调整,修改YML文件的具体操作请参见配置YML参数。您可以在YML文件中添加如下配置进行调整。

    apack.doc_values_fetch:
        size: 8
        queue_size: 1000