全部產品
Search
文件中心

Elasticsearch:通過RollUp實現流量匯總最佳實務

更新時間:Jun 30, 2024

對於時序資料情境,隨著時間的積累資料量會越來越大。如果一直保留詳細資料,會導致儲存成本線性增長,此時您可以通過Elasticsearch(簡稱ES)的RollUp機制節省資料存放區成本。本文以匯總Logstash流量為例介紹RollUp的使用方法。

前提條件

  • 確保您已擁有manage或manage_rollup許可權。

    使用RollUp必須要有manage或manage_rollup許可權,詳情請參見Security Privileges

  • 已建立阿里雲ES執行個體。
    詳情請參見建立Elasticsearch執行個體,本文使用的執行個體版本為通用商業版7.4。
    說明 下文中的RollUp命令適用於ES 7.4版本,6.x版本的命令請參見RollUp Job

背景資訊

本文的需求情境如下:
  • 每15分鐘定時匯總整小時內instanceId的networkoutTraffic、networkinTraffic流量。
  • 通過Kibana大圖展示指定instanceId的入口流量和出口流量。
本文以monitordata-logstash-sls-*為首碼的索引為例,該索引以每天建立一個索引的規則切分索引。索引的Mapping格式如下。
"monitordata-logstash-sls-2020-04-05" : {
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        },
        "__source__" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "disk_type" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "host" : {
          "type" : "keyword"
        },
        "instanceId" : {
          "type" : "keyword"
        },
        "metricName" : {
          "type" : "keyword"
        },
        "monitor_type" : {
          "type" : "keyword"
        },
        "networkinTraffic" : {
          "type" : "double"
        },
        "networkoutTraffic" : {
          "type" : "double"
        },
        "node_spec" : {
          "type" : "keyword"
        },
        "node_stats_node_master" : {
          "type" : "keyword"
        },
        "resource_uid" : {
          "type" : "keyword"
        }
      }
    }
  }
}
說明 本文中的命令均可在Kibana控制台上執行,詳情請參見登入Kibana控制台

操作流程

  1. 步驟一:建立RollUp作業
  2. 步驟二:啟動RollUp作業並查看作業資訊
  3. 步驟三:查詢匯總索引的資料
  4. 步驟四:建立Rollup索引模式
  5. 步驟五:建立Kibana流量監控大圖
  6. 步驟六:建立Kibana流量監控儀表板

步驟一:建立RollUp作業

RollUp作業配置包含該作業如何運行、何時索引文檔及將來對匯總索引執行哪些查詢的詳情資訊。以下樣本通過PUT _rollup/job命令定義1小時內匯總的作業。
PUT _rollup/job/ls-monitordata-sls-1h-job1
{
    "index_pattern": "monitordata-logstash-sls-*",
    "rollup_index": "monitordata-logstash-rollup-1h-1",
    "cron": "0 */15 * * * ?",
    "page_size" :1000,
    "groups" : {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "1h"
      },
      "terms": {
        "fields": ["instanceId"]
      }
    },
    "metrics": [
        {
            "field": "networkoutTraffic",
            "metrics": ["sum"]
        },
        {
            "field": "networkinTraffic",
            "metrics": ["sum"]
        }
    ]
}
參數 是否必選 類型 說明
index_pattern string 匯總的索引或索引模式。支援萬用字元(*)。
rollup_index string 匯總結果的索引。不支援萬用字元,必須是一個完整的名稱。
cron string 執行匯總作業任務的時間間隔。與摘要資料的時間間隔無關。
page_size integer 匯總索引每次迭代中處理的儲存桶的結果數。值越大,執行越快,但是處理過程中需要更多的記憶體。
groups object 為匯總工作定義分組欄位和彙總。
date_histogram object 將date欄位匯總到基於時間的儲存桶中。
field string 需要匯總的date欄位。
fixed_interval time units 資料匯總的時間間隔。例如設定為1h,表示按照1小時匯總field指定的時間欄位。該參數定義了資料能夠彙總的最小時間間隔。
terms object 無。
fields string 定義terms欄位集。此數組欄位可以是keyword也可以是numerics類型,無順序要求。
metrics object 無。
field string 定義需要採集的指標的欄位。例如以上樣本是分別對networkoutTraffic、networkinTraffic進行採集。
metrics array 定義彙總運算元。設定為sum,表示對networkinTraffic進行sum運算。僅支援min、max、sum、average、value count。
說明 └表示子參數。
更多參數說明請參見Create rollup jobs API。配置參數時,請注意:
  • index_pattern中指定萬用字元時,請確保不會匹配到rollup_index指定的匯總索引名,否則報錯。
  • 由於匯總索引的Mapping是object類型,請確保叢集中不存在與匯總索引相匹配的索引模板,否則報錯。
  • 欄位分組彙總僅支援Date Histogram aggregation、Histogram aggregation、Terms aggregation,詳細限制說明請參見Rollup aggregation limitations

步驟二:啟動RollUp作業並查看作業資訊

  1. 啟動RollUp作業。
    POST _rollup/job/ls-monitordata-sls-1h-job1/_start
  2. 查看RollUp作業的配置、統計和狀態資訊。
    GET _rollup/job/ls-monitordata-sls-1h-job1/

    更多詳細說明請參見Get rollup jobs API

    執行成功後,返回如下結果。
    {
         ........
          "status" : {
            "job_state" : "indexing",
            "current_position" : {
              "@timestamp.date_histogram" : 1586775600000,
              "instanceId.terms" : "ls-cn-ddddez****"
            },
            "upgraded_doc_id" : true
          },
          "stats" : {
            "pages_processed" : 3,
            "documents_processed" : 11472500,
            "rollups_indexed" : 3000,
            "trigger_count" : 1,
            "index_time_in_ms" : 766,
            "index_total" : 3,
            "index_failures" : 0,
            "search_time_in_ms" : 68559,
            "search_total" : 3,
            "search_failures" : 0
          }
    }

步驟三:查詢匯總索引的資料

在Rollup內部,由於匯總文檔使用的文檔結構和未經處理資料不同,Rollup查詢連接埠會將標準查詢DSL重寫為與匯總文檔匹配的格式,然後擷取響應並將其重寫回給原始查詢的用戶端所期望的格式。

  1. 使用match_all擷取匯總索引的所有資料。
    GET monitordata-logstash-rollup-1h-1/_search
    {
      "query": {
        "match_all": {}
      }
    }
    • 查詢僅能指定一個匯總索引,即不支援模糊比對。對即時索引資料查詢沒有限制要求,查詢可指定多個索引。
    • 查詢僅支援Term、Terms、Range query、MatchAll query、Any compound query(Boolean、Boosting、ConstantScore等),更多限制請參見Rollup search limitations
  2. 使用_rollup_search彙總出口流量總資料。
    GET /monitordata-logstash-rollup-1h-1/_rollup_search
    {
        "size": 0,
        "aggregations": {
            "sum_temperature": {
                "sum": {
                    "field": "networkoutTraffic"
                }
            }
        }
    }
    _rollup_search支援常規的Search API特性子集:
    _rollup_search不可用功能包括:
    • size:由於匯總適用於彙總資料,無法返回查詢結果,因此將size設定為0或者完全省略。
    • 不支援highlighter、suggestors、post_filter、profile、explain等參數。

步驟四:建立Rollup索引模式

  1. 登入Kibana控制台。
    登入控制台的具體步驟請參見登入Kibana控制台
  2. 在左側導覽列,單擊Management表徵圖。
    Management表徵圖
  3. Kibana地區,單擊Index Patterns
  4. 可選:關閉About index patterns頁面。
    說明 如果您不是首次建立索引模式,可忽略此步驟。
  5. 單擊Create index pattern > Rollup index pattern
    Rollup index pattern
  6. 輸入索引模式名稱(monitordata-logstash-rollup-1h-1),然後單擊Next step
    輸入索引名稱
  7. Time Filter field name列表中,選擇@timestamp
    選擇時間過濾欄位
  8. 單擊Create index pattern

步驟五:建立Kibana流量監控大圖

在Kibana上分別配置匯總索引的入口流量及出口流量監控大圖,操作步驟如下:

  1. 登入Kibana控制台。
    登入控制台的具體步驟請參見登入Kibana控制台
  2. 建立Line曲線圖。
    1. 在左側導覽列,單擊Visualize表徵圖。
      Visualize表徵圖
    2. 單擊Create new visualization
    3. New Visualization對話方塊中,單擊Line
    4. 在索引模式列表中,單擊選擇已建立的Rollup索引模式。
  3. 設定MetricsBuckets
    1. Metrics地區,單擊Y-axi下拉式箭頭
    2. 設定Y-axis參數。
      Y-axis參數
      參數 說明
      Aggregation 選擇Sum
      Field 選擇networkinTraffic或networkoutTraffic。
      Custom label 自訂Y軸標籤。
    3. Buckets地區,單擊Add > X-axis
    4. 設定X-axis參數。
      設定x-axis參數
      參數 說明
      Aggregation 設定為步驟一:建立RollUp作業時,group中定義的date_histogram
      Field 選擇@timestamp
      Minimum interval 預設為RollUp作業中定義的彙總時間粒紋。必須是匯總配置間隔的整數倍,例如2h、3h等。
    5. 單擊Apply Changes表徵圖表徵圖。
  4. 在頂部功能表列,單擊Save
    配置成功後,可看到如下結果。Line圖
  5. 使用同樣的方式建立Gauge圖。
    建立Gauge圖
  6. 參考下圖配置Gauge圖。
    配置Guage圖

步驟六:建立Kibana流量監控儀表板

  1. 在Kibana控制台中,單擊左側導覽列的Dashboard表徵圖。
    Dashboard表徵圖
  2. 單擊Create new dashboard
  3. 在頂部功能表列,單擊Add
  4. Add panels頁面,單擊選擇Visualize中配置的可視化大圖。
  5. 關閉Add panels頁面,在頂部功能表列,單擊Save
  6. 修改儀表板名稱,單擊Confirm Save
    儀表板儲存成功後,可查看儀表板展示結果。查看Kibana儀表板
  7. 單擊+ Add filter,選擇一個過濾項並配置過濾條件,單擊Save
    本文使用term過濾項,指定查詢某個instance的流量,最終結果如下。展示某個instance的流量