调整磁盘使用
edit调整磁盘使用
edit禁用您不需要的功能
edit默认情况下,Elasticsearch 会对大多数字段进行索引并添加 doc 值,以便它们可以开箱即用地进行搜索和聚合。例如,如果你有一个名为 foo
的数值字段,你需要对其运行直方图,但不需要对其进行过滤,你可以在你的 映射中安全地禁用此字段的索引:
PUT index { "mappings": { "properties": { "foo": { "type": "integer", "index": false } } } }
text
字段在索引中存储归一化因子以促进文档评分。如果你只需要在一个 text
字段上进行匹配能力,但并不关心生成的评分,你可以使用 match_only_text
类型来代替。这种字段类型通过丢弃评分和位置信息来节省大量空间。
不要使用默认的动态字符串映射
edit默认的 动态字符串映射 会将字符串字段同时索引为 text
和 keyword
。如果你只需要其中之一,这会造成浪费。通常,一个 id
字段只需要被索引为 keyword
,而一个 body
字段只需要被索引为 text
字段。
这可以通过在字符串字段上配置显式映射或设置动态模板来禁用,动态模板将字符串字段映射为text
或keyword
。
例如,这里是一个模板,可以用于仅将字符串字段映射为keyword
:
PUT index { "mappings": { "dynamic_templates": [ { "strings": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ] } }
监控你的分片大小
edit较大的分片在存储数据时会更高效。要增加分片的大小,您可以通过创建索引时减少主分片的数量,创建更少的索引(例如,通过利用Rollover API),或者使用Shrink API修改现有索引。
请记住,较大的分片大小会带来缺点,例如较长的完全恢复时间。
禁用 _source
editThe _source
字段存储文档的原始 JSON 正文。如果你不需要访问它,可以禁用它。然而,需要访问 _source
的 API,例如更新、高亮和重新索引,将无法工作。
使用 best_compression
editThe _source
和存储字段可以轻松占用不可忽略的磁盘空间。通过使用 best_compression
codec,可以更积极地压缩它们。
强制合并
editElasticsearch中的索引存储在一个或多个分片中。每个分片是一个Lucene索引,由一个或多个段组成——这些段是磁盘上的实际文件。较大的段在存储数据时更高效。
可以使用强制合并 API来减少每个分片的段数量。在许多情况下,通过设置max_num_segments=1
,可以将每个分片的段数量减少到一个。
我们建议仅对只读索引(意味着该索引不再接收写入)进行强制合并。 当文档被更新或删除时,旧版本不会立即被移除,而是被软删除并标记为“墓碑”。这些软删除的文档会在常规段合并期间自动清理。但强制合并可能会产生非常大的(> 5GB)段,这些段不符合常规合并的条件。因此,软删除文档的数量可能会迅速增加,导致磁盘使用率更高和搜索性能更差。如果您定期对正在接收写入的索引进行强制合并,这也可能使快照成本更高,因为新文档无法增量备份。
收缩索引
editThe shrink API 允许你减少索引中的分片数量。与上面的强制合并 API 一起,这可以显著减少索引的分片和段的数量。
使用足够小的数值类型
edit您为数值数据选择的类型会对磁盘使用产生重大影响。特别是,整数应使用整数类型存储(byte
、short
、integer
或 long
),而浮点数应根据情况存储在 scaled_float
中,或者存储在适合使用场景的最小类型中:使用 float
而不是 double
,或者使用 half_float
而不是 float
将有助于节省存储空间。
使用索引排序来归类相似文档
edit当 Elasticsearch 存储 _source
时,它会一次性压缩多个文档,以提高整体压缩率。例如,文档共享相同的字段名称非常常见,而且它们共享一些字段值也很常见,特别是在具有低基数或 zipfian 分布的字段上。
默认情况下,文档按照它们被添加到索引中的顺序进行压缩。如果你启用了索引排序,那么它们将按照排序后的顺序进行压缩。将具有相似结构、字段和值的文档排序在一起应该会提高压缩比。
在文档中将字段按相同顺序排列
edit由于多个文档被压缩在一起形成块,如果字段总是以相同的顺序出现,那么在那些_source
文档中找到更长的重复字符串的可能性更大。
汇总历史数据
edit保留旧数据对于后续分析可能很有用,但由于存储成本,通常会避免这样做。您可以使用下采样来汇总并以原始数据存储成本的一小部分存储历史数据。请参阅对时间序列数据流进行下采样。