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,22个shard。开启行存、列存和倒排压缩,均使用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