背景
在現代數據驅動的世界中,時序數據的處理變得越來越重要。無論是監控系統、日誌分析,還是物聯網設備的數據收集,時序數據都佔據了大量的存儲空間。隨着時間的推移,這些數據的存儲成本和管理複雜度也在不斷增加。
為了解決這一問題,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 產品的研發以及客户服務工作。