配置日志数据流
使用这些概念和设置来优化日志数据流。
如果您拥有所需的订阅,logsdb 索引模式将使用合成 _source,它不会存储原始的 _source 字段。相反,文档源在检索文档时从文档值 (doc values) 或存储字段中合成。
如果您没有所需的订阅,logsdb 模式将使用原始的 _source 字段。
在使用合成 _source 之前,请务必查看限制。
处理多值字段时,index.mapping.synthetic_source_keep 设置控制如何保留字段值以进行合成 _source 重建。在 logsdb 中,默认值为 arrays,它保留重复值和条目顺序。但是,数组元素和对象的精确结构不一定被保留。对于某些日志字段,例如 DNS A 记录、HTTP 标头和表示顺序或重复事件的日志条目,保留重复项和顺序可能至关重要。
在 logsdb 索引模式中,索引默认按 host.name 和 @timestamp 字段排序。
如果
@timestamp字段不存在,它会被自动注入。如果
host.name字段不存在,如果可能,它会被自动注入为keyword字段。- 如果无法注入
host.name(例如,host是一个关键字字段)或无法用于排序(例如,其值为 IP 地址),则仅使用@timestamp进行排序。 - 如果注入了
host.name且subobjects设置为true(默认值),则host字段被映射为名为host的对象字段,并带有类型为keyword的name子字段。如果subobjects设置为false,则单个host.name字段被映射为keyword字段。
- 如果无法注入
为了优先显示最新数据,
host.name按升序排序,@timestamp按降序排序。
您可以通过手动配置 index.sort.field 和 index.sort.order 来覆盖默认的排序设置。有关更多详细信息,请参阅索引排序设置。
要修改现有数据流的排序配置,请更新数据流的组件模板,然后执行或等待滚动 (rollover)。
如果您应用自定义排序设置,@timestamp 字段会被注入到映射中,但不会自动添加到排序字段列表中。为获得最佳效果,请将其手动添加为最后一个排序字段,并使用 desc 排序。
如果您要在现有数据流上启用 logsdb 索引模式,请务必检查映射和排序。如果 host.name 包含在排序设置中,logsdb 模式会自动将其映射为关键字。如果 host.name 字段已存在但类型不同,可能会发生映射错误,从而导致无法完全应用 logsdb 模式。
为避免映射冲突,请考虑以下选项
- 调整映射: 检查您现有的映射,确保
host.name被映射为关键字。 - 更改排序: 如果需要,您可以从排序设置中移除
host.name,并使用一组不同的字段。按@timestamp排序是一个不错的备选方案。 - 切换到不同的索引模式:如果解决
host.name映射冲突不可行,您可以选择不使用 logsdb 模式。
在现有数据流上,logsdb 模式会在滚动 (rollover)(自动或手动)时应用。
如果您拥有所需的订阅,您可以启用路由优化以减少 logsdb 索引的存储占用。路由优化使用排序配置中的字段(除 @timestamp 外)将文档路由到分片。
在基准测试中,与默认的 logsdb 配置相比,路由优化减少了 20% 的存储需求,而对摄取性能的影响微乎其微 (1-4%)。路由优化有利于预计会随时间大幅增长的数据流。确切结果取决于排序配置和日志数据的性质。
要配置路由优化
- 在数据流配置中包含索引设置
index.logsdb.route_on_sort_fields:true。 - 配置索引排序,除了
@timestamp之外,至少包含两个字段。 - 确保已摄入文档中的
_id字段未被填充。它应该改为自动生成。
需要自定义排序配置,以提高存储效率并最大限度地减少因日志高峰可能将文档路由到单个分片而导致的热点。为获得最佳效果,请使用一些基数相对较低且不共变的排序字段(例如,host.name 和 host.id 不是最佳选择)。
默认情况下,logsdb 索引模式使用 best_compression 编解码器,它将 ZSTD 压缩应用于存储的字段。您可以切换到 default 编解码器以实现更快的压缩,但存储占用会略有增加。
logsdb 索引模式还会自动应用用于数值文档值的专用编解码器,以优化存储使用。数值字段使用以下编码器序列进行编码
- 增量编码 (Delta encoding):存储连续值之间的差值,而不是实际值。
- 偏移编码 (Offset encoding):存储相对于基值的差值,而不是连续值之间的差值。
- 最大公约数 (GCD) 编码:找到一组值的最大公约数,并将差值存储为 GCD 的倍数。
- 参考帧 (FOR) 编码:确定编码值块所需的最小位数,并使用位打包 (bit-packing) 将这些值放入更大的 64 位块中。
每种编码都根据数据分布确定的启发式方法进行评估。例如,算法会检查数据是否单调递增或递减。如果是,则应用增量编码;否则,该过程将继续使用下一种编码方法(偏移)。
编码特定于每个 Lucene 段,并在段合并时重新应用。合并后的 Lucene 段可能会使用与原始段不同的编码,具体取决于合并数据的特征。
对于关键字字段,会对序号应用游程编码 (RLE),这些序号代表 Lucene 段级关键字字典中的位置。当多个连续文档共享相同的关键字时,会使用这种压缩方式。
logsdb 索引模式使用以下 ignore 设置。您可以根据需要覆盖这些设置。
默认情况下,logsdb 索引模式将 ignore_malformed 设置为 true。使用此设置,格式错误的字段的文档可以在不导致摄取失败的情况下被索引。
在 logsdb 索引模式中,index.mapping.ignore_above 设置默认在索引级别应用,以确保大关键字字段的高效存储和索引。这适用于关键字类型族的所有成员(keyword、constant_keyword 和 wildcard)。索引级别的 ignore_above 默认值为 8191 字符。使用 UTF-8 编码时,根据字符编码的不同,这会导致 32764 字节的限制。
映射级别的 ignore_above 设置具有优先权。如果特定字段在其映射中定义了 ignore_above 值,则该值会覆盖索引级别的 index.mapping.ignore_above 值。这种默认行为有助于通过防止索引过大的字符串值来优化索引性能。
如果您需要自定义限制,可以在映射级别覆盖它或更改索引级别的默认值。
在 logsdb 索引模式中,index.mapping.total_fields.ignore_dynamic_beyond_limit 设置默认设为 true。此设置允许在静态定义的字段之上添加动态映射的字段,即使字段总数超过 index.mapping.total_fields.limit 也是如此。系统不会触发索引失败,而是忽略额外的动态映射字段,以便摄取可以继续。
自动注入时,host.name 和 @timestamp 会计入映射字段的限制。如果 host.name 映射时设置了 subobjects: true,它有两个字段。当设置 subobjects: false 映射时,host.name 只有一个字段。
当 logsdb 索引模式使用合成 _source 且映射中字段的 doc_values 被关闭时,Elasticsearch 可能会将该字段的 store 设置设为 true。这确保了在使用合成源重建文档源时,该字段的数据仍然可访问。
例如,当 store 为 false 且没有可用于重建原始值的合适多字段时,文本字段就会出现这种调整。
默认情况下,日志数据流使用以下设置
index.mode:"logsdb"index.mapping.synthetic_source_keep:"arrays"index.sort.field:["host.name", "@timestamp"]index.sort.order:["asc", "desc"]index.sort.mode:["min", "min"]index.sort.missing:["_first", "_first"]index.codec:"best_compression"index.mapping.ignore_malformed:trueindex.mapping.ignore_above:8191index.mapping.total_fields.ignore_dynamic_beyond_limit:true