--- title: "Easysearch Rollup 使用指南" date: 2025-01-11 lastmod: 2025-01-11 description: "Rollup技术可有效处理时序数据,降低存储成本并提升查询性能。Easysearch的Rollup功能支持多种聚合类型和自动管理,适用于监控、日志分析及物联网数据场景,简化时序数据管理和分析流程。" tags: ["Easysearch", "rollup", "performance"] summary: "背景 # 在现代数据驱动的世界中,时序数据的处理变得越来越重要。无论是监控系统、日志分析,还是物联网设备的数据收集,时序数据都占据了大量的存储空间。随着时间的推移,这些数据的存储成本和管理复杂度也在不断增加。 为了解决这一问题,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。" --- ## 背景 在现代数据驱动的世界中,时序数据的处理变得越来越重要。无论是监控系统、日志分析,还是物联网设备的数据收集,时序数据都占据了大量的存储空间。随着时间的推移,这些数据的存储成本和管理复杂度也在不断增加。 为了解决这一问题,**Rollup** 技术应运而生。本文将带你深入了解 Rollup 的概念、优势以及如何在 Easysearch 中使用 Rollup 来优化时序数据的存储和查询。 --- ## 什么是 Rollup? Rollup 是一种数据聚合技术,主要用于处理时序数据。它通过将细粒度的原始数据汇总为粗粒度的数据,从而减少存储空间并提高查询效率。简单来说,Rollup 可以将大量的详细数据压缩为更小的、更具代表性的数据集,同时保留关键的业务指标。 ### Rollup 的优势 1. **降低存储成本**:通过汇总数据,Rollup 可以显著减少历史数据的存储空间,从而降低存储成本。 2. **提高查询性能**:汇总后的数据量更小,查询速度更快,尤其是在处理大规模历史数据时,性能提升尤为明显。 3. **无缝集成**:Easysearch 的 Rollup 功能支持直接查询原始索引,业务代码无需修改,用户无感知。 4. **自动化管理**: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`),并将结果存储到目标索引中。 #### 示例: ```json "metrics": [ "payload.elasticsearch.index_stats.*" ] ``` 在这个例子中,`metrics` 指定了对 `payload.elasticsearch.index_stats` 下的所有字段进行聚合。 --- ### 2. **`attributes` 参数:保留原始数据的非聚合字段** `attributes` 参数用于指定哪些字段需要原封不动地保留在 Rollup 结果中。这些字段不会被聚合,而是直接复制到目标索引中。 #### 示例: ```json "attributes": [ "agent.*", "metadata.*" ] ``` 在这个例子中,`attributes` 指定了所有以 `agent.` 和 `metadata.` 开头的字段都会被保留到 Rollup 结果中。 --- ### 3. **`exclude` 参数:排除不需要处理的字段** `exclude` 参数用于排除某些字段,使其不参与 Rollup 任务。这些字段既不会被聚合,也不会被保留到目标索引中。 #### 示例: ```json "exclude": ["payload.elasticsearch.index_stats.routing.*"] ``` 在这个例子中,`exclude` 指定了 `payload.elasticsearch.index_stats.routing` 下的所有字段都不会被处理。 --- ### 4. **`filter` 参数:过滤源数据** `filter` 参数用于过滤源数据,只有符合过滤条件的文档才会被 Rollup 任务处理。这个参数可以帮助你减少需要处理的数据量,从而提高 Rollup 任务的效率。 #### 示例: ```json "filter": { "metadata.name": "index_stats" } ``` 在这个例子中,`filter` 指定了只有 `metadata.name` 字段值为 `index_stats` 的文档才会被 Rollup 任务处理。 --- ### 5. **`identity` 参数:定义分组字段** `identity` 参数用于指定哪些字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。 #### 功能: - 定义数据分组的字段。 - 支持多个字段的组合,用于创建唯一的分组键。 - 常用于标识数据的来源或类别。 #### 示例: ```json "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 天)等。 - 常用于按时间维度汇总数据。 #### 示例: ```json "interval": "1m" ``` 在这个例子中,`interval` 指定了时间聚合的间隔为 1 分钟。Rollup 任务会每分钟对数据进行一次聚合。 --- ## 1.10 版本的新特性 从 Easysearch 1.10.0 版本开始,Rollup 功能引入了一些新特性,进一步增强了其灵活性和易用性。 ### 1. **支持 `date_range` 聚合** 在 1.10.0 版本中,Rollup 增加了对 原始索引使用 `date_range` 聚合的支持。这意味着你可以在原始索引根据日期范围对数据进行聚合,而不仅仅是固定的时间间隔。 #### 示例: ```json "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 任务。这大大简化了任务管理的操作。 #### 示例: ```json POST _rollup/jobs/rollup*/_start POST _rollup/jobs/rollup*/_stop ``` --- ### 3. **设置 Rollup 索引自动滚动的条数** 你可以通过设置 `rollup.max_docs` 参数,控制 Rollup 索引自动滚动的条数。当索引中的文档数量达到设定值时,系统会自动创建一个新的 Rollup 索引。 #### 示例: ```json 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 个并发分片请求。 #### 示例: ```json PUT /_cluster/settings { "transient": { "rollup.search.max_count": 2 } } ``` 在这个例子中,`ROLLUP_SEARCH_MAX_COUNT` 被设置为 `2`,表示 Rollup 任务在执行搜索请求时,最多会同时发送 2 个并发分片请求。 #### 配置建议: - **小规模集群**:建议设置为较小的值(如 `2`),以避免资源竞争。 - **大规模集群**:可以适当增加该值(如 `4`),以提高并发性能。 - **动态调整**:根据集群负载情况动态调整该值,以优化性能和资源利用率。 --- ## 创建 Rollup 任务的完整示例 以下是一个完整的 Rollup 任务配置示例,展示了 `metrics`、`attributes`、`exclude` 和 `filter` 参数的综合使用: ```auto 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 搜索功能,需要设置 ```auto PUT /_cluster/settings { "transient": { "rollup.search.enabled": true } } ``` 无需特意搜索 rollup 索引,只需使用标准的 \_search API 对原始目标索引进行搜索。需要注意的是,查询时必须符合目标索引的约束条件。 以下是一个使用 Rollup 索引的示例: ```auto 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 带来的高效与便捷! **更详细的使用文档可在 [官网](https://docs.infinilabs.com/easysearch/main/docs/references/management/rollup_api/) 查看**