Elasticsearch 索引比它索引的日志的实际大小大得多?

Elasticsearch index much larger than the actual size of the logs it indexed?

我注意到 elasticsearch 一晚上消耗了超过 30GB 的磁盘 space。相比之下,我想要索引的所有日志的总大小只有 5 GB...好吧,甚至不是那么多,可能更像是 2.5-3GB。这有什么原因吗?有没有办法重新配置它?我是 运行 ELK 堆栈。

Elasticsearch 内部的数据比源数据大得多的原因有很多。一般而言,Logstash 和 Lucene 都致力于为相对非结构化的数据添加 结构。这会带来一些开销。

如果您使用的是 3 GB 的源,而您的索引数据是 30 GB,那么这大约是源数据的 10 倍。那很大,但不一定闻所未闻。如果您在该测量中包括副本的大小,那么 30 GB 可能是完全合理的。根据我自己的经验和直觉,我可能期望相对于源数据在 3-5 倍范围内,具体取决于数据类型以及您在 Elasticsearch 中使用的存储和分析设置。

这里有四种不同的设置,您可以在尝试精简 Elasticsearch 索引时进行试验。

_source 字段

Elasticsearch 保留每个传入文档的原始 JSON 副本。如果您想要重建索引的原始内容,或者在搜索结果中突出显示匹配项,这将非常有用,但它肯定会加起来。您可能想要创建一个索引模板,它会禁用索引映射中的 _source 字段。

禁用 _source 字段可能是磁盘使用率的最大改进。

文档:Elasticsearch _source field

单个存储字段

_source 字段类似但不同的是,您可以控制是否在每个字段的基础上存储字段的值。非常简单,并且在核心类型的映射文档中多次提到。

如果您想要一个非常小的索引,那么您应该只存储您需要在搜索响应中返回的最少字段。这可能只是与主数据存储关联的文档 ID。

文档:Elasticsearch mappings for core types

_all 字段

有时您想要查找与给定术语匹配的文档,而您并不真正关心该术语出现在哪个字段中。对于这种情况,Elasticsearch 有一个特殊的 _all 字段,它将推入该字段您文档中所有字段中的所有术语。

这很方便,但如果您的搜索非常有针对性地针对特定字段,并且您不想在索引中的任何位置松散匹配 anything/everything,那么您可以不用 _all字段。

文档:Elasticsearch _all field

一般分析

这又回到了 Lucene 向非结构化数据添加结构的主题。您打算搜索的任何字段都需要进行分析。这是将一团非结构化文本分解为 标记, 并分析每个标记以将其规范化或将其扩展为多种形式的过程。这些标记被插入到字典中,并且术语和它们出现的文档(和字段)之间的映射也被维护。

这都需要space,有些字段,你可能懒得去分析。跳过分析还在索引时节省了一些 CPU 时间。某些类型的分析确实会使您的总术语膨胀,例如使用具有自由设置的 n-gram 分析器,它将您的原始术语分解为许多较小的术语。

文档:Introduction to Analysis and Analyzers

多读书

正如前面的评论者详细解释的那样,索引到 Elasticsearch 后日志数据的大小可能会增加的原因有很多。他链接到的博客 post 现在已经死了,因为我删除了我的个人博客,但它现在存在于 elastic.co 网站上:https://www.elastic.co/blog/elasticsearch-storage-the-true-story.