使用aliyun-codec插件

更新时间:
复制为 MD 格式

aliyun-codec插件是阿里云自主开发的索引压缩插件,支持对Elasticsearch底层的行存(source)、列存(docvalue)和倒排(postings)文件进行压缩,同时支持source_reuse_doc_values特性。适用于写入量大、索引存储成本高的场景,例如日志场景、时序分析场景等。

使用须知

  • 使用前需先安装插件,请参见安装或卸载系统默认插件

  • aliyun-codec插件仅支持7.10.0版本实例。

  • 索引压缩功能需内核版本 1.5.0 及以上,source_reuse_doc_values 特性需内核版本 1.6.0 及以上。如当前版本不满足要求,请先完成内核升级

性能参考

以下为aliyun-codec插件在特定测试环境下的性能数据,供评估参考。

测试环境:单个index,索引大小1.2 TB,22shard。开启行存、列存和倒排压缩,均使用zstd压缩算法。数据集为阿里云Elasticsearch线上主日志。

索引压缩:与未开启索引压缩的集群相比:

  • 写入速率:不变。

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

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

source_reuse_doc_values:与未开启该特性的集群相比:

  • 写入速率:不变。

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

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

使用索引压缩功能

index.codec为非动态设置,修改前需先关闭索引,修改后重新打开索引。

假设已创建test索引,执行以下命令为该索引开启压缩:

POST test/_close

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

POST test/_open

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

也可以为某类文件使用指定的压缩算法。以下示例对倒排文件不开启压缩,对行存和列存文件使用zstd算法进行压缩。要关闭某类文件的压缩,可将对应参数配置为""

POST test/_close

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

POST test/_open

索引配置参数说明如下。

索引配置参数

参数取值说明

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%的整体磁盘空间。

使用source_reuse_doc_values特性

Elasticsearch底层会在_source、倒排索引和doc_values中存储多份数据。source_reuse_doc_values特性会将_source中与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特性的字段个数超过设定值,Elasticsearch将抛出异常或自动关闭source_reuse_doc_values特性,默认为50。

PUT _cluster/settings
{
  "persistent": {
       "apack.ali_codec_service.source_reuse_doc_values.max_fields": 100
  }
}

设置是否强制限制最大字段个数

  • 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特性会并发读取文档中开启了该特性的字段值并进行组装。默认并发度为5。

PUT test/_settings
{
  "index": {
    "ali_codec_service": {
      "source_reuse_doc_values": {
        "fetch_slice": 2
      }
    }
  }
}

调整线程池和队列大小

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

apack.doc_values_fetch:
size: 8
queue_size: 1000