aliyun-codec插件是阿里云Elasticsearch团队自主开发的索引压缩插件。使用该插件,您可以对Elasticsearch底层多种索引文件进行压缩,同时该插件支持source_reuse_doc_values特性,大幅度降低整体索引的大小。本文介绍如何使用aliyun-codec插件。

背景信息

aliyun-codec插件支持多种压缩算法,同时支持source_reuse_doc_values特性,适用于写入量大、索引存储成本高的场景,例如日志场景、时序分析场景等,可以大幅降低索引的存储成本。本文介绍如何使用aliyun-codec插件,包括:
aliyun-codec插件的性能测试信息如下:
  • 测试环境
    • 数据集:使用阿里云Elasticsearch线上主日志。
    • 数据大小:单个index,索引大小为1.2 TB,22个shard。
    • 索引配置:开启行存(source)、列存(docvalue)和倒排(postings)压缩,都使用zstd压缩算法。
  • 测试结果
    • 使用aliyun-codec插件,开启索引压缩后,与未使用该插件的集群相比:
      • 写入速率:不变。
      • 索引整体大小:降低了40%。
      • 查询延迟:降低了50%。
    • 使用aliyun-codec插件,开启索引压缩和source_reuse_doc_values特性后会降低存储成本。与未使用该插件的集群相比:
      • 写入速率:不变。
      • 索引整体大小:最多可降低40%。降低百分比与索引中开启source_reuse_doc_values特性的字段的比例相关。
      • 查询延迟:与索引中开启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压缩算法。
    • zstd_dict:对行存(source)文件使用zstd压缩算法,附带了dict功能,会比zstd压缩率更高,但是读写性能会差一些。
    • best_compression:对行存(source)文件使用原生Elasticsearch对应的source压缩算法。
    • default:对行存(source)文件使用原生Elasticsearch对应的source压缩算法。

使用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特性配置

开启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