索引编解码器
索引编解码器决定了索引的存储字段如何在磁盘上压缩和存储。索引编解码器由静态 index.codec
设置控制,该设置指定了压缩算法。此设置会影响索引分片大小和索引操作性能。
支持的编解码器
OpenSearch 支持四种可用于压缩存储字段的编解码器。每种编解码器在压缩比(存储大小)和索引性能(速度)之间提供了不同的权衡。
default
– 此编解码器采用带有预设字典的 LZ4 算法,优先考虑性能而非压缩比。与best_compression
相比,它提供更快的索引和搜索操作,但可能导致更大的索引/分片大小。如果在索引设置中未提供编解码器,则 LZ4 将用作默认压缩算法。best_compression
– 此编解码器使用 zlib 作为底层压缩算法。它实现了高压缩比,从而减小了索引大小。但是,这可能会在索引操作期间产生额外的 CPU 使用,并可能随后导致高索引和搜索延迟。
自 OpenSearch 2.9 起,提供了两种基于 Zstandard 压缩算法的新编解码器。该算法在压缩比和速度之间提供了良好的平衡。
更改现有索引的编解码器设置可能具有挑战性(请参阅 更改索引编解码器),因此在新编解码器设置投入使用之前,务必在非生产环境中测试代表性工作负载。
zstd
(OpenSearch 2.9 及更高版本) – 此编解码器提供与best_compression
编解码器相当的显著压缩,同时 CPU 使用率合理,并且与default
编解码器相比,索引和搜索性能有所提升。zstd_no_dict
(OpenSearch 2.9 及更高版本) – 此编解码器类似于zstd
,但排除了字典压缩功能。与zstd
相比,它提供更快的索引和搜索操作,但代价是索引大小略大。
自 OpenSearch 2.10 起,`zstd` 和 `zstd_no_dict` 压缩编解码器不能用于 k-NN 或 安全分析 索引。
对于 `zstd` 和 `zstd_no_dict` 编解码器,您可以在 `index.codec.compression_level` 设置中选择性地指定压缩级别。此设置接受 [1, 6] 范围内的整数。更高的压缩级别会导致更高的压缩比(更小的存储大小),但会牺牲速度(更慢的压缩和解压缩速度会导致更高的索引和搜索延迟)。
创建索引段时,它使用当前索引编解码器进行压缩。如果您更新索引编解码器,更新后创建的任何段都将使用新的压缩算法。有关具体操作注意事项,请参阅 索引操作的索引编解码器注意事项。
自 OpenSearch 2.15 起,`DEFLATE` 和 `LZ4` 压缩算法的硬件加速编解码器可用。这些硬件加速编解码器在运行 Linux 内核 3.10 及更高版本的最新第四代和第五代 Intel®️ Xeon®️ 处理器上可用。对于所有其他系统和平台,这些编解码器使用该平台相应的软件实现。
可以通过设置以下 index.codec
值之一来使用新的硬件加速编解码器:
qat_lz4
(OpenSearch 2.15 及更高版本):硬件加速LZ4
qat_deflate
(OpenSearch 2.15 及更高版本):硬件加速DEFLATE
qat_deflate
提供了比 qat_lz4
更好的压缩比,同时压缩和解压缩速度略有下降。
index.codec.compression_level
设置可用于指定 qat_lz4
和 qat_deflate
的压缩级别。
index.codec.qatmode
设置控制硬件加速器的行为,并使用以下值之一:
auto
:如果硬件加速失败,则算法切换到软件加速。hardware
:保证仅使用硬件压缩。如果硬件不可用,则会引发异常,直到硬件存在为止。
有关 index.codec.qatmode
设置对快照的影响,请参阅快照部分。
有关 Intel 硬件加速的更多信息,请参阅 Intel (R) QAT 加速器概述。
选择编解码器
索引编解码器的选择会影响存储索引数据所需的磁盘空间量。像 `best_compression`、`zstd` 和 `zstd_no_dict` 这样的编解码器可以实现更高的压缩比,从而减小索引大小。相反,`default` 编解码器不优先考虑压缩比,导致索引大小更大,但搜索操作比 `best_compression` 更快。
索引操作的索引编解码器注意事项
以下索引编解码器注意事项适用于各种索引操作。
写入
每个索引都由分片组成,每个分片又进一步划分为 Lucene 段。在索引写入期间,新段是根据索引设置中指定的编解码器创建的。如果您更新索引的编解码器,新段将使用新的编解码器算法。
合并
在段合并期间,OpenSearch 将较小的索引段合并成较大的段,以优化资源利用并提高性能。索引编解码器设置会影响合并操作的速度和效率。索引上发生的合并次数是段大小的一个因素,更小的段大小直接转化为更小的合并大小。如果您更新 index.codec
设置,新的合并操作在创建合并段时将使用新的编解码器。合并后的段将具有新编解码器的压缩特性。
拆分和收缩
Split API (拆分 API) 将原始索引拆分为新索引,其中每个原始主分片被分成两个或更多主分片。Shrink API (收缩 API) 将现有索引收缩为具有更少主分片的新索引。作为拆分或收缩操作的一部分,任何新创建的段都将使用最新的编解码器设置。
快照
创建快照时,索引编解码器设置会影响快照的大小及其创建所需的时间。如果索引的编解码器已更新,新创建的快照将使用最新的编解码器设置。生成的快照大小将反映最新编解码器设置的压缩特性。快照中包含的现有段将保留其原始压缩特性。
当您将索引从一个集群的快照恢复到另一个集群时,务必验证目标集群是否支持源快照中段的编解码器。例如,如果源快照包含 `zstd` 或 `zstd_no_dict` 编解码器(在 OpenSearch 2.9 中引入)的段,则您将无法将快照恢复到运行旧版 OpenSearch 的集群,因为它不支持这些编解码器。
对于 OpenSearch 2.15 及更高版本中可用的硬件加速压缩编解码器,`index.codec.qatmode` 的值会影响快照和恢复的执行方式。如果值为 `auto`(默认),则快照和恢复可以正常工作。但是,如果值为 `hardware`,则必须将其重置为 `auto`,以便在缺少硬件加速器的系统上成功进行恢复。
您可以在恢复过程中通过如下设置来修改 index.codec.qatmode
的值:"index_settings": {"index.codec.qatmode": "auto"}
。
重新索引
当您从源索引执行重新索引操作时,目标索引中创建的新段将具有目标索引的编解码器设置属性。
索引汇总和转换
当索引汇总或转换作业完成时,目标索引中创建的段将具有目标索引创建期间指定的索引编解码器属性,无论源索引编解码器是什么。如果目标索引是通过汇总作业动态创建的,则目标索引的段将使用默认编解码器。
更改索引编解码器
无法更改开放索引的编解码器设置。您可以关闭索引,应用新的索引编解码器设置,然后重新打开索引,届时只有新段会使用新编解码器写入。这需要短暂停止对索引的所有读写操作以进行编解码器更改,并可能导致段大小和压缩比不一致。或者,您可以将所有数据从源索引重新索引到具有不同编解码器设置的新索引中,但这是一种非常耗费资源的操作。
性能调优和基准测试
根据您的具体用例,您可能需要尝试不同的索引编解码器设置,以微调 OpenSearch 集群的性能。对不同的编解码器进行基准测试,并衡量对索引速度、搜索性能和资源利用率的影响,可以帮助您确定最适合您的工作负载的索引编解码器设置。对于 `zstd` 和 `zstd_no_dict` 编解码器,您还可以微调压缩级别,以确定集群的最佳配置。
基准测试
下表提供了 `best_compression`、`zstd` 和 `zstd_no_dict` 编解码器与 `default` 编解码器之间的性能比较。测试使用 nyc_taxi
数据集进行。结果以百分比变化列出,粗体结果表示性能提升。
best_compression | zstd | zstd_no_dict | |
---|---|---|---|
写入 | |||
中位延迟 | 0% | 0% | −1% |
p90 延迟 | 3% | 2% | −5% |
吞吐量 | −2% | 7% | 14% |
读取 | |||
中位延迟 | 0% | 1% | 0% |
p90 延迟 | 1% | 1% | −2% |
磁盘 | |||
压缩比 | −34% | −35% | −30% |