映射爆炸
编辑映射爆炸编辑
Elasticsearch 的搜索和 Kibana 的 Discover Javascript 渲染依赖于搜索的后台索引中所有映射深度的 映射字段 总数。当此总数过高或呈指数级增长时,我们将其称为映射爆炸。字段计数如此之高的情况并不常见,通常表明上游文档格式存在问题,如 此博客所示。
映射爆炸可能会表现为以下性能症状
- CAT 节点 报告主节点和/或托管索引分片的节点上的堆或 CPU 使用率很高。这可能会升级为节点暂时无响应和/或主节点过载。
- CAT 任务 报告仅与此索引或索引相关的长时间搜索,即使是简单的搜索也是如此。
- CAT 任务 报告仅与此索引或索引相关的长时间索引。这通常与 待处理任务 报告协调节点正在等待所有其他节点确认它们正在进行映射更新请求有关。
- Discover 的 通配符字段 页面加载 API 命令或 开发工具 页面刷新自动完成 API 命令花费的时间很长(超过 10 秒)或在浏览器的“开发工具网络”选项卡中超时。有关更多信息,请参阅我们关于 Discover 故障排除的演练。
- Discover 的 可用字段 在浏览器的“开发工具性能”选项卡中编译 Javascript 需要很长时间。这可能会升级为浏览器页面暂时无响应。
- Kibana 的 警报 或 安全规则 可能会出现错误
内容长度 (X) 大于允许的最大字符串长度 (Y)
,其中X
是尝试的有效负载,Y
是 Kibana 的server-maxPayload
。 - Elasticsearch 启动时间过长。
预防或准备编辑
映射 一旦初始化就不能减少字段。Elasticsearch 索引默认为 动态映射,这通常不会导致问题,除非它与覆盖 index.mapping.total_fields.limit
结合使用。默认的 1000
限制被认为是慷慨的,尽管根据用例,覆盖到 10000
不会造成明显的影响。但是,举一个不好的例子,覆盖到 100000
并且映射总数达到此限制通常会对性能产生重大影响。
如果您的索引映射字段预计包含大量任意键集,您可以考虑
- 将
index.mapping.total_fields.ignore_dynamic_beyond_limit
设置为true
。这将忽略超过字段限制的动态字段,而不是拒绝超过字段限制的文档。 - 使用 扁平化 数据类型。但是请注意,扁平化对象 在 Kibana 中尚不支持。例如,这可以应用于子映射,如 {
host.name
、host.os
、host.version
}。仍然可以通过 运行时字段 访问所需的字段。 - 禁用 动态映射。这不会影响当前索引映射,但可以通过 索引模板 应用于未来。
修改为 嵌套 数据类型不能解决核心问题。
检查问题编辑
要确认索引的字段总数以检查映射爆炸
- 检查 Elasticsearch 集群日志中是否有错误
索引 [Y] 中的总字段数 [X] 已超出限制
,其中X
是index.mapping.total_fields.limit
的值,Y
是您的索引。相关的摄取源日志错误将是添加新字段 [Z] 时,总字段数 [X] 已超出限制
,其中Z
是尝试添加的新字段。 - 对于顶级字段,轮询 字段功能 以获取
fields=*
。 - 在 获取映射 的输出中搜索
"type"
。 -
如果您倾向于使用 第三方工具 JQ,则可以处理 获取映射
mapping.json
输出。$ cat mapping.json | jq -c 'to_entries[]| .key as $index| [.value.mappings| to_entries[]|select(.key=="properties") | {(.key):([.value|..|.type?|select(.!=null)]|length)}]| map(to_entries)| flatten| from_entries| ([to_entries[].value]|add)| {index: $index, field_count: .}'
您可以使用 分析索引磁盘使用情况 来查找从未填充或很少填充的字段,从而轻松获胜。
复杂爆炸编辑
映射爆炸还涵盖单个索引字段总数在限制范围内,但组合索引字段总数非常高的情况。症状首先在 数据视图 上被注意到,并通过 解析索引 API 追溯到单个索引或索引子集,这是非常常见的。
但是,尽管不太常见,但仅在后台索引的组合上才可能遇到映射爆炸。例如,如果 数据流 的后台索引都处于字段总数限制,但每个索引都包含彼此不同的唯一字段。
这种情况最容易通过添加 数据视图 并检查其 字段 选项卡以获取其总字段数来发现。此统计信息确实告诉您所有字段,而不仅仅是 index:true
的位置,但可以作为良好的基线。
如果您的问题仅通过 数据视图 出现,如果您没有使用 多字段,则可以考虑使用此菜单的 字段过滤器。或者,您可以考虑使用更有针对性的索引模式或使用否定模式来过滤掉有问题的索引。例如,如果 logs-*
由于有问题的后台索引 logs-lotsOfFields-*
而导致字段计数过高,则可以更新为 logs-*,-logs-lotsOfFields-*
或 logs-iMeantThisAnyway-*
。
解决编辑
映射爆炸不容易解决,因此最好通过上述方法来预防。遇到它通常表明上游数据发生了意外变化或计划失败。如果遇到这种情况,我们建议您检查您的数据架构。以下选项是对本页前面讨论的选项的补充;它们应该根据最佳用例适用
拆分索引 不能解决核心问题。