Elasticsearch数据流(Data Streams)全面解析
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
什么是数据流?
数据流(Data Stream)是Elasticsearch中一种专门用于处理时序数据的抽象概念,它允许用户将只追加(append-only)的时序数据存储在多个索引中,同时对外提供单一命名资源进行访问。数据流特别适合存储日志、事件、指标等持续生成的数据。
与传统索引管理方式相比,数据流具有以下核心优势:
- 自动路由:索引和搜索请求可以直接发送到数据流,系统会自动将请求路由到存储数据的底层索引
- 生命周期管理:可以与索引生命周期管理(ILM)无缝集成,自动管理底层索引
- 简化操作:提供统一的入口点,无需手动管理各个底层索引
何时应该使用数据流?
判断是否应该使用数据流,需要考虑数据格式和预期交互方式。适合使用数据流的场景通常符合以下特征:
- 时间序列特性:数据包含时间戳字段(或可自动生成)
- 写入模式:主要是索引操作,偶尔有更新和删除
- ID处理:索引文档时不指定
_id
,或者指定_id
时采用"首次写入获胜"策略
对于大多数时序数据用例,数据流都是理想选择。但如果需要频繁使用相同_id
更新文档(采用"最后写入获胜"策略),则可能需要考虑使用带有写入索引的索引别名。
数据流核心架构
底层索引(Backing Indices)
数据流由一个或多个自动生成的隐藏索引组成,这些索引被称为"底层索引"。每个数据流都需要一个匹配的索引模板,该模板包含用于配置底层索引的映射和设置。
关键特性:
- 每个索引到数据流的文档必须包含
@timestamp
字段 - 同一模板可用于多个数据流
- 底层索引名称遵循特定命名约定,但不应从中推导业务逻辑
读写机制
读取请求:当向数据流发送读取请求时,请求会被路由到所有底层索引。
写入索引:最新创建的底层索引作为数据流的写入索引,所有新文档都只添加到该索引中。不能向其他底层索引添加新文档,也不能对写入索引执行可能阻碍索引的操作(如克隆、删除、收缩或拆分)。
数据流生命周期管理
滚动更新(Rollover)
滚动更新会创建一个新的底层索引,该索引将成为数据流的新写入索引。推荐使用ILM(索引生命周期管理)在写入索引达到指定大小或年龄时自动滚动数据流。
代次(Generation)
每个数据流都会跟踪其代次信息(从000001
开始的6位零填充整数)。底层索引的命名遵循以下约定:
.ds-<数据流名称>-<yyyy.MM.dd>-<代次>
其中<yyyy.MM.dd>
是底层索引的创建日期。代次较高的索引包含较新的数据。需要注意的是,某些操作(如收缩或恢复)可能会更改底层索引名称,但不会将其从数据流中移除。
数据流使用限制
数据流主要针对很少更新现有数据的用例设计:
- 更新限制:不能直接向数据流发送更新或删除现有文档的请求
- 替代方案:可以通过直接向文档所在的底层索引发送请求来更新或删除文档
- 批量操作:可以使用"按查询更新"和"按查询删除"API来修改大量文档
如果应用场景需要频繁更新具有相同_id
的文档,建议考虑使用带有写入索引的索引别名方案。
最佳实践建议
- 时间戳字段:确保所有文档都包含有效的
@timestamp
字段 - 索引模板:预先设计好匹配的索引模板,包含必要的映射和设置
- 生命周期策略:结合ILM策略自动管理底层索引的生命周期
- 写入模式:避免频繁更新操作,遵循"首次写入获胜"原则
- 监控代次:了解数据流代次变化,但不依赖底层索引名称进行业务逻辑判断
通过合理使用数据流功能,可以显著简化时序数据的管理工作,提高系统可靠性和运维效率。
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考