背景
在现代数据驱动的世界中,时序数据的处理变得越来越重要。无论是监控系统、日志分析,还是物联网设备的数据收集,时序数据都占据了大量的存储空间。随着时间的推移,这些数据的存储成本和管理复杂度也在不断增加。
为了解决这一问题,Rollup 技术应运而生。本文将带你深入了解 Rollup 的概念、优势以及如何在 Easysearch 中使用 Rollup 来优化时序数据的存储和查询。
什么是 Rollup?
Rollup 是一种数据聚合技术,主要用于处理时序数据。它通过将细粒度的原始数据汇总为粗粒度的数据,从而减少存储空间并提高查询效率。简单来说,Rollup 可以将大量的详细数据压缩为更小的、更具代表性的数据集,同时保留关键的业务指标。
Rollup 的优势
- 降低存储成本:通过汇总数据,Rollup 可以显著减少历史数据的存储空间,从而降低存储成本。
- 提高查询性能:汇总后的数据量更小,查询速度更快,尤其是在处理大规模历史数据时,性能提升尤为明显。
- 无缝集成:Easysearch 的 Rollup 功能支持直接查询原始索引,业务代码无需修改,用户无感知。
- 自动化管理:Rollup 任务可以自动滚动生成新的索引,无需手动干预,简化了数据管理流程。
Rollup 的使用场景
Rollup 特别适用于以下场景:
- 监控系统:监控系统产生的指标数据通常非常详细,但随着时间推移,这些数据的价值逐渐降低。通过 Rollup,可以将这些数据汇总为更粗粒度的指标,保留关键信息的同时减少存储压力。
- 日志分析:日志数据通常包含大量的细节信息,但随着时间的推移,这些细节信息的重要性逐渐降低。Rollup 可以帮助你将日志数据汇总为更高层次的统计信息,便于长期存储和分析。
- 物联网数据:物联网设备产生的数据量巨大,且大部分数据在短期内具有较高的分析价值。通过 Rollup,可以将这些数据汇总为更粗粒度的形式,便于长期存储和查询。
使用 Rollup 的先决条件
在使用 Rollup 之前,需要满足以下条件:
安装索引生命周期管理插件:Rollup 功能是索引生命周期管理插件的一部分,因此必须安装该插件。
源索引必须包含 date 类型字段:Rollup 依赖于时间字段来进行数据聚合,因此源索引必须包含一个 date 类型的字段。
Easysearch 中的 Rollup 功能
Easysearch 提供了强大的 Rollup 功能,支持多种聚合类型,并且可以自动滚动生成新的索引。下面我们将详细介绍如何在 Easysearch 中使用 Rollup。
支持的聚合类型
Easysearch 的 Rollup 功能支持以下聚合类型:
- 数值类型字段:
avg
、sum
、max
、min
、value_count
、percentiles
- keyword 类型字段:
terms
聚合 - date 类型字段:
date_histogram
和date_range
聚合
Rollup 的核心参数详解
在配置 Rollup 任务时,以下几个参数至关重要:
1. metrics
参数:定义需要聚合的数值字段
metrics
参数用于指定哪些数值字段需要进行聚合计算。Rollup 任务会对这些字段进行指定的聚合操作(如 avg
、sum
、max
、min
、value_count
、percentiles
),并将结果存储到目标索引中。
示例:
"metrics": [
"payload.elasticsearch.index_stats.*"
]
在这个例子中,metrics
指定了对 payload.elasticsearch.index_stats
下的所有字段进行聚合。
2. attributes
参数:保留原始数据的非聚合字段
attributes
参数用于指定哪些字段需要原封不动地保留在 Rollup 结果中。这些字段不会被聚合,而是直接复制到目标索引中。
示例:
"attributes": [
"agent.*",
"metadata.*"
]
在这个例子中,attributes
指定了所有以 agent.
和 metadata.
开头的字段都会被保留到 Rollup 结果中。
3. exclude
参数:排除不需要处理的字段
exclude
参数用于排除某些字段,使其不参与 Rollup 任务。这些字段既不会被聚合,也不会被保留到目标索引中。
示例:
"exclude": ["payload.elasticsearch.index_stats.routing.*"]
在这个例子中,exclude
指定了 payload.elasticsearch.index_stats.routing
下的所有字段都不会被处理。
4. filter
参数:过滤源数据
filter
参数用于过滤源数据,只有符合过滤条件的文档才会被 Rollup 任务处理。这个参数可以帮助你减少需要处理的数据量,从而提高 Rollup 任务的效率。
示例:
"filter": {
"metadata.name": "index_stats"
}
在这个例子中,filter
指定了只有 metadata.name
字段值为 index_stats
的文档才会被 Rollup 任务处理。
5. identity
参数:定义分组字段
identity
参数用于指定哪些字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。
功能:
- 定义数据分组的字段。
- 支持多个字段的组合,用于创建唯一的分组键。
- 常用于标识数据的来源或类别。
示例:
"identity": [
"metadata.labels.cluster_id",
"metadata.labels.index_id",
"metadata.labels.index_name",
"metadata.category",
"payload.elasticsearch.index_stats.index_info.health"
]
在这个例子中,identity
指定了多个字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。
6. interval
参数:定义时间聚合间隔
interval
参数用于指定时间聚合的间隔。Rollup 任务会根据这个间隔将数据按时间分桶,然后在每个时间桶内进行聚合计算。
功能:
- 定义时间聚合的粒度。
- 支持多种时间单位,如
1m
(1 分钟)、1h
(1 小时)、1d
(1 天)等。 - 常用于按时间维度汇总数据。
示例:
"interval": "1m"
在这个例子中,interval
指定了时间聚合的间隔为 1 分钟。Rollup 任务会每分钟对数据进行一次聚合。
1.10 版本的新特性
从 Easysearch 1.10.0 版本开始,Rollup 功能引入了一些新特性,进一步增强了其灵活性和易用性。
1. 支持 date_range
聚合
在 1.10.0 版本中,Rollup 增加了对 原始索引使用 date_range
聚合的支持。这意味着你可以在原始索引根据日期范围对数据进行聚合,而不仅仅是固定的时间间隔。
示例:
"date_range": {
"field": "@timestamp",
"ranges": [
{ "from": "now-1d/d", "to": "now" },
{ "from": "now-7d/d", "to": "now-1d/d" }
]
}
2. 通配符方式批量启动/停止 Rollup Job
在 1.10.0 版本中,你可以使用通配符批量启动或停止 Rollup 任务。这大大简化了任务管理的操作。
示例:
POST _rollup/jobs/rollup*/_start
POST _rollup/jobs/rollup*/_stop
3. 设置 Rollup 索引自动滚动的条数
你可以通过设置 rollup.max_docs
参数,控制 Rollup 索引自动滚动的条数。当索引中的文档数量达到设定值时,系统会自动创建一个新的 Rollup 索引。
示例:
PUT /_cluster/settings
{
"transient": {
"rollup.max_docs": 10000000
}
}
4. 新增 ROLLUP_SEARCH_MAX_COUNT
配置
在 1.10.0 版本中,新增了 ROLLUP_SEARCH_MAX_COUNT
配置项,用于控制 Rollup 在运行 Job 时收集历史数据的最大并发分片请求数。这个配置项可以帮助你优化 Rollup 任务的性能,并避免集群资源过载。
功能:
- 控制并发请求数:限制 Rollup 任务在执行搜索请求时的最大并发分片请求数。
- 动态调整:支持在集群运行时动态调整,无需重启集群。
- 默认值:
2
,即默认情况下,Rollup 任务最多会同时发送 2 个并发分片请求。
示例:
PUT /_cluster/settings
{
"transient": {
"rollup.search.max_count": 2
}
}
在这个例子中,ROLLUP_SEARCH_MAX_COUNT
被设置为 2
,表示 Rollup 任务在执行搜索请求时,最多会同时发送 2 个并发分片请求。
配置建议:
- 小规模集群:建议设置为较小的值(如
2
),以避免资源竞争。 - 大规模集群:可以适当增加该值(如
4
),以提高并发性能。 - 动态调整:根据集群负载情况动态调整该值,以优化性能和资源利用率。
创建 Rollup 任务的完整示例
以下是一个完整的 Rollup 任务配置示例,展示了 metrics
、attributes
、exclude
和 filter
参数的综合使用:
PUT _rollup/jobs/rollup1
{
"rollup": {
"source_index": ".infini_metrics",
"target_index": "rollup1_{{ctx.source_index}}",
"timestamp": "timestamp",
"continuous": true,
"page_size": 1000,
"cron": "*/10 1-23 * * *",
"timezone": "UTC+8",
"stats": [
{
"max": {}
},
{
"value_count": {}
}
],
"interval": "1m",
"identity": [
"metadata.labels.cluster_id",
"metadata.labels.index_id",
"metadata.labels.index_name",
"metadata.category",
"payload.elasticsearch.index_stats.index_info.health"
],
"attributes": [
"agent.*",
"metadata.*"
],
"metrics": [
"payload.elasticsearch.index_stats.*"
],
"exclude": ["payload.elasticsearch.index_stats.routing.*"],
"filter": {
"metadata.name": "index_stats"
}
}
}
如何使用 Rollup 索引
从 1.10.0 版本开始,索引生命周期插件不再默认启用 rollup 搜索功能,如果想使用搜索 rollup 搜索功能,需要设置
PUT /_cluster/settings
{
"transient": {
"rollup.search.enabled": true
}
}
无需特意搜索 rollup 索引,只需使用标准的 _search API 对原始目标索引进行搜索。需要注意的是,查询时必须符合目标索引的约束条件。
以下是一个使用 Rollup 索引的示例:
GET target-test/_search
{
"size": 0,
"aggs": {
"a": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1h"
}
},
"total_passenger_count": {
"sum": {
"field": "passenger_count"
}
}
}
}
总结
Rollup 是处理时序数据的强大工具,能够有效降低存储成本并提高查询性能。Easysearch 的 Rollup 功能不仅支持多种聚合类型,还提供了自动滚动索引、无缝查询等特性,极大地简化了时序数据的管理和分析流程。通过合理配置 metrics
、attributes
、exclude
和 filter
参数,你可以灵活地控制 Rollup 任务的行为,从而高效地处理时序数据。
如果你正在处理大量的时序数据,不妨尝试使用 Rollup 来优化你的数据存储和查询。通过本文的介绍,相信你已经对 Rollup 有了深入的了解。赶快动手试试吧,体验 Rollup 带来的高效与便捷!
更详细的使用文档可在 官网 查看
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。